Tổng hợp dữ liệu từ nhiều sheet theo điều kiện

Liên hệ QC

BuiQuangThuan

❆❆❆❆❆❆❆❆❆❆❆❆
Tham gia
17/12/10
Bài viết
2,477
Được thích
2,933
Giới tính
Nam
Chào các thầy cô ạ.
Em có 1 file gồm nhiều sheet.
Những sheet muốn tổng hợp đều có chung cấu trúc giống nhau
Giờ muốn tổng hợp dữ liệu từ nhiều sheet về 1 sheet theo lấy những thông tin cần thiết theo điều kiện.
Em có trình bày trong file đính kèm.
Mong các anh chị, thầy cô giúp đỡ ạ
 

File đính kèm

  • TongHop.xlsb
    28.8 KB · Đọc: 32
Chào các thầy cô ạ.
Em có 1 file gồm nhiều sheet.
Những sheet muốn tổng hợp đều có chung cấu trúc giống nhau
Giờ muốn tổng hợp dữ liệu từ nhiều sheet về 1 sheet theo lấy những thông tin cần thiết theo điều kiện.
Em có trình bày trong file đính kèm.
Mong các anh chị, thầy cô giúp đỡ ạ
Sử dụng code gộp sheet rồi Filter từ ngày đến ngày là cách dễ dàng nhất.
Tôi nhận thấy trên diễn đàn GPE sao nhiều thành viên thích chơi kiểu theo dõi nhiều sheet.
Theo tôi thì chỉ nên sử dụng SheetForm để nhâp liệu vào sheet Theo dõi, muốn là cái gì đó thì Filter hoặc dùng code tách sheet sau đó thì xóa sheet đã tách.
 
Upvote 0
Sử dụng code gộp sheet rồi Filter từ ngày đến ngày là cách dễ dàng nhất.
Tôi nhận thấy trên diễn đàn GPE sao nhiều thành viên thích chơi kiểu theo dõi nhiều sheet.
Theo tôi thì chỉ nên sử dụng SheetForm để nhâp liệu vào sheet Theo dõi, muốn là cái gì đó thì Filter hoặc dùng code tách sheet sau đó thì xóa sheet đã tách.
Vì thói quen mọi thứ thích bày ra nhìn thấy được phân biệt được bằng mắt
Và thêm vào đó Excel thiếu chặt chẽ trong quản lý dạng cơ sở dữ liệu, nên cho phép người dùng đa dạng
 
Upvote 0
Vì thói quen mọi thứ thích bày ra nhìn thấy được phân biệt được bằng mắt
Và thêm vào đó Excel thiếu chặt chẽ trong quản lý dạng cơ sở dữ liệu, nên cho phép người dùng đa dạng
Cám ơn anh và thầy @be09 . Ngặt nỗi cái File mà bên nhật họ yêu cầu nhập như vậy rồi. Mà tuần nào cũng bắt báo cáo theo kiểu từ ngày này đến ngày này. Sheet thì nhiều tới tận 19, 20 sheet. Nhiều lúc tổng hợp mà em muốn bỏ việc luôn á
 
Upvote 0
Cám ơn anh và thầy @be09 . Ngặt nỗi cái File mà bên nhật họ yêu cầu nhập như vậy rồi. Mà tuần nào cũng bắt báo cáo theo kiểu từ ngày này đến ngày này. Sheet thì nhiều tới tận 19, 20 sheet. Nhiều lúc tổng hợp mà em muốn bỏ việc luôn á
Thế thì có lương, có trả tiền làm việc đó, cứ bình tĩnh làm là xong thôi. Không có việc gì khó chỉ sợ $ không có
Tuy thế không nhất thiết phụ thuộc họ, ta có thể tổng hợp riêng rồi báo cáo theo mẫu của họ.
Bài đã được tự động gộp:

trong file:
-muốn duyệt qua tên sheet dựa theo tập hợp cho sẵn

Tập cho sẵn ở đâu (cho là ai cho và ở đâu)?
 
Lần chỉnh sửa cuối:
Upvote 0
Nó là điển hình trường hợp "bắt mèo ăn ***" thôi.
Theo như trình tự công việc của thớt thì Excel không phải là công cụ thích hợp.
Muốn dùng Excel thì phải tự chỉnh trình tự công việc.
Bây giờ chỉnh thì không chỉnh, Excel thì vẫn muốn dùng thì bắt buộc phải dùng cái thằng thứ ba là VBA để uốn để nắn.

(*) Mình thấy lạ ở chỗ thằng sếp ta mà khó thì chửi sếp ngu sếp dốt đủ thứ. Thằng sếp Tây sếp Nhật thì chẳng thấy ai nói gì. Người ta chỉ than khó làm mà không bao giờ đặt câu hỏi cho kghar năng thnawgf sếp Tây/Nhật.
 
Upvote 0
Nó là điển hình trường hợp "bắt mèo ăn ***" thôi.
Theo như trình tự công việc của thớt thì Excel không phải là công cụ thích hợp.
Muốn dùng Excel thì phải tự chỉnh trình tự công việc.
Bây giờ chỉnh thì không chỉnh, Excel thì vẫn muốn dùng thì bắt buộc phải dùng cái thằng thứ ba là VBA để uốn để nắn.

