Arrays 删除VBA数组中的重复项

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)

代码工作正常。根据响应的帮助进行修改

我有以下代码从数组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)

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