up tạm file dùng công thức, (mục đích chống trôi bài), vì mình phải sử dụng nhiều cột phụ quá, e là không tối ưuChào anh/chị!
Em đang có một bài toán cần nhờ a chị giúp đỡ
Em muôn tạo một danh sách mới từ danh sách ban đầu nhưng lại dựa vào các điều kiện từ danh sách khác
Cụ thể em để như tệp đính kèm ạ
Các anh/chị xem và giúp đỡ em với nhé
Em cảm ơn ạ!
Thử code dưới xem saoChào anh/chị!
Em đang có một bài toán cần nhờ a chị giúp đỡ
Em muôn tạo một danh sách mới từ danh sách ban đầu nhưng lại dựa vào các điều kiện từ danh sách khác
Cụ thể em để như tệp đính kèm ạ
Các anh/chị xem và giúp đỡ em với nhé
Em cảm ơn ạ!
Option Explicit
Sub zzz()
Dim DS1
Dim DS3
Dim DS2
Dim i, j, k
With Sheet1
DS1 = .Range("A4", .Range("A4").End(xlDown))
DS3 = .Range("G4", .Range("H4").End(xlDown))
End With
ReDim DS2(1 To UBound(DS1), 1 To 1)
With CreateObject("Scripting.Dictionary")
For i = 1 To UBound(DS3)
If .exists(DS3(i, 1)) = False And .exists(DS3(i, 2)) = False Then
k = k + 1
.Item(DS3(i, 1)) = k
.Item(DS3(i, 2)) = k
DS2(k, 1) = DS3(i, 1) & "/" & DS3(i, 2)
Else
If .exists(DS3(i, 1)) = False Then
k = .Item(DS3(i, 2))
.Item(DS3(i, 1)) = k
DS2(k, 1) = DS2(k, 1) & "/" & DS3(i, 1)
Else
If .exists(DS3(i, 2)) = False Then
k = .Item(DS3(i, 1))
.Item(DS3(i, 2)) = k
DS2(k, 1) = DS2(k, 1) & "/" & DS3(i, 2)
End If
End If
End If
Next i
For i = 1 To UBound(DS1)
If .exists(DS1(i, 1)) Then DS1(i, 1) = ""
Next i
End With
If k < UBound(DS2) Then
For i = 1 To UBound(DS1)
If DS1(i, 1) <> "" Then
k = k + 1
DS2(k, 1) = DS1(i, 1)
End If
Next i
End If
With Sheet1
.Range("K4").Resize(UBound(DS2), 1).ClearContents
.Range("K4").Resize(UBound(DS2), 1) = DS2
.Range("K4").Resize(UBound(DS2), 1).Columns.AutoFit
End With
End Sub
Em cảm ơn bác ạup tạm file dùng công thức, (mục đích chống trôi bài), vì mình phải sử dụng nhiều cột phụ quá, e là không tối ưu
Em vừa thử thấy nó chạy ra đúng rồi bác ạThử code dưới xem sao
Mã:Option Explicit Sub zzz() Dim DS1 Dim DS3 Dim DS2 Dim i, j, k With Sheet1 DS1 = .Range("A4", .Range("A4").End(xlDown)) DS3 = .Range("G4", .Range("H4").End(xlDown)) End With ReDim DS2(1 To UBound(DS1), 1 To 1) With CreateObject("Scripting.Dictionary") For i = 1 To UBound(DS3) If .exists(DS3(i, 1)) = False And .exists(DS3(i, 2)) = False Then k = k + 1 .Item(DS3(i, 1)) = k .Item(DS3(i, 2)) = k DS2(k, 1) = DS3(i, 1) & "/" & DS3(i, 2) Else If .exists(DS3(i, 1)) = False Then k = .Item(DS3(i, 2)) .Item(DS3(i, 1)) = k DS2(k, 1) = DS2(k, 1) & "/" & DS3(i, 1) Else If .exists(DS3(i, 2)) = False Then k = .Item(DS3(i, 1)) .Item(DS3(i, 2)) = k DS2(k, 1) = DS2(k, 1) & "/" & DS3(i, 2) End If End If End If Next i For i = 1 To UBound(DS1) If .exists(DS1(i, 1)) Then DS1(i, 1) = "" Next i End With If k < UBound(DS2) Then For i = 1 To UBound(DS1) If DS1(i, 1) <> "" Then k = k + 1 DS2(k, 1) = DS1(i, 1) End If Next i End If With Sheet1 .Range("K4").Resize(UBound(DS2), 1).ClearContents .Range("K4").Resize(UBound(DS2), 1) = DS2 .Range("K4").Resize(UBound(DS2), 1).Columns.AutoFit End With End Sub
office 2016 của em khi chạy sẽ báo công thức không tồn tại bác ạ. bác dùng bản nào thế ạThử bài này với công thức.
View attachment 303593Mã:=LET(t,G4:H10,UNIQUE(MAP(A4:A19,LAMBDA(m,TEXTJOIN("/",,UNIQUE(SORT(TOCOL(FILTER(t,MMULT(N(t=m),{1;1}),m)))))))))
Công thức này dùng cho excel 365 thôi.office 2016 của em khi chạy sẽ báo công thức không tồn tại bác ạ. bác dùng bản nào thế ạ
Option Explicit
Sub monan()
Dim lr&, i&, j&, k&, t&, s As String, ds1, ds3, sp
Dim ds2(1 To 10000, 1 To 1), arr(1 To 10000, 1 To 2)
Dim dic As Object
Set dic = CreateObject("Scripting.Dictionary")
ds1 = Range("A4:A" & Range("A4").End(xlDown).Row).Value
lr = Range("G4").End(xlDown).Row
ds3 = Range("G4:H" & lr).Value
For i = 1 To UBound(ds3)
For j = 1 To 2
s = ds3(i, IIf(j = 1, 2, 1))
If Not dic.exists(ds3(i, j)) Then
dic.Add ds3(i, j), "/" & ds3(i, j) & "/" & s
k = k + 1: arr(k, 1) = ds3(i, j): arr(k, 2) = dic(ds3(i, j))
Else
dic(ds3(i, j)) = dic(ds3(i, j)) & "/" & s
For t = 1 To k
If arr(t, 1) = ds3(i, j) Then arr(t, 2) = dic(ds3(i, j))
Next
End If
Next
Next
dic.RemoveAll: t = 0
For i = 1 To k
For j = 1 To k
If i <> j And InStr(1, arr(j, 2), "/" & arr(i, 1)) Then
arr(i, 2) = arr(i, 2) & arr(j, 2)
End If
Next
Next
For i = 1 To k
sp = Split(arr(i, 2), "/"): s = ""
For j = 1 To UBound(sp)
If Not dic.exists(sp(j)) Then
dic.Add sp(j), ""
s = IIf(s = "", "", s & "/") & sp(j)
End If
Next
If s <> "" Then
t = t + 1: ds2(t, 1) = s
End If
Next
For i = 1 To UBound(ds1)
If WorksheetFunction.CountIf(Range("G4:H" & lr), ds1(i, 1)) = 0 Then
t = t + 1: ds2(t, 1) = ds1(i, 1)
End If
Next
If t > 0 Then
With Range("D4")
.Resize(10000, 1).ClearContents
.Resize(t, 1).Value = ds2
End With
End If
Set dic = Nothing
End Sub
Tuyệt vời quáPost xong mới thấy chậm hơn CHAOQUAY.
Bụng đang đói mà lại làm về chủ đề này nên bị phân tâm
PHP:Option Explicit Sub monan() Dim lr&, i&, j&, k&, t&, s As String, ds1, ds3, sp Dim ds2(1 To 10000, 1 To 1), arr(1 To 10000, 1 To 2) Dim dic As Object Set dic = CreateObject("Scripting.Dictionary") ds1 = Range("A4:A" & Range("A4").End(xlDown).Row).Value lr = Range("G4").End(xlDown).Row ds3 = Range("G4:H" & lr).Value For i = 1 To UBound(ds3) For j = 1 To 2 s = ds3(i, IIf(j = 1, 2, 1)) If Not dic.exists(ds3(i, j)) Then dic.Add ds3(i, j), "/" & ds3(i, j) & "/" & s k = k + 1: arr(k, 1) = ds3(i, j): arr(k, 2) = dic(ds3(i, j)) Else dic(ds3(i, j)) = dic(ds3(i, j)) & "/" & s For t = 1 To k If arr(t, 1) = ds3(i, j) Then arr(t, 2) = dic(ds3(i, j)) Next End If Next Next dic.RemoveAll: t = 0 For i = 1 To k For j = 1 To k If i <> j And InStr(1, arr(j, 2), "/" & arr(i, 1)) Then arr(i, 2) = arr(i, 2) & arr(j, 2) End If Next Next For i = 1 To k sp = Split(arr(i, 2), "/"): s = "" For j = 1 To UBound(sp) If Not dic.exists(sp(j)) Then dic.Add sp(j), "" s = IIf(s = "", "", s & "/") & sp(j) End If Next If s <> "" Then t = t + 1: ds2(t, 1) = s End If Next For i = 1 To UBound(ds1) If WorksheetFunction.CountIf(Range("G4:H" & lr), ds1(i, 1)) = 0 Then t = t + 1: ds2(t, 1) = ds1(i, 1) End If Next If t > 0 Then With Range("D4") .Resize(10000, 1).ClearContents .Resize(t, 1).Value = ds2 End With End If Set dic = Nothing End Sub