(*) Mình thấy lạ ở chỗ thằng sếp ta mà khó thì chửi sếp ngu sếp dốt đủ thứ. Thằng sếp Tây sếp Nhật thì chẳng thấy ai nói gì. Người ta chỉ than khó làm mà không bao giờ đặt câu hỏi cho kghar năng thnawgf sếp Tây/Nhật.
Không phải, vì sếp tây nó coi mình là công nhân bậc cao,
người Việt: được trả lương làm việc đó, thắc mắc chi để nhanh thêm việc khác
Tôi như người làm: thì cứ bình tĩnh mà làm, code keo làm chi, nhanh ... rồi lại ngồi chơi ah (mà ngồi chơi thì người ta giao việc khác)
 
Upvote 0
cám ơn các thầy cô ạ. Ngồi loay hoay. Nhờ các thầy cô coi giúp em đoạn code này có gì sai không ạ
Mã:
Option Explicit

Sub ThongKe()
  Dim Ws As Worksheet, TenSheet As String, LR&, Arr(), KQ, R&, I&, K&
  Dim DK1&, DK2&, LR1
  TenSheet = "#A#B#C#D#"
  DK1 = Sheets("THONGKE").Range("B1").Value
  DK2 = Sheets("THONGKE").Range("D1").Value
 
  For Each Ws In Worksheets
  LR1 = Sheets("THONGKE").Range("A" & Rows.Count).End(xlUp).Row + 1
    If InStr(1, TenSheet, "#" & Ws.Name & "#") > 0 Then
        LR = Ws.Range("A" & Rows.Count).End(xlUp).Row
        Arr = Ws.Range("A9:I" & LR).Value
        R = UBound(Arr, 1)
        ReDim KQ(1 To R, 1 To 5)
        For I = 1 To R
        If CLng(Right(Arr(I, 1), 2)) >= DK1 Then
            If CLng(Right(Arr(I, 1), 2)) <= DK2 Then
                K = K + 1
                KQ(K, 1) = Ws.Name & "-" & Arr(I, 4)
                KQ(K, 2) = Arr(I, 5)
                KQ(K, 3) = Arr(I, 6)
                KQ(K, 4) = Arr(I, 8)
                KQ(K, 5) = Arr(I, 9)
            End If
        End If
        Next
        If K Then Sheets("THONGKE").Range("A" & LR1).Resize(K, 5).Value = KQ
        K = 0
        Erase Arr
        Set KQ = Nothing
    End If
  Next
  End Sub
Và cần phải sửa chỗ nào nữa không chỉ cho em với
Em xin cám ơn
 
Upvote 0
cám ơn các thầy cô ạ. Ngồi loay hoay. Nhờ các thầy cô coi giúp em đoạn code này có gì sai không ạ
Mã:
Option Explicit

Sub ThongKe()
  Dim Ws As Worksheet, TenSheet As String, LR&, Arr(), KQ, R&, I&, K&
  Dim DK1&, DK2&, LR1
  TenSheet = "#A#B#C#D#"
  DK1 = Sheets("THONGKE").Range("B1").Value
  DK2 = Sheets("THONGKE").Range("D1").Value

  For Each Ws In Worksheets
  LR1 = Sheets("THONGKE").Range("A" & Rows.Count).End(xlUp).Row + 1
    If InStr(1, TenSheet, "#" & Ws.Name & "#") > 0 Then
        LR = Ws.Range("A" & Rows.Count).End(xlUp).Row
        Arr = Ws.Range("A9:I" & LR).Value
        R = UBound(Arr, 1)
        ReDim KQ(1 To R, 1 To 5)
        For I = 1 To R
        If CLng(Right(Arr(I, 1), 2)) >= DK1 Then
            If CLng(Right(Arr(I, 1), 2)) <= DK2 Then
                K = K + 1
                KQ(K, 1) = Ws.Name & "-" & Arr(I, 4)
                KQ(K, 2) = Arr(I, 5)
                KQ(K, 3) = Arr(I, 6)
                KQ(K, 4) = Arr(I, 8)
                KQ(K, 5) = Arr(I, 9)
            End If
        End If
        Next
        If K Then Sheets("THONGKE").Range("A" & LR1).Resize(K, 5).Value = KQ
        K = 0
        Erase Arr
        Set KQ = Nothing
    End If
  Next
  End Sub
Và cần phải sửa chỗ nào nữa không chỉ cho em với
Em xin cám ơn
Code khá hay, hình như chưa xóa kết quả trước và sheet "C" thứ tự cột khác, code có thể tiêu khi ô B1 và D1 nhập lung tung
 
Upvote 0
Dim Ws As Worksheet, TenSheet As String, LR&, Arr(), KQ, R&, I&, K& ' bắt đầu, khai báo
...KQ(K, 2) = Arr(I, 5) ' sử dụng
...Erase Arr : Set KQ = Nothing ' cuối cùng

