Lọc duy nhất, đếm và tính tổng có điều kiện

Liên hệ QC
Tôi tuân thủ nội quy khi đăng bài

Eric.Shen

Thành viên chính thức
Tham gia
26/1/23
Bài viết
74
Được thích
9
Chào các anh/chị,
Em đang có 1 bài toán cần tính lọc ra các giá trị duy nhất có điều kiện sau đó đếm và tính tổng các giá trị duy nhất đáp ứng điều kiện đó
Kính nhờ các anh/chị giúp đỡ em code VBA để giải quyết nó với ạ
Em cảm ơn ạ
 

File đính kèm

  • Book1.xlsb
    9.9 KB · Đọc: 55
Chào các anh/chị,
Em đang có 1 bài toán cần tính lọc ra các giá trị duy nhất có điều kiện sau đó đếm và tính tổng các giá trị duy nhất đáp ứng điều kiện đó
Kính nhờ các anh/chị giúp đỡ em code VBA để giải quyết nó với ạ
Em cảm ơn ạ
Dùng Filter Advanced cũng được vậy
 
Upvote 0
Chào các anh/chị,
Em đang có 1 bài toán cần tính lọc ra các giá trị duy nhất có điều kiện sau đó đếm và tính tổng các giá trị duy nhất đáp ứng điều kiện đó
Kính nhờ các anh/chị giúp đỡ em code VBA để giải quyết nó với ạ
Em cảm ơn ạ
Xem đúng ý bạn chưa nhé

Mã:
Option Explicit
Sub ABC()
       Dim Dic As Object
       Dim Nguon(), Kq(), Key, ViTri, SoLan
       Dim Dong, Irow, a As Long
     
       Set Dic = CreateObject("Scripting.Dictionary")
     
       With Sheets("Data")
               Irow = .Range("A" & Rows.Count).End(xlUp).Row
               Nguon = .Range("A3").Resize(Irow, 3).Value
       End With
     
       Irow = UBound(Nguon)
   
     
       ReDim Kq(1 To Irow, 1 To 3)
       For a = 1 To Irow - 1
         If Nguon(a, 2) > 60 And Mid(Nguon(a, 3), 1, 1) = "T" Then
           Key = Nguon(a, 1)
            If Not Dic.exists(Key) Then
           
               Dong = Dong + 1
               SoLan = 1
               Dic.Add Key, Dong
               Kq(Dong, 1) = Key
               Kq(Dong, 2) = SoLan
               Kq(Dong, 3) = Nguon(a, 2)
             
            Else
           
              ViTri = Dic.Item(Key)
              Kq(ViTri, 2) = Kq(ViTri, 2) + 1
              Kq(ViTri, 3) = Kq(ViTri, 3) + Nguon(a, 2)
             
            End If
         End If
       Next
     
       With Sheets("Result")
            If Dong > 0 Then
               .Range("B3").Resize(Dong, 3).Value = Kq
            End If
       End With
End Sub
 
Upvote 0
Dùng Filter Advanced cũng được vậy
Em chưa biết cách dùng, cảm ơn bác đã gợi ý, em sẽ tìm hiểu thêm ạ
Bài đã được tự động gộp:

Xem đúng ý bạn chưa nhé

Mã:
Option Explicit
Sub ABC()
       Dim Dic As Object
       Dim Nguon(), Kq(), Key, ViTri, SoLan
       Dim Dong, Irow, a As Long
    
       Set Dic = CreateObject("Scripting.Dictionary")
    
       With Sheets("Data")
               Irow = .Range("A" & Rows.Count).End(xlUp).Row
               Nguon = .Range("A3").Resize(Irow, 3).Value
       End With
    
       Irow = UBound(Nguon)
  
    
       ReDim Kq(1 To Irow, 1 To 3)
       For a = 1 To Irow - 1
         If Nguon(a, 2) > 60 And Mid(Nguon(a, 3), 1, 1) = "T" Then
           Key = Nguon(a, 1)
            If Not Dic.exists(Key) Then
          
               Dong = Dong + 1
               SoLan = 1
               Dic.Add Key, Dong
               Kq(Dong, 1) = Key
               Kq(Dong, 2) = SoLan
               Kq(Dong, 3) = Nguon(a, 2)
            
            Else
          
              ViTri = Dic.Item(Key)
              Kq(ViTri, 2) = Kq(ViTri, 2) + 1
              Kq(ViTri, 3) = Kq(ViTri, 3) + Nguon(a, 2)
            
            End If
         End If
       Next
    
       With Sheets("Result")
            If Dong > 0 Then
               .Range("B3").Resize(Dong, 3).Value = Kq
            End If
       End With
