在vba中dim和set之间有什么区别

Ram*_*Ram 73 vb6 excel vba

请原谅我是VBA的新手.

有时我用

Dim r as Range
r = Range("A1")
Run Code Online (Sandbox Code Playgroud)

其他时候我用

Set r = Range("A1")
Run Code Online (Sandbox Code Playgroud)

有什么不同?什么时候应该使用什么?

Mic*_*ael 70

set除非引用对象引用,否则没有理由使用.在这种情况下只使用它是一种好习惯.对于所有其他简单数据类型,只需使用赋值运算符.dim然而,(维度)所有变量是一个好主意:

简单数据类型的例子是integer,long,boolean,string.这些只是数据类型,没有自己的方法和属性.

Dim i as Integer
i = 5

Dim myWord as String
myWord = "Whatever I want"
Run Code Online (Sandbox Code Playgroud)

一个例子object是a Range,a Worksheet或a Workbook.它们有自己的方法和属性.

Dim myRange as Range
Set myRange = Sheet1.Range("A1")
Run Code Online (Sandbox Code Playgroud)

如果你尝试不使用最后一行Set,VB将抛出一个错误.现在您已经object声明了,您可以访问其属性和方法.

myString = myRange.Value
Run Code Online (Sandbox Code Playgroud)

  • 这个答案并没有真正解释"为什么" (15认同)
  • 我可以知道您参考哪个教程或书籍了解这个吗? (3认同)

Rub*_*uck 62


但是,我不认为这是你真正要求的.

有时我用:

    Dim r as Range
    r = Range("A1")
Run Code Online (Sandbox Code Playgroud)

这永远不会奏效.没有Set您将收到运行时错误#91 对象变量或未设置块变量.这是因为您必须使用Set将变量值分配给对象引用.然后上面的代码工作.

我认为下面的代码说明了你真正要问的内容.假设我们没有声明一个类型,而是让它r成为一个Variant类型.

Public Sub test()
    Dim r
    debug.print TypeName(r)

    Set r = Range("A1")
    debug.print TypeName(r)

    r = Range("A1")
    debug.print TypeName(r)
End Sub
Run Code Online (Sandbox Code Playgroud)

所以,让我们分解这里发生的事情.

  1. r 被声明为Variant

    `Dim r` ' TypeName(r) returns "Empty", which is the value for an uninitialized variant
    
    Run Code Online (Sandbox Code Playgroud)
  2. r设置为Range包含单元格"A1"

    Set r = Range("A1") ' TypeName(r) returns "Range"
    
    Run Code Online (Sandbox Code Playgroud)
  3. r被设置为的的默认属性Range("A1").

    r = Range("A1") ' TypeName(r) returns "String"
    
    Run Code Online (Sandbox Code Playgroud)

在这种情况下,Range的默认属性是.Value,因此以下两行代码是等效的.

r = Range("A1")
r = Range("A1").Value
Run Code Online (Sandbox Code Playgroud)

有关默认对象属性的更多信息,请参阅Chip Pearson的"默认成员类".


至于你的Set例子:

其他时候我用

Set r = Range("A1")
Run Code Online (Sandbox Code Playgroud)

如果没有首先声明这r是一个RangeVariant对象...使用Dim语句 - 除非你没有Option Explicit启用,你应该这样做.总是.否则,您正在使用尚未声明的标识符,并且它们都隐式声明为 Variants.

  • @Wolf 不确定你是否知道,但 VBA 语言参考现在维护在 github 上。https://github.com/OfficeDev/VBA-content/blob/master/VBA/Language-Reference-VBA/readme.md (3认同)
  • 很好的答案 (2认同)

Tob*_*ski 7

昏暗:你正在定义一个变量(这里:r是Range类型的变量)

设置:您正在设置属性(此处:将r的值设置为Range("A1") - 这不是类型,而是值).

你必须使用set with objects,如果r是一个简单类型(例如int,string),那么你只需要写:

Dim r As Integer
r=5
Run Code Online (Sandbox Code Playgroud)