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

Liên hệ QC

leonguyenz

Thành viên gạo cội
Thành viên BQT
Moderator
Tham gia
2/8/10
Bài viết
5,218
Được thích
9,002
Giới tính
Nam
File dữ liệu có nhiều sheet, em muốn tổng hợp 3 vùng dữ liệu đã được đặt name động, với cột đầu là mã sp, cột cuối là số lượng. các vùng có kích thước khác nhau. Tổng hợp về mã sp duy nhất có số lượng >0.
Xin các thầy giúp !
 

File đính kèm

  • Code tong hop du lieu theo dieu kien.xlsx
    11.9 KB · Đọc: 31
File dữ liệu có nhiều sheet, em muốn tổng hợp 3 vùng dữ liệu đã được đặt name động, với cột đầu là mã sp, cột cuối là số lượng. các vùng có kích thước khác nhau. Tổng hợp về mã sp duy nhất có số lượng >0.
Xin các thầy giúp !
Má ơi, sao có kiểu lọc gì oái oăm thế này
Mới nghĩ được thế này thôi, bi giờ thấy đói bụng & thèm b.... quá
Yêu cầu duy nhất: Các name (cục cựa hay im ru) của vùng dữ liệu lọc phải có tên ....trùng với tên sheet đó nhé ( Híc, cái này chơi ép quá). Trong file vùng lọc trong sheet "dulieu1" có tên là "Dulieu1", trong sheet "dulieu2" có tên là "Dulieu2"........
Thân
 

File đính kèm

  • Code tong hop du lieu theo dieu kien.rar
    19.2 KB · Đọc: 45
Upvote 0
File dữ liệu có nhiều sheet, em muốn tổng hợp 3 vùng dữ liệu đã được đặt name động, với cột đầu là mã sp, cột cuối là số lượng. các vùng có kích thước khác nhau. Tổng hợp về mã sp duy nhất có số lượng >0.
Xin các thầy giúp !
Mình khoái mấy bài thế này, chơi đường tà đạo vầy xem sao. Xử lý bằng code hết, không tạo thêm name nào cả
Chỉ yêu cầu B5 và C5 của sheet Tong có tiêu đề Mã Sp và Số lượng, không có 2 ô này coi như code này tèo.
PHP:
Sub tong()
Dim d As Object, dl(), sh As Worksheet, tong
Dim i As Long, FR As Long, FC As Long, LC As Long, dk1 As String, dk2 As String, n As Long
Set d = CreateObject("scripting.dictionary")
Set tong = Sheets("Tong")
dk1 = tong.[b5]: dk2 = tong.[c5]
For Each sh In Worksheets
   If sh.Name <> "Tong" Then
      With sh.UsedRange
         FR = .Find(dk1).Offset(1).Row
         FC = .Find(dk1).Column
         LC = .Find(dk2).Column
      End With
      dl = sh.Range(sh.Cells(FR, FC), sh.Cells(65536, LC).End(3)).Value
      n = UBound(dl, 2)
      For i = 1 To UBound(dl)
         If dl(i, n) > 0 Then
            If Not d.exists(dl(i, 1)) Then
               d.Add dl(i, 1), dl(i, n)
            Else
               d.Item(dl(i, 1)) = d.Item(dl(i, 1)) + dl(i, n)
            End If
         End If
      Next
   End If
Next
tong.[b6:c10000].ClearContents
tong.[b6].Resize(d.Count) = Application.Transpose(d.keys)
tong.[C6].Resize(d.Count) = Application.Transpose(d.items)
End Sub
 

File đính kèm

  • Copy of Code tong hop du lieu theo dieu kien.rar
    18.1 KB · Đọc: 44