End Sub
Code đã cho kết quả đúng như em muốn rồi, em cảm ơn bác nhiều ạ
 
Upvote 0
Xem đúng ý bạn chưa nhé

Mã:
Option Explicit
Sub ABC()
       Dim Dic As Object
       Dim Nguon(), Kq(), Key, ViTri, SoLan
       Dim Dong, Irow, a As Long
    
       Set Dic = CreateObject("Scripting.Dictionary")
    
       With Sheets("Data")
               Irow = .Range("A" & Rows.Count).End(xlUp).Row
               Nguon = .Range("A3").Resize(Irow, 3).Value
       End With
    
       Irow = UBound(Nguon)
  
    
       ReDim Kq(1 To Irow, 1 To 3)
       For a = 1 To Irow - 1
         If Nguon(a, 2) > 60 And Mid(Nguon(a, 3), 1, 1) = "T" Then
           Key = Nguon(a, 1)
            If Not Dic.exists(Key) Then
          
               Dong = Dong + 1
               SoLan = 1
               Dic.Add Key, Dong
               Kq(Dong, 1) = Key
               Kq(Dong, 2) = SoLan
               Kq(Dong, 3) = Nguon(a, 2)
            
            Else
          
              ViTri = Dic.Item(Key)
              Kq(ViTri, 2) = Kq(ViTri, 2) + 1
              Kq(ViTri, 3) = Kq(ViTri, 3) + Nguon(a, 2)
            
            End If
         End If
       Next
    
       With Sheets("Result")
            If Dong > 0 Then
               .Range("B3").Resize(Dong, 3).Value = Kq
            End If
       End With
End Sub
Các ac giúp đỡ em bài toán này với. Em muốn lọc duy nhất từ sheet Xuất sang sheet Tdoi với tiêu chí: Lọc duy nhất theo mã hàng và tên nvien, rồi cổng tổng số lượng, thành tiền các lần xuất của mặt hàng đó bên sheet xuất
 

File đính kèm

  • Loc duy nhat và đém tổng.xls
    198 KB · Đọc: 30
Upvote 0
Các ac giúp đỡ em bài toán này với. Em muốn lọc duy nhất từ sheet Xuất sang sheet Tdoi với tiêu chí: Lọc duy nhất theo mã hàng và tên nvien, rồi cổng tổng số lượng, thành tiền các lần xuất của mặt hàng đó bên sheet xuất
Bạn thử câu lệnh sau:
Mã:
Option Explicit

Sub Z_Z()
    Dim sheet As Worksheet
    Dim dic As Object, Key As String
    Dim Data As Variant, result As Variant
    Dim strName As String, strItem As String
    Dim r As Long, i As Long, j As Long, k As Long
    Const delim As String = "|"

    With ThisWorkbook.Worksheets("Xuat")
        r = .Cells(.Rows.Count, "D").End(xlUp).Row
        If r < 9 Then: MsgBox "Khong co du lieu.", vbCritical: Exit Sub
        Data = .Range("B9:J" & r).Value
    End With
    
    Set dic = CreateObject("Scripting.Dictionary")
    dic.CompareMode = TextCompare
    
    ReDim result(1 To UBound(Data, 1), 1 To UBound(Data, 2))
    For i = LBound(Data, 1) To UBound(Data, 1)
        strName = Data(i, 1)
        strItem = Data(i, 3)
        Key = Join(Array(strName, strItem), delim)
        If Not dic.Exists(Key) Then
            k = k + 1
            dic.Add Key, k
            For j = LBound(Data, 2) To UBound(Data, 2)
                result(k, j) = Data(i, j)
            Next j
        Else
            r = dic.Item(Key)
            For j = 6 To 9
                result(r, j) = result(r, j) + Data(i, j)
            Next j
        End If
    Next i
    With ThisWorkbook.Worksheets("Tdoi")
        r = .Cells(.Rows.Count, "C").End(xlUp).Row
        If (r > 9) Then .Range("A9:K" & r).ClearContents
        If (k > 0) Then .Range("A9").Resize(k, UBound(result, 2)).Value = result
    End With
    MsgBox "Ket thuc.", vbInformation
