有没有人知道如何在VBA中避免执行类似代码的类型不匹配错误消息:
For i = 1 To DataRange.Columns.Count
'MyArray(i) = i
text1 = text1 & i & "|"
Next
text1 = Left(text1, Len(text1) - 1)
MyArray = Split(text1, "|")
DataRange.RemoveDuplicates Columns:=VBA.Array(MyArray)
我在模块中使用Option Base 1语句,MyArray由1到36之间的数字组成,并声明为Variant。当我将此示例修改为
时DataRange.RemoveDuplicates Columns:=VBA.Array(1,2,3,4,5 etc)
它有效,但它是硬编码的,看起来很糟糕。有什么建议?
答案 0 :(得分:2)
我认为你的问题是VBA.Array(MyArray)实际上是从MyArray创建一个数组。 你想要的只是来自MyArray的专栏。
尝试
DataRange.RemoveDuplicates Columns:=(MyArray)
Range.Removeduplicates中列的数据类型是变体。
对于Option Base 1,您必须创建一个基于零的数组并将MyArray值传输给它。
ReDim zeroarray(0 To UBound(MyArray) - 1) As Variant
For i = 0 To UBound(myarray) - 1
zeroarray(i) = myarray(i + 1)
Next i
DataRange.RemoveDuplicates Columns:=(zeroarray)
答案 1 :(得分:1)
如果MyArray
是一个数组,那么你应该只做
DataRange.RemoveDuplicates Columns:=(MyArray)
VBA Array function
将逗号分隔的值列表作为参数。
您正在做的是将您的数组放入另一个数组中,这不是RemoveDuplicates
所期望的。
? Array(1,2,3)(0)
1
? Array(Array(1,2,3))(0)
> Type mismatch
? Array(Array(1,2,3))(0)(0)
1
编辑:支持mooseman的道具,你实际上需要围绕MyArray的括号。 (some hints why)
MyArray = Array(1, 2, 3)
rng.RemoveDuplicates Columns:=MyArray
运行时错误5:无效的过程调用或参数
MyArray = Array(1, 2, 3)
rng.RemoveDuplicates Columns:=(MyArray)
作品