VBA 唯一值
VBA Unique values
我正在尝试查找 A 列中的所有唯一值,将唯一项复制到一个集合,然后将唯一项粘贴到另一个 sheet。该范围将是动态的。到目前为止,我得到了下面的代码,它无法将值复制到集合中,我知道问题出在定义 aFirstArray
上,因为在我尝试使其动态化之前,代码在创建集合时运行良好。
我在这方面做错了什么,因为这些项目不会进入集合,但代码只是运行到结束而没有循环。
Sub unique()
Dim arr As New Collection, a
Dim aFirstArray() As Variant
Dim i As Long
aFirstArray() = Array(Worksheets("Sheet1").Range("A2", Range("A2").End(xlDown)))
On Error Resume Next
For Each a In aFirstArray
arr.Add a, a
Next
For i = 1 To arr.Count
Cells(i, 1) = arr(i)
Next
End Sub
你可以像那样修改代码
Sub unique()
Dim arr As New Collection, a
Dim aFirstArray As Variant
Dim i As Long
aFirstArray = Worksheets("Sheet1").Range("A2", Range("A2").End(xlDown))
On Error Resume Next
For Each a In aFirstArray
arr.Add a, CStr(a)
Next
On Error GoTo 0
For i = 1 To arr.Count
Cells(i, 2) = arr(i)
Next
End Sub
您的代码失败的原因是键必须是唯一的字符串表达式,请参阅 MSDN
更新:这就是你可以用字典做的。您需要添加对 Microsoft Scripting Runtime (Tools/References) 的引用:
Sub uniqueA()
Dim arr As New Dictionary, a
Dim aFirstArray As Variant
Dim i As Long
aFirstArray = Worksheets("Sheet1").Range("A2", Range("A2").End(xlDown))
For Each a In aFirstArray
arr(a) = a
Next
Range("B1").Resize(arr.Count) = WorksheetFunction.Transpose(arr.Keys)
End Sub
只是一个替代方案,没有循环(尽管我也喜欢 Dictionary
):
Sub Test()
Dim arr1 As Variant, arr2 As Variant
With Sheet1
arr1 = .Range("A2", .Range("A2").End(xlDown))
.Range("A2", .Range("A2").End(xlDown)).RemoveDuplicates Columns:=Array(1)
arr2 = .Range("A2", .Range("A2").End(xlDown)).Value
.Range("A2").Resize(UBound(arr1)).Value = arr1
End With
End Sub
您甚至不需要填充第二个数组,但您可以将值直接转移到您正在谈论的另一个 sheet。无需使用唯一值填充任何 array/collection/dicitonary,只要您存储原始值即可。
我正在尝试查找 A 列中的所有唯一值,将唯一项复制到一个集合,然后将唯一项粘贴到另一个 sheet。该范围将是动态的。到目前为止,我得到了下面的代码,它无法将值复制到集合中,我知道问题出在定义 aFirstArray
上,因为在我尝试使其动态化之前,代码在创建集合时运行良好。
我在这方面做错了什么,因为这些项目不会进入集合,但代码只是运行到结束而没有循环。
Sub unique()
Dim arr As New Collection, a
Dim aFirstArray() As Variant
Dim i As Long
aFirstArray() = Array(Worksheets("Sheet1").Range("A2", Range("A2").End(xlDown)))
On Error Resume Next
For Each a In aFirstArray
arr.Add a, a
Next
For i = 1 To arr.Count
Cells(i, 1) = arr(i)
Next
End Sub
你可以像那样修改代码
Sub unique()
Dim arr As New Collection, a
Dim aFirstArray As Variant
Dim i As Long
aFirstArray = Worksheets("Sheet1").Range("A2", Range("A2").End(xlDown))
On Error Resume Next
For Each a In aFirstArray
arr.Add a, CStr(a)
Next
On Error GoTo 0
For i = 1 To arr.Count
Cells(i, 2) = arr(i)
Next
End Sub
您的代码失败的原因是键必须是唯一的字符串表达式,请参阅 MSDN
更新:这就是你可以用字典做的。您需要添加对 Microsoft Scripting Runtime (Tools/References) 的引用:
Sub uniqueA()
Dim arr As New Dictionary, a
Dim aFirstArray As Variant
Dim i As Long
aFirstArray = Worksheets("Sheet1").Range("A2", Range("A2").End(xlDown))
For Each a In aFirstArray
arr(a) = a
Next
Range("B1").Resize(arr.Count) = WorksheetFunction.Transpose(arr.Keys)
End Sub
只是一个替代方案,没有循环(尽管我也喜欢 Dictionary
):
Sub Test()
Dim arr1 As Variant, arr2 As Variant
With Sheet1
arr1 = .Range("A2", .Range("A2").End(xlDown))
.Range("A2", .Range("A2").End(xlDown)).RemoveDuplicates Columns:=Array(1)
arr2 = .Range("A2", .Range("A2").End(xlDown)).Value
.Range("A2").Resize(UBound(arr1)).Value = arr1
End With
End Sub
您甚至不需要填充第二个数组,但您可以将值直接转移到您正在谈论的另一个 sheet。无需使用唯一值填充任何 array/collection/dicitonary,只要您存储原始值即可。