End Sub
 
Upvote 0
Bạn thử câu lệnh sau:
Mã:
Option Explicit

Sub Z_Z()
    Dim sheet As Worksheet
    Dim dic As Object, Key As String
    Dim Data As Variant, result As Variant
    Dim strName As String, strItem As String
    Dim r As Long, i As Long, j As Long, k As Long
    Const delim As String = "|"

    With ThisWorkbook.Worksheets("Xuat")
        r = .Cells(.Rows.Count, "D").End(xlUp).Row
        If r < 9 Then: MsgBox "Khong co du lieu.", vbCritical: Exit Sub
        Data = .Range("B9:J" & r).Value
    End With
  
    Set dic = CreateObject("Scripting.Dictionary")
    dic.CompareMode = TextCompare
  
    ReDim result(1 To UBound(Data, 1), 1 To UBound(Data, 2))
    For i = LBound(Data, 1) To UBound(Data, 1)
        strName = Data(i, 1)
        strItem = Data(i, 3)
        Key = Join(Array(strName, strItem), delim)
        If Not dic.Exists(Key) Then
            k = k + 1
            dic.Add Key, k
            For j = LBound(Data, 2) To UBound(Data, 2)
                result(k, j) = Data(i, j)
            Next j
        Else
            r = dic.Item(Key)
            For j = 6 To 9
                result(r, j) = result(r, j) + Data(i, j)
            Next j
        End If
    Next i
    With ThisWorkbook.Worksheets("Tdoi")
        r = .Cells(.Rows.Count, "C").End(xlUp).Row
        If (r > 9) Then .Range("A9:K" & r).ClearContents
        If (k > 0) Then .Range("A9").Resize(k, UBound(result, 2)).Value = result
    End With
    MsgBox "Ket thuc.", vbInformation
End Sub
Bạn OT thức khuya dữ ha.
 
Upvote 0
Bạn thử câu lệnh sau:
Em cảm ơn ạ. ac có thể viết cho em xin thêm đoạn mã để sắp xếp. Sau đó thêm 1 hàng ngay dưới khi hết 1 người, rồi cộng tổng tiền người đó. Và cuối cùng thêm 1 dòng trên cùng hoặc cuối cùng để tổng cộng tiền doanh thu của cả bảng đựợc không? Nó lộn xộn quá ạ
 
Lần chỉnh sửa cuối:
Upvote 0
Em cảm ơn ạ. ac có thể viết cho em xin thêm đoạn mã để sắp xếp. Sau đó thêm 1 hàng ngay dưới khi hết 1 người, rồi cộng tổng tiền người đó. Và cuối cùng thêm 1 dòng trên cùng hoặc cuối cùng để tổng cộng tiền doanh thu của cả bảng đựợc không? Nó lộn xộn quá ạ
Bạn muốn sắp xếp cột nào vậy?
 
Upvote 0
Dạ em muốn sắp xếp theo cột họ tên nvien, sau đó sếp theo mã hàng.
Hết người thứ nhất thì tạo 1 dòng tổng
Tương tự như vậy với người thứ 2, thứ 3.
cuối cùng cho e 1 dóng tổng tất cả mọi người
E Móng muốn kết quả tương tự như sheet TDOI trong file này ạ
 

File đính kèm

  • TDoi.xls
    849 KB · Đọc: 21
Upvote 0
Dạ em muốn sắp xếp theo cột họ tên nvien, sau đó sếp theo mã hàng.
Hết người thứ nhất thì tạo 1 dòng tổng
Tương tự như vậy với người thứ 2, thứ 3.
cuối cùng cho e 1 dóng tổng tất cả mọi người
E Móng muốn kết quả tương tự như sheet TDOI trong file này ạ
File mới của bạn có các thông tin như:
...
Số Máy
Mã KH
Họ Tên
Người thu

