VBA,Excel,使用Range填充2D阵列

时间:2016-01-15 20:28:20

标签: vba excel-vba excel

我不明白这种行为:

Sub tuEs()
    Dim A() As Variant
    A = Range("A1:A10") ' works

    Dim B() As Variant
    B = ActiveSheet.Range("A1:A10") ' Type mismatch
End Sub

第一个版本的第二个版本没有。为什么?有什么区别?

3 个答案:

答案 0 :(得分:3)

采用这种方法的方法是在范围的末尾添加“.value”。这通常是一个很好的想法,使事情非常明确(你可以省略这个的原因是因为value是范围对象的默认属性)

我将所有值添加到手表中以查看发生了什么,并且显然存在Excel无法有效(并隐式)强制转换对象的问题。请注意图中失败的表达式“ActiveSheet.Range(”A1:A10“)的类型是:Variant / Object / Range;从Variant到object的转换很可能导致问题。

enter image description here

强制它正确投射的一种方法是将过程拆分为两部分,第一部分转换为范围,第二部分转换为变量数组。看看我的例子

另请注意,如果您将变量单独声明为变体而不是变体数组(dim E而不是Dim E()),它将获得它,因为它将适应所需的变量。

Sub tuEs()

    'Works
    Dim A() As Variant
    A = Range("A1:A10")

    ' Type missmatch
    Dim B() As Variant
    B = ActiveSheet.Range("A1:A10")

    ' Fix to make it cast properly
    Dim C() As Variant
    Dim r As Range
    Set r = ActiveSheet.Range("A1:A10")
    C = r

    ' Best of all options
    Dim d As Variant
    d = ActiveSheet.Range("A1:A10").Value    

End Sub

希望这一点有点明确。

答案 1 :(得分:0)

这确实是个谜!但是这样做(不需要声明变量对象的数组,只需要一个变体)。至于为什么它在你的代码中不起作用,我恐怕无法回答。

Dim B As Variant ' instead of Dim B() as Variant
B = ActiveSheet.Range("A1:A10")

答案 2 :(得分:-1)

起初我认为这是一个语法问题 - 一些隐藏的歧义导致解释器对不同的语句做出不同的响应。但令我沮丧的是,以下代码完美无缺:

Dim B() as Variant
B = Application.Range("A1:A10")

由于它在语法上与问题中的崩溃线相同,唯一可能的结论是,AFAIK是工作表和Application类中Range的实现返回不同类型的对象,即使它们实际上包含相同的信息。大多数强制转换都会呈现相同的结果,但对于某些实现怪癖,只有Application版本可以转换为变量数组。这一结论得到以下事实的支持:在调试模式下检查表达式Range("A1:A10")ActiveSheet.Range("A1:A10")的结果会导致不同类型信息 - 第一种情况下的“对象/范围”和第二个中的“Variant / Object / Range”。

如果这是真的,差异的确切原因(如果不是偶然的话)可能只有MS的编码员或其他人知道。我很好奇,如果这是通过不同版本的Office一致..