我不明白这种行为:
Sub tuEs()
Dim A() As Variant
A = Range("A1:A10") ' works
Dim B() As Variant
B = ActiveSheet.Range("A1:A10") ' Type mismatch
End Sub
第一个版本的第二个版本没有。为什么?有什么区别?
答案 0 :(得分:3)
采用这种方法的方法是在范围的末尾添加“.value”。这通常是一个很好的想法,使事情非常明确(你可以省略这个的原因是因为value是范围对象的默认属性)
我将所有值添加到手表中以查看发生了什么,并且显然存在Excel无法有效(并隐式)强制转换对象的问题。请注意图中失败的表达式“ActiveSheet.Range(”A1:A10“)的类型是:Variant / Object / Range;从Variant到object的转换很可能导致问题。
强制它正确投射的一种方法是将过程拆分为两部分,第一部分转换为范围,第二部分转换为变量数组。看看我的例子
另请注意,如果您将变量单独声明为变体而不是变体数组(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一致..