Vậy cột nào là mã hàng, cột nào là họ tên nhân viên..
Ngoài ra còn yêu cầu nào nữa không bạn?
 
Upvote 0
Dạ em muốn sắp xếp theo cột họ tên nvien, sau đó sếp theo mã hàng.
Hết người thứ nhất thì tạo 1 dòng tổng
Tương tự như vậy với người thứ 2, thứ 3.
cuối cùng cho e 1 dóng tổng tất cả mọi người
E Móng muốn kết quả tương tự như sheet TDOI trong file này ạ
Bạn kiểm tra lại:
Mã:
Option Explicit

Public Sub returnSubTotal()

    Dim dic As Object, ws As Worksheet, sheet As Worksheet
    Dim Data As Variant, Result As Variant, Subtotal As Variant
    Dim str As String, sMacNo As String, sMember As String, sGroup As String, sTotal As String
    Dim i As Long, j As Long, k As Long, r As Long, n As Long, x As Long
    Dim dDTT As Double, dPT As Double, dTT As Double, dN As Double, d As Double
    Dim c As Integer, count As Integer
   
    Application.ScreenUpdating = False
   
    On Error GoTo Exit_
   
    Set ws = ThisWorkbook.Worksheets("XL")
    Set sheet = ThisWorkbook.Worksheets("TDOI")
    With ThisWorkbook.Worksheets("XL")
        r = .Cells(.Rows.count, "B").End(xlUp).Row
        If r < 3 Then: MsgBox "Khong co du lieu.", vbCritical: Exit Sub
        Result = ws.Range("A3:J" & r).Value
        .Range("A3:J" & r).Sort _
            Key1:=ws.Range("F3"), Order1:=xlAscending, _
            Key2:=ws.Range("E3"), Order2:=xlAscending, _
            Key3:=ws.Range("C3"), Order3:=xlAscending, _
            Orientation:=xlTopToBottom, Header:=xlYes
                       
        .Range("A3:J" & r).Value = Result
        Data = .Range("B3:J" & r).Value
    End With
   
    Set dic = CreateObject("Scripting.Dictionary")
    dic.CompareMode = TextCompare

    With ThisWorkbook.Worksheets("NHAP")
        r = .Cells(.Rows.count, "B").End(xlUp).Row
        If r < 3 Then GoTo ZZ
        Result = .Range("B3:C" & r).Value
        For i = LBound(Result, 1) To UBound(Result, 1)
            sMacNo = Result(i, 1):    dDTT = Result(i, 2)
            If Not dic.Exists(sMacNo) Then
                dic.Add sMacNo, Array(dDTT, 1)
            Else
                d = dic.item(sMacNo)(0) + dDTT
                count = dic.item(sMacNo)(1) + 1
                dic.item(sMacNo) = Array(d, count)
            End If
        Next i
    End With
   
