在VBA数组中删除重复项

3

代码运行正确。根据回应进行了修改。

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

1
@simoco 谢谢,我没意识到我可以这样做。我以为因为我的声望低,所以不能选择答案。我刚刚回去选择了很多答案。 - user2242044
关于你的问题:MyArray始终是二维数组,即使你选择单行/列范围。例如,对于单列范围,你应该使用d(MyArray(i,1)) = 1而不是d(MyArray(i)) = 1。但我建议你将For i = LBound(MyArray) To UBound(MyArray)改为For Each el in MyArray,然后使用d(el) = 1 - Dmitry Pavliv
@simoco,我已经按照你的建议进行了更改,但是现在v是一个空数组。上面是更新后的代码。 - user2242044
最简单的方法是使用 debug.print(MyArray(i)) 来查看错误发生的时间。请注意,字典不应该有重复的键。 - html_programmer
1
我看了你的初始代码(第二行)。无论如何,检查你的本地窗口并使用debug.print来调试你的代码。例如,检查你的字典内容。然后将你的字典值分配给你的数组。不确定这是否是最明显的方法。如果你想从一个数组中删除重复项,请参考:https://dev59.com/z2fWa4cB1Zd3GeqPdA7f - html_programmer
显示剩余4条评论
2个回答

2
你应该学会不要依赖Selection(毕竟这就是你声明变量的原因...)。你可以使用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

为什么你必须转置两个范围。我的理解是数组是一个二维的,宽度为1,高度为任意数字。难道你只需要转置列范围就可以了吗? - user2242044
范围数组始终是二维的,这就是为什么你必须对它们进行转置以获得一维数组的原因(如果你不相信我,请自行尝试:))。或者,您可以使用多维数组。至于为什么?我不知道为什么,那就是它的本质。可能是为了模仿Range对象的Cells(_row_, _column_)结构。如果MyRange.Cells(1,1)MyArray(1,1)不同,那将会很令人困惑。但我不确定,这只是我认为可能的原因。 - David Zemens

1

如果你使用 Transpose,可以得到类似于以下这样的结果(适用于单列或单行)

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接