Dùng advanced filter cũng được. Tôi ghi lại động tác và được code như sau:Hiện tại em có sheet dữ liệu 50.000 dòng nhưng muốn lấy danh mục duy nhất cột A và cột D, không lấy cột B và C, đưa dữ liệu vào cột I và cột J duy nhất không trùng lặp bằng cách dùng scipt dictionary. Mong các anh chị hỗ trợ giúp em code đơn giản nhất.
Sub Macro1()
'
' Macro1 Macro
'
'
Range("A1:D50000").AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Range( _
"I1:J1"), Unique:=True
End Sub
Sub Macro1()
'
' Macro1 Macro
'
Dim Dic As Object, sArr(), dArr(), I As Long, K As Long, Tem As String
Set Dic = CreateObject("Scripting.Dictionary")
With Sheet1
sArr = .Range("A2", .Range("A65535").End(3)).Resize(, 4).Value
ReDim dArr(1 To UBound(sArr, 1), 1 To 2)
For I = 1 To UBound(sArr, 1)
Tem = sArr(I, 1) & "#" & sArr(I, 4)
If Not Dic.Exists(Tem) Then
K = K + 1
Dic.Add Tem, K
dArr(K, 1) = sArr(I, 1)
dArr(K, 2) = sArr(I, 4)
End If
Next I
.Range("I2").Resize(K, 2) = dArr
End With
Set Dic = Nothing
End Sub
Sao máy em nó vẫn chạy bình thườngchạy báo lỗi nhờ bá kiểm tra lại
View attachment 182234
Bình thường thì máy mình nó tự cho ra cái code như sau:Máy em Record Macro nó ra vầy:
Mã:Sub Macro1() ' ' Macro1 Macro ' Dim Dic As Object, sArr(), dArr(), I As Long, K As Long, Tem As String Set Dic = CreateObject("Scripting.Dictionary") With Sheet1 sArr = .Range("A2", .Range("A65535").End(3)).Resize(, 4).Value ReDim dArr(1 To UBound(sArr, 1), 1 To 2) For I = 1 To UBound(sArr, 1) Tem = sArr(I, 1) & "#" & sArr(I, 4) If Not Dic.Exists(Tem) Then K = K + 1 Dic.Add Tem, K dArr(K, 1) = sArr(I, 1) dArr(K, 2) = sArr(I, 4) End If Next I .Range("I2").Resize(K, 2) = dArr End With Set Dic = Nothing End Sub
Sub Macro1()
'
' Macro1 Macro
'
'
Dim cn As Object
Set cn = CreateObject("ADODB.Connection")
cn.Open ("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=""Excel 12.0;HDR=No;IMEX=1"";")
[I2].CopyFromRecordset cn.Execute("SELECT DISTINCT F1,F4 FROM [Sheet1$A2:D50000] WHERE F1 IS NOT NULL")
End Sub
Máy em Record Macro nó ra vầy:
Mã:For I = 1 To UBound(sArr, 1) Tem = sArr(I, 1) & "#" & sArr(I, 4) If Not Dic.Exists(Tem) Then K = K + 1 Dic.Add Tem, K dArr(K, 1) = sArr(I, 1) dArr(K, 2) = sArr(I, 4) End If Next I
Có bác nào dùng scipt dictionary không cho em xin chỉ giáo với, chứ các cái này em cũng nắm rồi. Mong hướng dẫn code bằng scipt dictionary
Không hiểu sao, máy của mình sao nó chạy ra như sau:Máy mấy bạn ở trên hay quá..., máy mình nó ra vậy nè:
Mã:Option Explicit Sub Macro1() ' ' Macro1 Macro ' ' Range("A:A,D:D").Select Range("D1").Activate Selection.Copy Columns("I:J").Select ActiveSheet.Paste Columns("I:J").Select ActiveSheet.Range("$I$1:$J$68").RemoveDuplicates Columns:=Array(1, 2), Header _ :=xlNo End Sub
Sub Macro2()
'
' Macro2 Macro
'
'
Range("A:A,D:D").Copy [I1]
Range("I:J").RemoveDuplicates Columns:=Array(1, 2)
End Sub
TmpArr1 = shDuLieu.Range("A1:D" & CStr(iLastRow)).Value
For iRow = 1 To UBound(TmpArr1, 1)
If Not Dic1.exists(Trim(TmpArr1(iRow, 1)) & Trim(TmpArr1(iRow, 4)) ) Then
i = i + 1
Dic1.Add Trim(TmpArr1(iRow, 1)) & Trim(TmpArr1(iRow, 4)) , i 'Dua key phuc hop vao Dic.
................
Else
j = Dic1.Item(Trim(TmpArr1(iRow, 1)) & Trim(TmpArr1(iRow, 4))) 'lay thu tu dong cua gia tri key trung
........
End If
Next iRow
ActiveSheet.Range("A1").Resize(i, j).Value = arr