ZZ:
    sTotal = "C" & ChrW(7897) & "ng: "
    r = UBound(Data, 1): c = 12
    ReDim Preserve Data(1 To r, 1 To c)
    ReDim Result(1 To r, 1 To c)
    ReDim Subtotal(1 To r, 1 To c)
   
    For i = 1 To r
        sMacNo = Data(i, 1)
        sMember = Data(i, 4)
        sGroup = Data(i, 5)
        dPT = Data(i, 6)
        dTT = Data(i, 7)
        If dic.Exists(sMacNo) Then
            dDTT = dic.item(sMacNo)(0)
            count = dic.item(sMacNo)(1)
        Else
            dDTT = 0
            count = 0
        End If
       
        str = sMacNo & "|" & sMember
        dN = (dDTT + dTT) - dPT

        If Not dic.Exists(sGroup) Then
            n = n + 1
            dic.Add sGroup, n
            Subtotal(n, 4) = sTotal & sGroup
            Subtotal(n, c) = n & sGroup & sTotal
            Subtotal(n, 5) = dPT
            Subtotal(n, 6) = dDTT
           
            If (dN > 0) Then
                Subtotal(n, 7) = 0
                Subtotal(n, 8) = dN
            Else
                Subtotal(n, 7) = dPT - dDTT + dTT
                Subtotal(n, 8) = 0
            End If
            Subtotal(n, 9) = count
        Else
            x = dic.item(sGroup)
            Subtotal(x, 5) = Subtotal(x, 5) + dPT
            Subtotal(x, 6) = Subtotal(x, 6) + dDTT
            If (dN > 0) Then
                Subtotal(x, 7) = Subtotal(x, 7) + 0
                Subtotal(x, 8) = Subtotal(x, 8) + dN
            Else
                Subtotal(x, 7) = Subtotal(x, 7) + dPT - dDTT + dTT
                Subtotal(x, 8) = Subtotal(x, 8) + 0
            End If
            Subtotal(n, 9) = Subtotal(n, 9) + 1
        End If
           
        If Not dic.Exists(str) Then
            k = k + 1:  dic.Add str, k
            Result(k, 1) = k
            For j = 1 To 3
                Result(k, j + 1) = Data(i, j)
            Next j
            Result(k, 5) = dPT
            Result(k, 6) = dDTT
            If (dN > 0) Then
                Result(k, 7) = 0
                Result(k, 8) = dN
            Else
                Result(k, 7) = dPT - dDTT + dTT
                Result(k, 8) = 0
            End If
            Result(k, 9) = count
            Result(k, 10) = sMember
            Result(k, 11) = sGroup
            Result(i, c) = n & sGroup
        Else
            x = dic.item(str)
            Result(x, 5) = Result(x, 5) + dPT
            Result(x, 6) = Result(x, 6) + dDTT
            If (dN > 0) Then
                Result(x, 7) = Result(x, 7) + 0
                Result(x, 8) = Result(x, 8) + dN
            Else
                Result(x, 7) = Result(x, 7) + dPT - dDTT + dTT
                Result(x, 8) = Result(x, 8) + 0
            End If
            Result(x, 9) = Result(x, 9) + 1
        End If
    Next i
   
    Dim bookTmp As Workbook, shTmp As Worksheet
    Set bookTmp = Workbooks.Add
    Set shTmp = bookTmp.Worksheets(1)
    If (k > 0) Then shTmp.Range("A1").Resize(k, c).Value = Result
    If (n > 0) Then shTmp.Range("A" & k + 1).Resize(n, c).Value = Subtotal
    r = k + n
    If r = 0 Then GoTo End_
    With shTmp.Sort
        .SortFields.Clear
        .SortFields.Add key:=shTmp.Cells(1, c), Order:=xlAscending
        .SetRange shTmp.Range("A1").Resize(r, c)
        .Header = xlYes
        .Apply
    End With
    Subtotal = shTmp.Range("A1").Resize(r, c - 1)
    k = 0
    For i = LBound(Subtotal, 1) To UBound(Subtotal, 1)
        If Len(Subtotal(i, 1)) > 0 Then
            k = k + 1
            Subtotal(i, 1) = k
        End If
    Next i
   
End_:

    If Not bookTmp Is Nothing Then bookTmp.Close False
    Application.ScreenUpdating = True
    sheet.Range("N3").Resize(UBound(Subtotal, 1), UBound(Subtotal, 2)).Value = Subtotal
    MsgBox "Ket thuc.", vbInformation
    Exit Sub
   
Exit_:
    Application.ScreenUpdating = True

End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Chào các anh/chị,
Em đang có 1 bài toán cần tính lọc ra các giá trị duy nhất có điều kiện sau đó đếm và tính tổng các giá trị duy nhất đáp ứng điều kiện đó
Kính nhờ các anh/chị giúp đỡ em code VBA để giải quyết nó với ạ
Em cảm ơn ạ
Thêm cho bạn một cách khác nhé:

