在vba中声明和使用范围

时间:2014-12-10 14:43:56

标签: vba excel-vba range excel

我对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")  

怎么可能?

2 个答案:

答案 0 :(得分:9)

您正在发现Variant和对象引用。

Range对象 - Variant可以任何 包括对象。

这是正确的方法:

Dim rg As Range     
Set rg = ActiveSheet.Range("A1:B2")  

由于:

  1. 您明确声明rgRange对象。
  2. 您正确地使用Set关键字指定了对象引用。

  3. 如果您没有指定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

这将正确地将rgrg2都指定为范围对象。

正如Mathieu Guidon正确解释的那样,使用Dim rg, rg2 As Range,仅将rg2分配为愤怒对象(rg成为变体)。