我对VBA很陌生,
今天开发一个宏我发现了一些有趣的东西
像这样使用Range
正在发挥作用:
Dim rg As Range
Set rg = ActiveSheet.Range("A1:B2")
像这样使用Range
不起作用并导致错误“对象变量未设置”:
Dim rg As Range
rg = ActiveSheet.Range("A1:B2")
但是像这样使用Range
正在发挥作用:
Dim rg,rg2 As Range
rg = ActiveSheet.Range("A1:B2")
怎么可能?
答案 0 :(得分:9)
您正在发现Variant
和对象引用。
Range
是对象 - Variant
可以任何 包括对象。
这是正确的方法:
Dim rg As Range
Set rg = ActiveSheet.Range("A1:B2")
由于:
rg
为Range
对象。Set
关键字指定了对象引用。如果您没有指定Set
关键字,则使用值分配的VBA语法分配对象引用,这是一个错误:
rg = ActiveSheet.Range("A1:B2")
如果您在同一条指令中声明了多个变量,并且只为最后一个指定了一个类型,那么rg
就是Variant
:
Dim rg,rg2 As Range ' this is like doing Dim rg As Variant, rg2 As Range
rg = ActiveSheet.Range("A1:B2")
VBA很乐意让你为Variant
分配任何 ......但事情会在运行时爆炸。
答案 1 :(得分:1)
扩展Mathieu Guidon的答案:
如果要在同一条指令(一行)中指定两个对象,则应使用以下语法:
Dim rg as Range, rg2 As Range
这将正确地将rg
和rg2
都指定为范围对象。
正如Mathieu Guidon正确解释的那样,使用Dim rg, rg2 As Range
,仅将rg2分配为愤怒对象(rg成为变体)。