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

Kal*_*lle 5 excel vba excel-vba

我不明白这种行为:

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

    Dim B() As Variant
    B = ActiveSheet.Range("A1:A10") ' Type mismatch
End Sub
Run Code Online (Sandbox Code Playgroud)

第一个版本的第二个版本没有.为什么?有什么不同?

小智 3

解决这个问题的方法是在范围末尾添加“.value”。这通常是使事情变得非常明确的好主意(您可以省略它的原因是因为 value 是范围对象的默认属性)

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

在此输入图像描述

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

另请注意,如果您将变量单独声明为变体而不是变体数组(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
Run Code Online (Sandbox Code Playgroud)

希望这能让大家明白一些。