Lần chỉnh sửa cuối:
Upvote 0
Mình khoái mấy bài thế này, chơi đường tà đạo vầy xem sao. Xử lý bằng code hết, không tạo thêm name nào cả
Chỉ yêu cầu B5 và C5 của sheet Tong có tiêu đề Mã Sp và Số lượng, không có 2 ô này coi như code này tèo.
PHP:
Sub tong()
Dim d As Object, dl(), sh As Worksheet, tong
Dim i As Long, FR As Long, FC As Long, LC As Long, dk1 As String, dk2 As String, n As Long
Set d = CreateObject("scripting.dictionary")
Set tong = Sheets("Tong")
dk1 = tong.[b5]: dk2 = tong.[c5]
For Each sh In Worksheets
   If sh.Name <> "Tong" Then
      With sh.UsedRange
         FR = .Find(dk1).Offset(1).Row
         FC = .Find(dk1).Column
         LC = .Find(dk2).Column
      End With
      dl = sh.Range(sh.Cells(FR, FC), sh.Cells(65536, LC).End(3)).Value
      n = UBound(dl, 2)
      For i = 1 To UBound(dl)
         If dl(i, n) > 0 Then
            If Not d.exists(dl(i, 1)) Then
               d.Add dl(i, 1), dl(i, n)
            Else
               d.Item(dl(i, 1)) = d.Item(dl(i, 1)) + dl(i, n)
            End If
         End If
      Next
   End If
Next
tong.[b6:c10000].ClearContents
tong.[b6].Resize(d.Count) = Application.Transpose(d.keys)
tong.[C6].Resize(d.Count) = Application.Transpose(d.items)
End Sub
Nếu có thêm vài sheet chẳng có dữ liệu gì cả thì sao nhỉ? Tôi thử thì bị lỗi mấy cái Find().
FR = sh.UsedRange.Find(dk1).Offset(1).Row
Tham gia "Quánh võ mèo" một cái xem.
PHP:
Public Sub GPE()
Dim Ws As Worksheet, Rng(), i As Long, n As Long, Dic As Object, K As Long, Arr(), Tem As Variant, SL As Double
Set Dic = CreateObject("Scripting.Dictionary")
ReDim Arr(1 To 65000, 1 To 2)
For Each Ws In Worksheets
 If Ws.Name Like "Dulieu*" Then
    If Ws.UsedRange.Rows.Count > 1 Then
        Rng = Ws.UsedRange.Value
        n = UBound(Rng, 2)
        For i = 2 To UBound(Rng, 1)
            Tem = Rng(i, 1): SL = Rng(i, n)
            If SL > 0 Then
                If Not Dic.exists(Tem) Then
                    K = K + 1
                    Dic.Add Tem, K
                    Arr(K, 1) = Tem: Arr(K, 2) = Rng(i, n)
                Else
                    Arr(Dic.Item(Tem), 2) = Arr(Dic.Item(Tem), 2) + Rng(i, n)
                End If
            End If
        Next i
    End If
 End If
Next
Sheet1.[E6:F1000].ClearContents
Sheet1.[E6].Resize(K, 2).Value = Arr
Set Dic = Nothing
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Nếu có thêm vài sheet chẳng có dữ liệu gì cả thì sao nhỉ? Tôi thử thì bị lỗi mấy cái Find().
Nếu vậy thì em phải thêm 1 cái bẫy lỗi rồi
PHP:
Sub tong()
Dim d As Object, dl(), sh As Worksheet, tong
Dim i As Long, FR As Long, FC As Long, LC As Long, dk1 As String, dk2 As String, n As Long
Set d = CreateObject("scripting.dictionary")
Set tong = Sheets("Tong")
dk1 = tong.[b5]: dk2 = tong.[c5]
For Each sh In Worksheets
   If sh.Name <> "Tong" Then
      If sh.UsedRange.Count > 1 Then
         With sh.UsedRange
            FR = .Find(dk1).Offset(1).Row
            FC = .Find(dk1).Column
            LC = .Find(dk2).Column
         End With
         dl = sh.Range(sh.Cells(FR, FC), sh.Cells(65536, LC).End(3)).Value
         n = UBound(dl, 2)
         For i = 1 To UBound(dl)
            If dl(i, n) > 0 Then
               If Not d.exists(dl(i, 1)) Then
                  d.Add dl(i, 1), dl(i, n)
               Else
                  d.Item(dl(i, 1)) = d.Item(dl(i, 1)) + dl(i, n)
               End If
            End If
         Next
      End If
   End If
Next
tong.[b6:c10000].ClearContents
tong.[b6].Resize(d.Count) = Application.Transpose(d.keys)
tong.[C6].Resize(d.Count) = Application.Transpose(d.items)
End Sub
 
