vba中的dim和set有什么区别


82

请原谅我是VBA的新手。

有时候我用

Dim r as Range
r = Range("A1")

其他时候我用

Set r = Range("A1")

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

Answers:


78

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

简单数据类型的例子是integerlongbooleanstring。这些只是数据类型,没有自己的方法和属性。

Dim i as Integer
i = 5

Dim myWord as String
myWord = "Whatever I want"

一个示例object是a Range,aWorksheet或a Workbook。这些都有自己的方法和属性。

Dim myRange as Range
Set myRange = Sheet1.Range("A1")

如果您尝试不使用最后一行Set,则VB将引发错误。现在您有了一个object声明,可以访问它的属性和方法。

myString = myRange.Value

3
我可以知道您指的是哪本教程或书吗?
拉姆

18
这个答案并不能真正解释“为什么”
kizzx2 2012年

1
VBA非常聪明,它不需要您像很多语言一样告诉它您在做什么。但是,这增加了时间。如果您在各种不同的变体上使用不同维度的整体主机,那么这会增加时间。如果您告诉VBA当看到一个变量时会发生什么,那么它就不必执行了。另外,如果您告诉VBA变量是整数而不是字符串,那么它不会占用太多RAM。尽管后一点在普通的小型VBA项目中可能不那么有效,但它仍然是良好的编码实践。
2013年

Set不用先Dim输入变量就可以使用吗?
solstice333

64

但是,我认为这不是您真正要问的。

有时我使用:

    Dim r as Range
    r = Range("A1")

这将永远行不通。如果没有,Set您将收到运行时错误#91 Object variable或With block variable not set。这是因为必须使用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

因此,让我们分解一下这里发生的情况。

  1. r 声明为Variant

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

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

    r = Range("A1") ' TypeName(r) returns "String"
    

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

r = Range("A1")
r = Range("A1").Value

有关默认对象属性的更多信息,请参见Chip Pearson的“类的默认成员”


至于你的Set例子:

其他时候我用

Set r = Range("A1")

如果没有先使用语句声明r是aRangeVariantobject ,这将无法工作Dim-除非您未Option Explicit启用,否则应该这样做。总是。否则,您使用的是尚未声明的标识符,它们都隐式声明为 Variants


@PierreClaverie是:)它包括原始引用点心
沃尔夫

1
@Wolf不知道您是否知道,但是VBA语言参考现在在github上维护。github.com/OfficeDev/VBA-content/blob/master/VBA/…–
RubberDuck

@RubberDuck我不知道(我是vb *的新手),感谢您添加此注释。

不客气@Wolf。我知道VBA和旧的VB6文档现在很难找到。
RubberDuck

8

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

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

您必须将set与对象一起使用,如果r是简单类型(例如int,string),则只需编写:

Dim r As Integer
r=5


2

如果将变量定义为对象,例如Dim myfldr As Folder,则使用关键字“ Set”为其分配值。


1

Dim Dimension的缩写,在VBA和VB6中用于声明局部变量。

另一方面,与变量声明无关。该Set关键字用于分配一个对象变量的新对象。

希望能为您澄清区别。


0

根据VBA对SET语句的帮助,它设置了对对象的引用。因此,如果更改属性,则实际对象也会更改。

Dim newObj as Object
Set var1=Object1(same type as Object)
Set var2=Object1(same type as Object)
Set var3=Object1(same type as Object)
Set var4=Object1(same type as Object)
Var1.property1=NewPropertyValue

其他Vars属性也会更改,因此:

Var1.property1=Var2.property1=Var3.property1=Var4.property1=Object1.Property1=NewpropertyValue`

实际上,所有变量都相同!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.