Ah.. sơ ý!Code của thày chạy ra nó vẫn không được kết quả Sản phẩm 3 (chỉ ra sản phẩm 1 và 2) thôi.
Bản thân tôi cứ tưởng có 4 If thì có 4 End If là được, 4 End If này đặt đâu cũng thế vì không thấy lỗi.
Sub Tonghop()
Dim DL, eR As Long, i As Long, n As Long, m As Long, Tmp1, Tmp2, Dong, Cot
Dim Dic1 As Object, Dic2 As Object, KQ()
With Sheets("Sheet1")
DL = .Range(.[A2], .[C65000].End(xlUp)).Value
End With
ReDim KQ(1 To UBound(DL, 1), 1 To UBound(DL, 1))
Set Dic1 = CreateObject("Scripting.Dictionary")
Set Dic2 = CreateObject("Scripting.Dictionary")
n = 1
m = 1
For i = 1 To UBound(DL, 1)
If DL(i, 1) <> "" And DL(i, 2) <> "" Then
Tmp1 = DL(i, 1)
If Not Dic1.Exists(Tmp1) Then
n = n + 1
Dic1.Add Tmp1, n
KQ(n, 1) = Tmp1
End If
Tmp2 = DL(i, 2)
If Not Dic2.Exists(Tmp2) Then
m = m + 1
Dic2.Add Tmp2, m
KQ(1, m) = Tmp2
End If
Dong = Dic1.Item(Tmp1)
Cot = Dic2.Item(Tmp2)
KQ(Dong, Cot) = KQ(Dong, Cot) + DL(i, 3)
End If
Next
With Sheets("Sheet2")
.Cells.ClearContents
.[A1].Resize(m, n).Value = KQ
End With
End Sub
Sub Tonghop()
Dim DL, eR As Long, i As Long, n As Long, m As Long, Tmp1, Tmp2, Dong, Cot
Dim Dic1 As Object, Dic2 As Object, KQ()
With Sheets("Sheet1")
DL = .Range(.[A2], .[C65000].End(xlUp)).Value
End With
ReDim KQ(1 To UBound(DL, 1), 1 To UBound(DL, 1))
Set Dic1 = CreateObject("Scripting.Dictionary")
Set Dic2 = CreateObject("Scripting.Dictionary")
n = 1
m = 1
For i = 1 To UBound(DL, 1)
If DL(i, 1) <> "" And DL(i, 2) <> "" Then
Tmp1 = DL(i, 1)
If Not Dic1.Exists(Tmp1) Then
n = n + 1
Dic1.Add Tmp1, n
Dong = Dic1.Item(Tmp1)
KQ(n, 1) = Tmp1
End If
Tmp2 = DL(i, 2)
If Not Dic2.Exists(Tmp2) Then
m = m + 1
Dic2.Add Tmp2, m
Cot = Dic2.Item(Tmp2)
KQ(1, m) = Tmp2
End If
KQ(Dong, Cot) = KQ(Dong, Cot) + DL(i, 3)
End If
Next
With Sheets("Sheet2")
.Cells.ClearContents
.[A1].Resize(m, n).Value = KQ
End With
End Sub
Dong = Dic1.Item(Tmp1)
Cot = Dic2.Item(Tmp2)
- Khi bạn duyệt qua vòng lập từ trên xuống, bạn Add từng cái tmp1 vào Dic1 và tmp2 vào Dic2, đúng không?Ghi chú: 2 Code trên khác nhau là do thứ tự đặt 2 lệnh vị trí khác nhau
nhưng chưa hình dung được khi hoạt động thì nó khác nhau như thế nào nhỉ?PHP:Dong = Dic1.Item(Tmp1) Cot = Dic2.Item(Tmp2)
KQ muốn cộng dồn được thì phải xác định Dong, Cot trước, đúng không? Vì KQ(Dong, Cot) = KQ(Dong, Cot) + DL(i, 3)Vâng vâng, chỗ này có khi tôi chưa hiểu lắm về Dic thì phải, nhất trí KQ phải cộng sau End If rồi, nhưng Dong và Cot có thể đã xác định trước End If cũng được chứ hả bác.
Xin bác hộ cho tôi hiểu chỗ này với.
If Not Dic2.Exists(Tmp2) Then
m = m + 1
Dic2.Add Tmp2, m
KQ(1, m) = Tmp2
Cot = Dic2.Item(Tmp2)
End If
If Not Dic2.Exists(Tmp2) Then
m = m + 1
Dic2.Add Tmp2, m
KQ(1, m) = Tmp2
End If
Cot = Dic2.Item(Tmp2)
If Not Dic2.Exists(Tmp2) Then
m = m + 1
Dic2.Add Tmp2, m
KQ(1, m) = Tmp2
End If
Cot = Dic2.Item(Tmp2)
If Not Dic2.Exists(Tmp2) Then
m = m + 1
Dic2.Add Tmp2, m
KQ(1, m) = Tmp2
Cot = Dic2.Item(Tmp2)
End If
Thế thì 2 cách viết như sau là hoàn toàn khác nhau hả bác. Tôi cứ tưởng nó giống nhau chứ
PHP:If Not Dic2.Exists(Tmp2) Then m = m + 1 Dic2.Add Tmp2, m KQ(1, m) = Tmp2 Cot = Dic2.Item(Tmp2) End If
và cách viết
PHP:If Not Dic2.Exists(Tmp2) Then m = m + 1 Dic2.Add Tmp2, m KQ(1, m) = Tmp2 End If Cot = Dic2.Item(Tmp2)
Giải thích như bác kyo là chuẩn, dễ hiểu quá rồi.