Upvote 0
Má ơi, sao có kiểu lọc gì oái oăm thế này
Mới nghĩ được thế này thôi, bi giờ thấy đói bụng & thèm b.... quá
Thân
Cám ơn bác Lợi nhiều, mà bác thèm "b" là thèm gì nhỉ?
Mình khoái mấy bài thế này, chơi đường tà đạo vầy xem sao.
Tà đạo hay chính đạo mà đi đến được mục tiêu tốt thì nên đi phải không anh? Cám ơn anh nhiều !
Tham gia "Quánh võ mèo" một cái xem.
Cám ơn bác Ba Te, bước đầu em tìm hiểu code, mong bác chia sẻ vài chiêu võ "Tiểu hổ" của bác với !
 
Upvote 0
Bài này dùng PivotTalbe là ngon lành nhất, sao Thảo không thử nhỉ?
 
Upvote 0
Upvote 0
Upvote 0
Có 1 vấn đề mà tôi chưa biết: Với PivotTable, Làm sao ẩn giá trị Zero trong Value Fields?
Ngoài ra: Bài này nếu dùng ADO chắc.. dư sức qua cầu ha?
Ẹc... Ẹc...

Em thấy khi giá trị bằng 0 thì Pivot tự động nó ẩn à Thầy ơi, nó đâu có hiển thị ra đâu?
 
Upvote 0

File đính kèm

  • Code tong hop du lieu theo dieu kien.xlsx
    16.5 KB · Đọc: 17
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Cóc thấy ẩn gì cả --> Nó cứ "lù lù" ở đó mà chẳng biết cách nào để ẩn cả
(hình post lên lại không Edit được ---> Ghét)

Cũng trên File của Thầy em thử 1 Pivot mới thì lại không có một em 0 nào hiện ra! Còn Pivot của Thầy thì nó cứ "lù lù" ra đó!

Chuyển qua định dạng thôi Thầy ơi!

[<>0]General;

Với General Thầy làm gì nó thì làm!
 
Upvote 0
Cóc thấy ẩn gì cả --> Nó cứ "lù lù" ở đó mà chẳng biết cách nào để ẩn cả
(hình post lên lại không Edit được ---> Ghét)
Thầy thử dùng cách như sau nhé:
[video=youtube;kxPc5H9dNJ4]http://www.youtube.com/watch?v=kxPc5H9dNJ4&amp;feature=youtu.be[/video]



 
Lần chỉnh sửa cuối:
Upvote 0
Ngoài ra: Bài này nếu dùng ADO chắc.. dư sức qua cầu ha?
Ẹc... Ẹc...

Bài này dùng ADO cũng khá thú vị:

1./ Đặt Name cho 3 vùng dữ liệu theo thứ tự từ Name1, Name2 và Name3.
2./ Gom 3 Name vào làm 1.
3./ Tính tổng 3 Name đó.

Code sẽ như sau:

Mã:
Sub TongHop_HLMT()

Set adoConn = New ADODB.Connection
Set adoRS = New ADODB.Recordset
With adoConn
    .ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
                        "Data Source=" & ThisWorkbook.FullName & _
                        ";Extended Properties=""Excel 8.0;HDR=No;"";"
    .Open
End With
With adoRS
    .ActiveConnection = adoConn
    .Open "select F1, sum(F3) from " & _
              "(SELECT F1, F3 FROM Name1 " & _
              "Union ALL " & _
              "SELECT F1, F6 FROM Name2 " & _
              "Union ALL " & _
              "SELECT F1, F6 FROM Name3) " & _
              "group by F1 " & _
              "having sum(F3)>0"
End With
[B6].CopyFromRecordset adoRS

adoRS.Close: Set adoRS = Nothing
adoConn.Close: Set adoConn = Nothing

End Sub
 

File đính kèm

  • Union1.1.xls
    55.5 KB · Đọc: 15
Lần chỉnh sửa cuối:
Upvote 0

File đính kèm

  • untitled.JPG
    untitled.JPG
    33.5 KB · Đọc: 48
Upvote 0
Upvote 0
Web KT
Back
Top Bottom