Thử thay Sub của bạn bằng cái này thử xem:Mình có đọc và học trên diễn đàn về Dic và thấy hay quá. Song khi áp dụng về mảng để tính xuất, nhập, tồn thì số liệu có sai. Mình biết là sai ở các phần thêm, sửa Item của Dic nhưng không tài nào chỉnh được. Mong các cao thủ trợ giúp. File VD đính kèm.
Public Sub GPE()
Dim Rng1(), Rng2(), Rng3(), Arr(), I As Long, J As Long, K As Long, Dic As Object
Set Dic = CreateObject("Scripting.Dictionary")
Rng1 = Sheets("DM").Range(Sheets("DM").[A2], Sheets("DM").[A65000].End(xlUp)).Resize(, 4).Value
Rng2 = Sheets("Nhap").Range(Sheets("Nhap").[B2], Sheets("Nhap").[B65000].End(xlUp)).Resize(, 3).Value
Rng3 = Sheets("Xuat").Range(Sheets("Xuat").[B2], Sheets("Xuat").[B65000].End(xlUp)).Resize(, 3).Value
ReDim Arr(1 To UBound(Rng1, 1), 1 To 8)
For I = 1 To UBound(Rng1, 1)
If Not Dic.exists(Rng1(I, 1)) Then
K = K + 1
Dic.Add Rng1(I, 1), K
Arr(K, 1) = K: Arr(K, 8) = Rng1(I, 4)
For J = 1 To 4
Arr(K, J + 1) = Rng1(I, J)
Next
End If
Next I
For I = 1 To UBound(Rng2, 1)
If Dic.exists(Rng2(I, 2)) Then
If Rng2(I, 1) >= Sheets("Bao Cao").[D2].Value And Rng2(I, 1) <= Sheets("Bao Cao").[D3].Value Then
Arr(Dic.Item(Rng2(I, 2)), 6) = Arr(Dic.Item(Rng2(I, 2)), 6) + Rng2(I, 3)
Arr(Dic.Item(Rng2(I, 2)), 8) = Arr(Dic.Item(Rng2(I, 2)), 8) + Rng2(I, 3)
End If
End If
Next I
For I = 1 To UBound(Rng3, 1)
If Dic.exists(Rng3(I, 2)) Then
If Rng3(I, 1) >= Sheets("Bao Cao").[D2].Value And Rng3(I, 1) <= Sheets("Bao Cao").[D3].Value Then
Arr(Dic.Item(Rng3(I, 2)), 7) = Arr(Dic.Item(Rng3(I, 2)), 7) + Rng3(I, 3)
Arr(Dic.Item(Rng3(I, 2)), 8) = Arr(Dic.Item(Rng3(I, 2)), 8) - Rng3(I, 3)
End If
End If
Next I
If K Then Sheets("Bao Cao").[A5].Resize(K, 8).Value = Arr
Set Dic = Nothing
End Sub
Cám ơn Ba Tê đã hướng dẫn, nhưng hình như phần hàng tồn đầu kỳ còn sai (Chương trình lấy đầu năm, chưa trừ phần nhập - xuất trước đó). Chọn kỳ báo cáo 15/01/2012 đến 31/01/2012 sẽ thấy.Thử thay Sub của bạn bằng cái này thử xem:
Thử lại với code này xem:Cám ơn Ba Tê đã hướng dẫn, nhưng hình như phần hàng tồn đầu kỳ còn sai (Chương trình lấy đầu năm, chưa trừ phần nhập - xuất trước đó). Chọn kỳ báo cáo 15/01/2012 đến 31/01/2012 sẽ thấy.
Public Sub GPE()
Dim Rng1(), Rng2(), Rng3(), Arr(), I As Long, J As Long, K As Long, Dic As Object
Set Dic = CreateObject("Scripting.Dictionary")
Rng1 = Sheets("DM").Range(Sheets("DM").[A2], Sheets("DM").[A65000].End(xlUp)).Resize(, 4).Value
Rng2 = Sheets("Nhap").Range(Sheets("Nhap").[B2], Sheets("Nhap").[B65000].End(xlUp)).Resize(, 3).Value
Rng3 = Sheets("Xuat").Range(Sheets("Xuat").[B2], Sheets("Xuat").[B65000].End(xlUp)).Resize(, 3).Value
ReDim Arr(1 To UBound(Rng1, 1), 1 To 8)
For I = 1 To UBound(Rng1, 1)
If Not Dic.exists(Rng1(I, 1)) Then
K = K + 1
Dic.Add Rng1(I, 1), K
Arr(K, 1) = K
For J = 1 To 4
Arr(K, J + 1) = Rng1(I, J)
Next
End If
Next I
For I = 1 To UBound(Rng2, 1)
If Dic.exists(Rng2(I, 2)) Then
If Rng2(I, 1) < Sheets("Bao Cao").[D2].Value Then
Arr(Dic.Item(Rng2(I, 2)), 5) = Arr(Dic.Item(Rng2(I, 2)), 5) + Rng2(I, 3)
ElseIf Rng2(I, 1) >= Sheets("Bao Cao").[D2].Value And Rng2(I, 1) <= Sheets("Bao Cao").[D3].Value Then
Arr(Dic.Item(Rng2(I, 2)), 6) = Arr(Dic.Item(Rng2(I, 2)), 6) + Rng2(I, 3)
End If
End If
Next I
For I = 1 To UBound(Rng3, 1)
If Dic.exists(Rng3(I, 2)) Then
If Rng3(I, 1) < Sheets("Bao Cao").[D2].Value Then
Arr(Dic.Item(Rng3(I, 2)), 5) = Arr(Dic.Item(Rng3(I, 2)), 5) - Rng3(I, 3)
ElseIf Rng3(I, 1) >= Sheets("Bao Cao").[D2].Value And Rng3(I, 1) <= Sheets("Bao Cao").[D3].Value Then
Arr(Dic.Item(Rng3(I, 2)), 7) = Arr(Dic.Item(Rng3(I, 2)), 7) + Rng3(I, 3)
End If
Arr(Dic.Item(Rng3(I, 2)), 8) = Arr(Dic.Item(Rng3(I, 2)), 5) + Arr(Dic.Item(Rng3(I, 2)), 6) - Arr(Dic.Item(Rng3(I, 2)), 7)
End If
Next I
If K Then Sheets("Bao Cao").[A5].Resize(K, 8).Value = Arr
Set Dic = Nothing
End Sub
Thử lại với code này xem:
PHP:Public Sub GPE() Dim Rng1(), Rng2(), Rng3(), Arr(), I As Long, J As Long, K As Long, Dic As Object ' ...' For I = 1 To UBound(Rng2, 1) If Dic.exists(Rng2(I, 2)) Then ... For I = 1 To UBound(Rng3, 1) If Dic.exists(Rng3(I, 2)) Then
Thử lại với code này xem:
PHP:Public Sub GPE() .......... End Sub
For i = 1 To UBound(Rng3, 1)
If Dic.exists(Rng3(i, 2)) Then
[COLOR=#0000cd][B]tmp = Dic.Item(Rng3(i, 2))[/B][/COLOR]
If Rng3(i, 1) < Sheets("Bao Cao").[D2].Value Then
Arr([COLOR=#0000cd][B]tmp [/B][/COLOR], 5) = Arr([COLOR=#0000cd][B]tmp [/B][/COLOR], 5) - Rng3(i, 3)
ElseIf Rng3(i, 1) >= Sheets("Bao Cao").[D2].Value And _
Rng3(i, 1) <= Sheets("Bao Cao").[D3].Value Then
Arr([COLOR=#0000cd][B]tmp [/B][/COLOR], 7) = Arr([COLOR=#0000cd][B]tmp [/B][/COLOR], 7) + Rng3(i, 3)
End If
Arr([COLOR=#0000cd][B]tmp [/B][/COLOR], 8) = Arr([COLOR=#0000cd][B]tmp [/B][/COLOR], 5) + Arr([COLOR=#0000cd][B]tmp [/B][/COLOR], 6) - Arr([COLOR=#0000cd][B]tmp [/B][/COLOR], 7)
End If
Next i
Thử lại với code này xem:
PHP:Public Sub GPE() Dim Rng1(), Rng2(), Rng3(), Arr(), I As Long, J As Long, K As Long, Dic As Object Set Dic = CreateObject("Scripting.Dictionary") Rng1 = Sheets("DM").Range(Sheets("DM").[A2], Sheets("DM").[A65000].End(xlUp)).Resize(, 4).Value Rng2 = Sheets("Nhap").Range(Sheets("Nhap").[B2], Sheets("Nhap").[B65000].End(xlUp)).Resize(, 3).Value Rng3 = Sheets("Xuat").Range(Sheets("Xuat").[B2], Sheets("Xuat").[B65000].End(xlUp)).Resize(, 3).Value ReDim Arr(1 To UBound(Rng1, 1), 1 To 8) For I = 1 To UBound(Rng1, 1) If Not Dic.exists(Rng1(I, 1)) Then K = K + 1 Dic.Add Rng1(I, 1), K Arr(K, 1) = K For J = 1 To 4 Arr(K, J + 1) = Rng1(I, J) Next End If Next I For I = 1 To UBound(Rng2, 1) If Dic.exists(Rng2(I, 2)) Then If Rng2(I, 1) < Sheets("Bao Cao").[D2].Value Then Arr(Dic.Item(Rng2(I, 2)), 5) = Arr(Dic.Item(Rng2(I, 2)), 5) + Rng2(I, 3) ElseIf Rng2(I, 1) >= Sheets("Bao Cao").[D2].Value And Rng2(I, 1) <= Sheets("Bao Cao").[D3].Value Then Arr(Dic.Item(Rng2(I, 2)), 6) = Arr(Dic.Item(Rng2(I, 2)), 6) + Rng2(I, 3) End If End If Next I For I = 1 To UBound(Rng3, 1) If Dic.exists(Rng3(I, 2)) Then If Rng3(I, 1) < Sheets("Bao Cao").[D2].Value Then Arr(Dic.Item(Rng3(I, 2)), 5) = Arr(Dic.Item(Rng3(I, 2)), 5) - Rng3(I, 3) ElseIf Rng3(I, 1) >= Sheets("Bao Cao").[D2].Value And Rng3(I, 1) <= Sheets("Bao Cao").[D3].Value Then Arr(Dic.Item(Rng3(I, 2)), 7) = Arr(Dic.Item(Rng3(I, 2)), 7) + Rng3(I, 3) End If Arr(Dic.Item(Rng3(I, 2)), 8) = Arr(Dic.Item(Rng3(I, 2)), 5) + Arr(Dic.Item(Rng3(I, 2)), 6) - Arr(Dic.Item(Rng3(I, 2)), 7) End If Next I If K Then Sheets("Bao Cao").[A5].Resize(K, 8).Value = Arr Set Dic = Nothing End Sub