Hình như anh muốn kết quả nhập trực tiếp vào vùng chứa các cột A, B, C thì phảiRất mong các anh em trên GPE xem và giúp dùm code cho việc tìm kiếm theo đúng tên khách hàng và đúng loại cung cấp. Yêu cầu cụ thể được ghi trong file đính kèm. Cám ơn
Public Sub Loc()
Dim VungA, VungB, d, I, Gom, K, kK
VungA = Range([A2], [A10000].End(xlUp)).Resize(, 3)
VungB = Range([G2], [G10000].End(xlUp)).Resize(, 3)
Set d = CreateObject("scripting.dictionary")
For I = 1 To UBound(VungA)
If Not d.exists(VungA(I, 1) & VungA(I, 2)) Then
K = K + 1
d.Add VungA(I, 1) & VungA(I, 2), K
End If
Next I
For I = 1 To UBound(VungB)
Gom = VungB(I, 1) & VungB(I, 2)
If Not d.exists(Gom) Then
K = K + 1
d.Add Gom, K
With [A500].End(xlUp)(2)
.Value = VungB(I, 1)
.Offset(, 1).Value = VungB(I, 2)
.Offset(, 2).Value = VungB(I, 3)
End With
Else
kK = d.Item(Gom)
Cells(kK + 1, 3) = Cells(kK + 1, 3) + VungB(I, 3)
End If
Next I
End Sub
---Hình như anh muốn kết quả nhập trực tiếp vào vùng chứa các cột A, B, C thì phải
Nếu đúng thế anh chạy thử code này xem:
ThânMã:Public Sub Loc() Dim VungA, VungB, d, I, Gom, K, kK VungA = Range([A2], [A10000].End(xlUp)).Resize(, 3) VungB = Range([G2], [G10000].End(xlUp)).Resize(, 3) Set d = CreateObject("scripting.dictionary") For I = 1 To UBound(VungA) If Not d.exists(VungA(I, 1) & VungA(I, 2)) Then K = K + 1 d.Add VungA(I, 1) & VungA(I, 2), K End If Next I For I = 1 To UBound(VungB) Gom = VungB(I, 1) & VungB(I, 2) If Not d.exists(Gom) Then K = K + 1 d.Add Gom, K With [A500].End(xlUp)(2) .Value = VungB(I, 1) .Offset(, 1).Value = VungB(I, 2) .Offset(, 2).Value = VungB(I, 3) End With Else kK = d.Item(Gom) Cells(kK + 1, 3) = Cells(kK + 1, 3) + VungB(I, 3) End If Next I End Sub
Chắc anh Tâm cần tốc độ hơn là dễ hiểuRất mong các anh em trên GPE xem và giúp dùm code cho việc tìm kiếm theo đúng tên khách hàng và đúng loại cung cấp. Yêu cầu cụ thể được ghi trong file đính kèm. Cám ơn
Dim KetQua, Dic, I As Long, j As Long, K As Long
Sub Gop()
Dim DaCo, ThemVao
Set Dic = CreateObject("Scripting.Dictionary")
DaCo = Range([C2], [A65536].End(xlUp).Offset(1)).Value
ThemVao = Range([I2], [G65536].End(xlUp).Offset(1)).Value
ReDim KetQua(1 To UBound(DaCo, 1) + UBound(ThemVao, 1), 1 To 3)
ThemDL DaCo
ThemDL ThemVao
[A2].Resize(j, 3).Value = KetQua
End Sub
Private Sub ThemDL(ByVal DL)
For I = 1 To UBound(DL, 1) - 1
If Dic.exists(DL(I, 1) & vbBack & DL(I, 2)) Then
KetQua(Dic.Item(DL(I, 1) & vbBack & DL(I, 2)), 3) = KetQua(Dic.Item(DL(I, 1) & vbBack & DL(I, 2)), 3) + DL(I, 3)
Else
j = j + 1
For K = 1 To 3
KetQua(j, K) = DL(I, K)
Next
Dic.Add DL(I, 1) & vbBack & DL(I, 2), j
End If
Next
End Sub
Theo mình, cái bảng A chắc chắn không có dữ liệu trùng ở 2 cột đầuChắc anh Tâm cần tốc độ hơn là dễ hiểu.
Mà Bác Cò chưa bẫy lỗi trường hợp vùng kết quả chưa có dữ liệu hoặc vùng kết quả có dữ liệu nhưng có những dòng dữ liệu 2 cột đầu giống nhau nhé.
Em mạng phép thay Bác Cò chuyển qua dùng mảng cho nhanh.
PHP:Dim KetQua, Dic, I As Long, j As Long, K As Long
PHP:Sub Gop() Dim DaCo, ThemVao Set Dic = CreateObject("Scripting.Dictionary") DaCo = Range([C2], [A65536].End(xlUp).Offset(1)).Value ThemVao = Range([I2], [G65536].End(xlUp).Offset(1)).Value ReDim KetQua(1 To UBound(DaCo, 1) + UBound(ThemVao, 1), 1 To 3) ThemDL DaCo ThemDL ThemVao [A2].Resize(j, 3).Value = KetQua End Sub
PHP:Private Sub ThemDL(ByVal DL) For I = 1 To UBound(DL, 1) - 1 If Dic.exists(DL(I, 1) & vbBack & DL(I, 2)) Then KetQua(Dic.Item(DL(I, 1) & vbBack & DL(I, 2)), 3) = KetQua(Dic.Item(DL(I, 1) & vbBack & DL(I, 2)), 3) + DL(I, 3) Else j = j + 1 For K = 1 To 3 KetQua(j, K) = DL(I, K) Next Dic.Add DL(I, 1) & vbBack & DL(I, 2), j End If Next End Sub