vba中的dim和set有什么区别

请原谅我是VBA的新手。

有时候我用

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

其他时间我使用

 Set r = Range("A1") 

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

除非引用对象引用,否则没有理由使用set 。 在这种情况下使用它是个好习惯。 对于所有其他简单的数据types,只需使用赋值运算符即可。 调dim (维度)所有variables是一个好主意,但是:

简单的数据types的例子是integerlong integerbooleanstring 。 这些只是数据types,并没有自己的方法和属性。

 Dim i as Integer i = 5 Dim myWord as String myWord = "Whatever I want" 

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

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

如果你尝试使用没有Set的最后一行,VB会抛出一个错误。 现在你已经声明了一个object你可以访问它的属性和方法。

 myString = myRange.Value 
  • Dim 声明variables 。

     Dim r As Range 
  • Set variables设置为对象引用 。

     Set r = Range("A1") 

不过,我不认为这是你真正要问的。

有时我使用:

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

这将永远不会工作。 如果没有Set您将收到运行时错误#91 对象variables或未设置块variables 。 这是因为您必须使用Set将variables值分配给对象引用。 那么上面的代码工作。

我认为下面的代码说明了你真正想问什么。 假设我们没有声明一个types,而是让它成为一个Varianttypes。

 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被设置为包含单元格“A1”的Range

     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是一个RangeVariant对象,使用Dim语句 – 除非你没有Option Explicit enabled,你应该这样做。 总是。 否则,您正在使用您尚未声明的标识符,它们都被隐式声明为Variants 。

Dim:你正在定义一个variables(这里:r是一个Rangetypes的variables)

设置:你正在设置属性(这里:设置r的值为范围(“A1”) – 这不是一个types,而是一个值)。

你必须用对象来设置,如果r是一个简单的types(例如int,string),那么你只需要写:

Dim r As Integer r = 5

Dim简单地声明值和types。

Set为variables赋值。

如果一个variables被定义为一个对象,例如Dim myfldr As Folder,则使用关键字“Set”分配一个值。

根据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` 

实际上所有的变数都是一样的!