【问题标题】:Declare and use range in vba在 vba 中声明和使用范围
【发布时间】:2015-02-08 19:32:41
【问题描述】:

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

这怎么可能?

【问题讨论】:

标签: excel vba range


【解决方案1】:

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

Range 是一个对象 - Variant 可以是任何东西 包括一个对象。

这是正确的做法:

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

因为:

  1. 您将rg 明确声明为Range 对象。
  2. 您正确地使用 Set 关键字分配对象引用。

如果您没有指定 Set 关键字,则您正在使用 VBA 语法为 values 赋值分配对象引用,这是一个错误:

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 - 要确认您的推理此处是指向 cpearson 的链接,请滚动至 Pay Attention To Variables Declared With One Dim Statement
  • Rubberduck add-in for the VBE 的下一个版本(我正在与朋友合作的一个开源项目)将包括代码检查和快速修复:)
  • 可能每个人都知道,但无论如何......如果rg 被声明为Variant,那么rg = ActiveSheet.Range("A1:B2") 将“A1:B2”的值分配给rg(不会发生错误)。 rg 然后是变量数组(1 to 2, 1 to 2)
  • @retailcoder 是的,这很有趣 :-)。我在对象浏览器中检查了它,Value 不是Range 的默认属性...至少在我的 Excel 版本中是 2007。stackoverflow.com/questions/17877536/…
  • @Albin 我从来没有说过我们不能这样做(这就是为什么完整的扩展语法在最后一个 sn-p 的评论中) - 我确实暗示我们通常 不应该 使用该语法;这就是为什么Rubberduck flags them
【解决方案2】:

扩展 Mathieu Guidon 的回答:

如果要在同一条指令(一行)中指定两个对象,则应使用以下语法:

Dim rg as Range, rg2 As Range

这将正确地将rgrg2 分配为范围对象。

正如 Mathieu Guidon 正确解释的那样,使用 Dim rg, rg2 As Range,只有 rg2 被指定为范围对象(rg 变为 Variant)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-23
    • 2012-10-22
    • 2022-01-21
    • 2013-11-19
    相关资源
    最近更新 更多