Mã:
Sub Dem_HLMT()
    With CreateObject("ADODB.Connection")
        .Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=""Excel 12.0 Xml;HDR=No"""
        Sheet2.Range("B10").CopyFromRecordset .Execute("Select F1, Count(F1),Sum(F2) From [Data$A3:C] Where F2>60 And F3 Like '" & Sheet1.Range("C3") & "' Group By F1")
    End With
End Sub

Ghi chú: Sheet1.Range("C3") là điều kiện lọc màu trắng. Bạn chỉnh sửa lại cho hợp lý nhé.
 
Upvote 0
Em thật lòng xin lỗi các ac, Cảm ơn các ac đã giúp đỡ. Thực tâm em muốn kết quả như Sheet TDoi dưới đây. Vì là đang hỏi dở bài số #5, nhưng vì tiện file đang có sẵn nên gửi và ngụ ý muốn giống như vậy, chứ không có ý làm trên file bài #10 đó.
Em 1 lần nữa vô cùng xin lỗi các ac vì không nói rõ ràng. Em xin chân tình cảm ơn lòng nhiệt thành của các ac. Nếu có thể được thì xin giúp đỡ cho em trên file này. Còn nếu các ac bận thì thôi vậy ạ, vì em thấy ngại quá. không dám nhờ tiếp.
Code Bài #6 chạy tốt ạ, và có ý bổ xung sắp xếp tính tổng, viên, tô màu(làm đẹp).
Cho em gửi lời cảm ơn và xin lỗi ạ.
 

File đính kèm

  • Loc duy nhat và đém tổng.xls
    196 KB · Đọc: 8
Lần chỉnh sửa cuối:
Upvote 0
Em thật lòng xin lỗi các ac, Cảm ơn các ac đã giúp đỡ. Thực tâm em muốn kết quả như Sheet TDoi dưới đây. Vì là đang hỏi dở bài số #5, nhưng vì tiện file đang có sẵn nên gửi và ngụ ý muốn giống như vậy, chứ không có ý làm trên file bài #10 đó.
Em 1 lần nữa vô cùng xin lỗi các ac vì không nói rõ ràng. Em xin chân tình cảm ơn lòng nhiệt thành của các ac. Nếu có thể được thì xin giúp đỡ cho em trên file này. Còn nếu các ac bận thì thôi vậy ạ, vì em thấy ngại quá. không dám nhờ tiếp.
Code Bài #6 chạy tốt ạ, và có ý bổ xung sắp xếp tính tổng, viên, tô màu(làm đẹp).
Cho em gửi lời cảm ơn và xin lỗi ạ.
Chít chưa mấy anh chị! --=0

Em đưa file đó thôi chứ thực ra nó chẳng giống vậy. Giờ do khả năng có hạn nên em ráp vào file em nó tịt ạ.
Anh chị cố gắng bẻ lái sang file này nhé. Cảm ơn và xin lỗi!
 
Upvote 0
File mới của bạn có các thông tin như:
E cũng theo dõi suốt nhưng không thấy ai hỏi, thế nên mải làm, công việc của em là trên đường nên không kịp trả lời. Đến khi xem lại thì thấy các ac đã giúp đỡ. Em xin cảm ơn ạ.
Bài đã được tự động gộp:

Dạ, dạ, cho em xin lỗi ạ
 
Upvote 0
Em thật lòng xin lỗi các ac, Cảm ơn các ac đã giúp đỡ. Thực tâm em muốn kết quả như Sheet TDoi dưới đây. Vì là đang hỏi dở bài số #5, nhưng vì tiện file đang có sẵn nên gửi và ngụ ý muốn giống như vậy, chứ không có ý làm trên file bài #10 đó.
Em 1 lần nữa vô cùng xin lỗi các ac vì không nói rõ ràng. Em xin chân tình cảm ơn lòng nhiệt thành của các ac. Nếu có thể được thì xin giúp đỡ cho em trên file này. Còn nếu các ac bận thì thôi vậy ạ, vì em thấy ngại quá. không dám nhờ tiếp.
Code Bài #6 chạy tốt ạ, và có ý bổ xung sắp xếp tính tổng, viên, tô màu(làm đẹp).
Cho em gửi lời cảm ơn và xin lỗi ạ.
Cái tiện của bạn & cái file có sẵn đó với mình cũng chóng mặt lắm đó :D.
-------------
Vụ tô màu (làm đẹp) bạn có thể kết hợp conditional formatting,
còn sắp xếp tính tổng bạn thử lại code sau:
Mã:
Option Explicit

Sub Z_Z()

    Dim sheet As Worksheet, rng As Range
    Dim dic As Object, Key As String
    Dim Data As Variant, subToltal As Variant, result As Variant
    Dim strName As String, strItem As String, dbMoney As Double, dbTotal As Double
    Dim r As Long, i As Long, j As Long, k As Long, n As Long
    Dim c As Integer

    With ThisWorkbook.Worksheets("Xuat")
        r = .Cells(.Rows.count, "D").End(xlUp).Row
        If r < 9 Then: MsgBox "Khong co du lieu.", vbCritical: Exit Sub
        Set rng = .Range("A9:L" & r):   result = rng.Value
        rng.Sort Key1:=.Range("B9"), Order1:=xlAscending, Key2:=.Range("D9"), Order2:=xlAscending, _
            Orientation:=xlTopToBottom, Header:=xlNo
        Data = .Range("B9:J" & r).Value
        rng.Value = result
    End With
 
    Set dic = CreateObject("Scripting.Dictionary")
    dic.CompareMode = vbTextCompare
    c = UBound(Data, 2) + 1
    ReDim result(1 To UBound(Data, 1), 1 To c)
    ReDim subToltal(1 To UBound(Data, 1), 1 To c)
    For i = LBound(Data, 1) To UBound(Data, 1)
        strName = Data(i, 1)
        strItem = Data(i, 3)
        dbMoney = Data(i, 9)
        Key = strName & "|" & strItem
        dbTotal = dbTotal + dbMoney
        If Not dic.Exists(Key) Then
            k = k + 1: dic.Add Key, k
            If Not dic.Exists(strName) Then
                n = n + 1: dic.Add strName, n
                subToltal(n, 1) = "C" & ChrW(7897) & "ng: "
                subToltal(n, c) = n & strName & "C" & ChrW(7897) & "ng: "
                subToltal(n, 9) = dbMoney
            Else
                r = dic.Item(strName)
                subToltal(r, 9) = subToltal(r, 9) + dbMoney
            End If
            For j = LBound(Data, 2) To UBound(Data, 2)
                result(k, j) = Data(i, j)
            Next j
            result(k, c) = n & strName & "C" & ChrW(7897) & "ng: "
        Else
            r = dic.Item(Key)
            For j = 6 To 9
                result(r, j) = result(r, j) + Data(i, j)
            Next j
            r = dic.Item(strName)
            subToltal(r, 9) = subToltal(r, 9) + dbMoney
        End If
    Next i
 
    With ThisWorkbook.Worksheets("Tdoi")
        r = .Cells(.Rows.count, "A").End(xlUp).Row
        If (r > 9) Then .Range("A9:K" & r).ClearContents
        If (k > 0) Then .Range("A9").Resize(k, UBound(result, 2)).Value = result
        If (n > 0) Then .Range("A9").Offset(k).Resize(n, UBound(subToltal, 2)).Value = subToltal
        r = 8 + k + n: Set rng = .Range("A9:K" & r)
        rng.Sort Key1:=.Range("J9"), Order1:=xlAscending, Orientation:=xlTopToBottom, Header:=xlNo
        .Range("J9:J" & r).ClearContents
        .Range("J9:J" & r).ClearContents
        .Range("A" & r + 1).Value = "T" & ChrW(7893) & "ng c" & ChrW(7897) & "ng:"
        .Range("I" & r + 1).Value = dbTotal
    End With
 
    MsgBox "Ket thuc.", vbInformation
 
End Sub
 

File đính kèm

  • Loc duy nhat và đém tổng (2).xlsm
    69 KB · Đọc: 28
Lần chỉnh sửa cuối:
Upvote 0
Dạ, cho em xin lỗi ạ.
Dạ, em lắp vào code chạy rất tốt ạ. E chả biết nói gì nữa, xin gửi đến ac và diễn đàn ời cảm ơn ạ. Chúc anh chị mạnh khỏe.
Lần nữa xin mọi người thông cảm cho em ạ, chỉ tại ko biết cách trích dẫn.
Bài đã được tự động gộp:

Mà file ac làm cho em quá hoàn chỉnh rồi ạ. em thấy hơn cả mong đợi rồi ạ. E xin cảm ơn ac.
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom