Arrays 删除VBA数组中的重复项
代码工作正常。根据响应的帮助进行修改 我有以下代码从数组MyArray中删除重复项。代码在以下位置获取调试错误:Arrays 删除VBA数组中的重复项,arrays,excel,vba,Arrays,Excel,Vba,代码工作正常。根据响应的帮助进行修改 我有以下代码从数组MyArray中删除重复项。代码在以下位置获取调试错误:d(MyArray(i))=1。错误下标超出范围。不确定是什么原因造成的,我的代码有什么问题 Sub DataStats1() Dim Range1 As Range Dim MyArray As Variant Set Range1 = Application.InputBox("Select Range1:", Title:="Set Data Range", Type:=8)
d(MyArray(i))=1
。错误下标超出范围。不确定是什么原因造成的,我的代码有什么问题
Sub DataStats1()
Dim Range1 As Range
Dim MyArray As Variant
Set Range1 = Application.InputBox("Select Range1:", Title:="Set Data Range", Type:=8)
Range1.Select
MyArray = Application.Transpose(Application.Transpose(Range1.Value))
Dim d As Object
Set d = CreateObject("Scripting.Dictionary")
For Each el In MyArray
d(el) = 1
Next
Dim v As Variant
v = d.Keys()
For i = 1 To UBound(v)
MsgBox v(i)
Next i
End Sub
您应该学会停止依赖
选择
(这就是您声明变量的原因…)。您可以改为执行MyArray=Range1.Value
现在,范围数组总是二维的,如果选择列范围,则实际上需要这样做:
MyArray=Application.Transpose(Range1.Value)
或者,如果要选择行范围,请执行以下操作:
MyArray=Application.Transpose(Application.Transpose(Range1.Value)
如果是多维范围,您可能需要执行其他操作。我还没有测试
以下是一些想法:
Sub DataStats1()
Dim Range1 As Range
Dim MyArray As Variant
Dim v As Variant
Dim d As Object
Set Range1 = Application.InputBox("Select Range1:", Title:="Set Data Range", Type:=8)
MyArray = Application.Transpose(Application.Transpose(Range1.Value))
Set d = CreateObject("Scripting.Dictionary")
For Each el In MyArray
d(el) = 1
Next
'## Assign the Keys to an array:
v = d.Keys
'## At this point, v is an array of unique values.
' Do whatever you want with it:
'
'Print the list to a COLUMN new sheet:
Sheets.Add
Range("A1").Resize(UBound(v) + 1).Value = Application.Transpose(v)
'Or print the list to a msgBox:
MsgBox Join(v, ", ")
'Or print to the console:
Debug.Print Join(v, ", ")
End Sub
类似这样的内容(对于给定的单列或单行,使用转置
)
@simoco谢谢,我没有意识到我可以这样做。我想我不能选择答案,因为我的名声不好。我只是回去为他们中的许多人选择答案。关于你的Q:
MyArray
始终是2D数组,即使你选择单行/列范围。例如,对于单列范围,你应该使用d(MyArray(I,1))=1
而不是d(MyArray(i))=1
。但我建议您将i=LBound(MyArray)的更改为UBound(MyArray)
以表示MyArray中每个el的,然后再更改d(el)=1
@simoco我已经做了您建议的更改,并将v作为空数组。更新了上面的代码。您从未向v
添加任何内容。您的意思可能是v=d.Keys()
。我正在查看您的初始代码(第二行)。无论如何,请检查“局部变量”窗口并使用debug.print调试代码。例如,请检查字典的内容。然后将字典中的值分配给数组。但不确定这是否是最明显的方法。如果要从数组中删除重复项,请检查例如:为什么必须同时转置这两个范围。My understanding是一个二维数组,宽度为1,高度为任意数字。您不需要只转换列范围吗?范围数组区域始终是二维的,这就是为什么您必须将它们转换为一维数组(如果您不相信我,请自己尝试:))。或者,您可以使用多维数组。为什么呢?我不知道为什么,事情就是这样。可能是为了模拟范围对象的单元格(\u行、\u列)
结构。如果MyRange.Cells(1,1)
与MyArray(1,1)
不同,则会令人困惑。但我不确定这一点,我只是觉得这可能是原因。
Sub DataStats1()
Dim Rng1 As Range
Dim MyArray As Variant
Dim MyArray2 As Variant
Dim el
Dim d As Object
On Error Resume Next
Set Rng1 = Application.InputBox("Select Range1:", Title:="Set Data Range", Type:=8)
On Error GoTo 0
If Rng1 Is Nothing Then Exit Sub
MyArray = Application.Transpose(Application.Transpose(Rng1.Value))
Set d = CreateObject("Scripting.Dictionary")
For Each el In MyArray
If Not d.exists(el) Then d.Add el, 1
Next
MyArray2 = d.items
End Sub