cauthi_toiuu
Thành viên mới
- Tham gia
- 1/5/20
- Bài viết
- 10
- Được thích
- 0
1/ Không đúng chổ nào?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), ",")
For i = 0 To sRow
oSList2.Item(oSList.GetByIndex(i)) = oSList2.Item(oSList.GetByIndex(i)) & "|" & oSList.GetKey(i)
Next i
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.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), "|")
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ơnKhi 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.
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
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?