Option Base 1和RemoveDuplicates VBA问题

时间:2017-09-29 13:37:10

标签: excel vba excel-vba

有没有人知道如何在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)  

它有效,但它是硬编码的,看起来很糟糕。有什么建议?

2 个答案:

答案 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)
  

作品