Trước mắt thì tôi thấy 2 thằng xanh đỏ trên đồng loại nhau. Tại sao khai báo khác nhau và được đối xử khác nhau ở đoạn cuối vây?
 
Upvote 0
Dim Ws As Worksheet, TenSheet As String, LR&, Arr(), KQ, R&, I&, K& ' bắt đầu, khai báo
...KQ(K, 2) = Arr(I, 5) ' sử dụng
...Erase Arr : Set KQ = Nothing ' cuối cùng

Trước mắt thì tôi thấy 2 thằng xanh đỏ trên đồng loại nhau. Tại sao khai báo khác nhau và được đối xử khác nhau ở đoạn cuối vây?
Cháu không biết ạ. Tại mấy lần nhìn thấy các thầy cô trên này viết tắt thế. Nên cháu cũng viết thế. Chú có thể giải thích cặn kẽ cho cháu được không ạ. Và phải viết như thế nào mới đúng ạ
 
Upvote 0
Dim Ws As Worksheet, TenSheet As String, LR&, Arr(), KQ, R&, I&, K& ' bắt đầu, khai báo
...KQ(K, 2) = Arr(I, 5) ' sử dụng
...Erase Arr : Set KQ = Nothing ' cuối cùng

Trước mắt thì tôi thấy 2 thằng xanh đỏ trên đồng loại nhau. Tại sao khai báo khác nhau và được đối xử khác nhau ở đoạn cuối vây?
:<>. Trong văn KQ ban khai báo như vậy là variant
 
Upvote 0
Nothing là không có gì, giống như biến string str là 'A' nothing giống như str=''.
 
Upvote 0
Cháu không biết ạ. Tại mấy lần nhìn thấy các thầy cô trên này viết tắt thế. Nên cháu cũng viết thế. Chú có thể giải thích cặn kẽ cho cháu được không ạ. Và phải viết như thế nào mới đúng ạ
Ý bác VetMini là cả Arr và KQ thực ra là mảng, vậy tại sao chỉ khai báo Arr là mảng còn KQ là Variant.

Erase và Set ... thực ra không cần thiết làm trong vòng lặp FOR. Thậm chí sau vòng FOR cũng không cần thiết vì Arr và KQ (giả sử khai báo là mảng) đều là biến local nên trước khi ra khỏi sub bộ nhớ dành cho chúng được giải phóng. Trường hợp biến mảng động là global thì khi nào thấy không còn cần tới mảng động nữa thì giải phóng. Nếu cần suốt thì không giải phóng. Khi nào đóng tập tin thì "người ta" (Memory Manager) sẽ giải phóng.

Nếu KQ là Variant thì KQ = Empty thôi chứ dùng Set cũng được nhưng không chuẩn, vì KQ không là Object.

Với mỗi sheet nên kiểm tra xem có dữ liệu hay không. Nếu sheet không có dữ liệu thì R = 1, Arr(I, 1) = "NGÀY THÁNG" (I = 1) nên CLng(Right(Arr(I, 1), 2)) sé có lỗi vì CLng(Right(Arr(I, 1), 2)) = CLng("NG") -> lỗi.
 
Upvote 0
Ý bác VetMini là cả Arr và KQ thực ra là mảng, vậy tại sao chỉ khai báo Arr là mảng còn KQ là Variant.

Erase và Set ... thực ra không cần thiết làm trong vòng lặp FOR. Thậm chí sau vòng FOR cũng không cần thiết vì Arr và KQ (giả sử khai báo là mảng) đều là biến local nên trước khi ra khỏi sub bộ nhớ dành cho chúng được giải phóng. Trường hợp biến mảng động là global thì khi nào thấy không còn cần tới mảng động nữa thì giải phóng. Nếu cần suốt thì không giải phóng. Khi nào đóng tập tin thì "người ta" (Memory Manager) sẽ giải phóng.

Nếu KQ là Variant thì KQ = Empty thôi chứ dùng Set cũng được nhưng không chuẩn, vì KQ không là Object.

Với mỗi sheet nên kiểm tra xem có dữ liệu hay không. Nếu sheet không có dữ liệu thì R = 1, Arr(I, 1) = "NGÀY THÁNG" (I = 1) nên CLng(Right(Arr(I, 1), 2)) sé có lỗi vì CLng(Right(Arr(I, 1), 2)) = CLng("NG") -> lỗi.
Cái zu memory là đúng chuyên môn của anh @batman1. Hihihi
 
Upvote 0
Với mỗi sheet nên kiểm tra xem có dữ liệu hay không. Nếu sheet không có dữ liệu thì R = 1, Arr(I, 1) = "NGÀY THÁNG" (I = 1) nên CLng(Right(Arr(I, 1), 2)) sé có lỗi vì CLng(Right(Arr(I, 1), 2)) = CLng("NG") -> lỗi.
Cám ơn thầy ạ. Thầy có thể chỉ em cách IF để cho chặt chẽ được không ạ
Và theo như thầy hướng dẫn thì nếu là object thì mới cần set phải không ạ. còn lại thì chỉ cần đưa biến bất kỳ = empty là được ạ
 
Upvote 0
Web KT
Back
Top Bottom