Code VBA - Mảng - Lập báo cáo worst

Liên hệ QC

cauthi_toiuu

Thành viên mới
Tham gia
1/5/20
Bài viết
10
Được thích
0
Chào các anh chị trong diễn đàn !
Mình có một vấn đề chưa được giải quyết (khó đối với mình)
Mong các anh chị giúp đỡ
Chi tiết mình mô tả kĩ trong file đính kèm
Mong các anh chị hỗ trợ.
Cảm ơn!
 

File đính kèm

  • Hỏi bài.xlsx
    25.2 KB · Đọc: 75
Anh Hiếu ơi, giúp em lại bài này
Sau~1 tuần e test và tìm hiểu, nhưng không ra vấn đề
1. Dữ liệu em hỏi ở #1, em test code của anh thì đúng. Nhưng khi em mở rộng dữ liệu ra thì kết quả không đúng. Data test mà cho kết quả không đúng em đính kèm ở bài này
2. Giả sử cột cửa hàng có tên là Cửa hàng A,C thay vì chỉ là cửa hàng A hoặc cửa hàng C (nghĩa là có dấu , trong tên cửa hàng) vậy nên sửa code này phải không anh? S = Split(oSList2.GetByIndex(i), ",")
1/ Không đúng chổ nào?
2/ Chỉnh dấu phân cách "," thành "|"
Mã:
  For i = 0 To sRow
    oSList2.Item(oSList.GetByIndex(i)) = oSList2.Item(oSList.GetByIndex(i)) & "|" & oSList.GetKey(i)
  Next i
Mã:
S = Split(oSList2.GetByIndex(i), "|")
 
Upvote 0
1/ Không đúng chổ nào?
2/ Chỉnh dấu phân cách "," thành "|"
Mã:
  For i = 0 To sRow
    oSList2.Item(oSList.GetByIndex(i)) = oSList2.Item(oSList.GetByIndex(i)) & "|" & oSList.GetKey(i)
  Next i
Mã:
S = Split(oSList2.GetByIndex(i), "|")
Khi em chạy code ở data mới đã mở rộng số lượng của hàng và mặt hàng(file đính kèm), kết quả thu được (ở sheet Report) mặt hàng worst 1, 2, 3 của các cửa hàng k giống như pivot.
 
Upvote 0
Khi em chạy code ở data mới đã mở rộng số lượng của hàng và mặt hàng(file đính kèm), kết quả thu được (ở sheet Report) mặt hàng worst 1, 2, 3 của các cửa hàng k giống như pivot.
Tách SortList theo cửa hàng và mặt hàng theo 2 object riêng dể kiểm soát dữ liệu hơn
Mã:
Sub Worst_Report()
  Dim sArr(), Res(), oSList As Object, oSList2 As Object, oSList3 As Object, S, S2, iItem$
  Dim iDate As Date, sRow&, i&, tmp, iK&, k&, r&
 
  iDate = Sheets("Report").Range("C2").Value
  Set oSList = CreateObject("System.Collections.SortedList")
  Set oSList2 = CreateObject("System.Collections.SortedList")
  Set oSList3 = CreateObject("System.Collections.SortedList")
  With Sheets("Data")
    sArr = .Range("B5", .Range("E" & Rows.Count).End(xlUp)).Value
  End With
  sRow = UBound(sArr)
  For i = 1 To sRow
    If sArr(i, 1) = iDate Then
      If sArr(i, 2) <> Empty Then
        oSList.Item(sArr(i, 2)) = oSList.Item(sArr(i, 2)) + sArr(i, 4)
        oSList.Item(sArr(i, 2) & "#" & sArr(i, 3)) = oSList.Item(sArr(i, 2) & "#" & sArr(i, 3)) + sArr(i, 4)
      End If
    End If
  Next i
  sRow = oSList.Count - 1
  For i = 0 To sRow
    tmp = oSList.GetByIndex(i)
    If InStr(1, oSList.GetKey(i), "#") = 0 Then
      oSList2.Item(tmp) = oSList2.Item(tmp) & "|" & oSList.GetKey(i) 'Sort Cua hang
    Else
      oSList3.Item(tmp) = oSList3.Item(tmp) & "|" & oSList.GetKey(i) 'Sort Mat hang
    End If
  Next i
  oSList.Clear
  ReDim Res(1 To 12, 1 To 5)
  sRow = oSList2.Count - 1
  For i = sRow To 0 Step -1
    S = Split(oSList2.GetByIndex(i), "|")
    For r = 1 To UBound(S)
      iItem = S(r)
      k = k + 1
      iK = k * 3 - 2
      Res(iK, 1) = k:          Res(iK, 2) = iItem
      oSList.Item(iItem) = iK
      If k = 4 Then Exit For
    Next r
    If k = 4 Then Exit For
  Next i
  sRow = oSList3.Count - 1
  For i = sRow To 0 Step -1
    S = Split(oSList3.GetByIndex(i), "|")
    For r = 1 To UBound(S)
      S2 = Split(S(r), "#")
      tmp = S2(0):        iK = oSList.Item(tmp)
      If iK > 0 Then
        Res(iK, 3) = S2(1)
        Res(iK, 4) = oSList3.GetKey(i)
        k = ((iK - 1) \ 3) * 3 + 1
        Res(k, 5) = Res(k, 5) + Res(iK, 4)
        If (iK Mod 3) = 0 Then
          oSList.Item(tmp) = 0
        Else
          oSList.Item(tmp) = iK + 1
        End If
      End If
    Next r
  Next i
  Sheets("Report").Range("A5").Resize(12, 5) = Res
  Set oSList = Nothing: Set oSList2 = Nothing: Set oSList3 = Nothing
End Sub
 
Upvote 0
Sao bác lại bảo không xứng đáng vận não vậy?
Bài toàn xuất phát từ như cầu thực tế. Cần kiểm tra xem mỗi ngày, cửa hàng nào bán được nhiều nhất, và trong cửa hàng thì mặt hàng nào bán được nhiều nhất => đánh giá
Còn file excel em hỏi bài là 1 bài dữ liệu em bịa tương tự, bài toán có thể làm bằng excel, và pivot nhưng cần qua nhiều bước trung gian và thao tác.
Em muốn học hỏi VBA tự động hóa và nhẹ, bác lại nói thế hóa ra em bịa viển vông để làm phiền các bác sao?

Bài toán theo mình thấy chỉ liệt kê theo hạng những sản phẩm top 3 của từng cửa hàng --> Tại sao không dùng pivot cho đơn giản vấn đề? Hoàn toàn có thể update khi filter. Còn format thì Pivot chính là format rồi còn gì.
 
Upvote 0
Web KT

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

Back
Top Bottom