Dictionary với item trùng

Liên hệ QC

Minh Ngọc LH

Thành viên chính thức
Tham gia
14/7/18
Bài viết
71
Được thích
32
Giới tính
Nữ
Mong các thành viên diễn đàn giúp em vấn đề này
Em cần tính cột Số lượng cộng dồn, thành tiền cộng dồn theo từng ngày của các sheet 1,2,3,4 từ sheet TONGHOP (vùng bôi màu vàng)
Em đang tính dùng Dictionary để tính, mà coi đi coi lại thấy không nhắm được điều kiện nào là duy nhất. Nhưng nếu kết hợp 3 điều kiện: Ngày, Cửa hàng và Sản phẩm lại thì chắc chắn không trùng. Ví dụ: chỉ có duy nhất một dòng cho cửa hàng 1, sản phẩm A tại ngày 1. Nhưng lại không được dùng cột phụ để nối 3 cột đó lại được vì form mẫu của người khác gửi báo cáo hàng ngày.
Các thành viên giúp em bằng dictionary hoặc mảng cũng được, miễn sao code chạy nhanh xíu vì dữ liệu này chỉ là giả định, thực tế gần giống vậy nhưng nhiều dòng và nhiều ngày hơn
Em cảm ơn!
 

File đính kèm

Bạn chỉnh lại chỗ này nhé.Quyên không viết vào.
Mã:
Sub tinhtong()
     Dim sh As Worksheet, arr, arr1, lr As Long, i As Long, dk As String, dic As Object, lr1 As Long, a As Double, b As Double
     Set dic = CreateObject("scripting.dictionary")
     With Sheets("Tonghop")
          lr = .Range("B" & Rows.Count).End(xlUp).Row
          If lr < 3 Then Exit Sub
          arr = .Range("B3:F" & lr).Value
          For i = 1 To UBound(arr, 1)
              dk = arr(i, 1) & "#" & arr(i, 2) & "#" & arr(i, 3)
              If Not dic.exists(dk) Then
                 dic.Add dk, Array(arr(i, 4), arr(i, 5))
              Else
                 a = dic.Item(dk)(0)
                 b = dic.Item(dk)(1)
                 a=a+arr(i,4)              Thêm câu này nhé.Giờ mới nhìn ra'
                 b=b+arr(i,5)              Thêm câu này nhé.Giờ mới nhìn ra'
                 Dic.item(dk)=array(a,b)   'Thêm câu này nhé.Giờ mới nhìn ra'
              End If
          Next i
    End With
    For Each sh In ThisWorkbook.Worksheets
        If sh.Name <> "TONGHOP" Then
           lr1 = sh.Range("B" & Rows.Count).End(xlUp).Row
           If lr1 > 3 Then
               sh.Range("F4:F" & lr1).ClearContents
              sh.Range("I4:I" & lr1).ClearContents
              arr1 = sh.Range("B4:i" & lr1).Value
              For i = 1 To UBound(arr1, 1)
                   a = 0
                   b = 0
                   For k = 1 To arr1(i, 1)
                       dk = k & "#" & arr1(i, 2) & "#" & arr1(i, 3)
                       If dic.exists(dk) Then
                          a = a + dic.Item(dk)(0)
                          b = b + dic.Item(dk)(1)
                       End If
                   Next k
                   arr1(i, 5) = a
                   arr1(i, 8) = b
              Next i
              sh.Range("B4:i" & lr1).Value = arr1
          End If
      End If
   Next
End Sub
Anh nhiệt tình và giỏi thiệt. Em tự học mãi mà mới chỉ biết dictionary dạng cơ bản đơn giản nhất thôi, phức tạp hơn xíu là chịu :)
 
Upvote 0
Cái này hạn chế lắm bác ah, nó không đơn giản như vậy đâu. Cửa hàng có hơn trăm loại sản phẩm, có ngày chỉ bán được mấy loại, có ngày bán mấy chục loại, bác nhảy có mỗi cái ngày không thì làm ăn được gì, rồi lại phải làm thêm một mớ công thức để lọc danh sách chỉ những mặt hàng bán theo từng ngày nữa. file thì đã quá nặng rồi. Nếu trung bình 1 ngày 1 cửa hàng bán 50 loại hàng hóa thì 1 tháng phát sinh khoảng 6000 dòng dữ liệu rồi
 
Upvote 0
Web KT

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

Back
Top Bottom