vba中的dim和set有什么区别
请原谅我是VBA的新手。
有时候我用
Dim r as Range r = Range("A1")
其他时间我使用
Set r = Range("A1")
有什么不同? 什么时候该用什么?
除非引用对象引用,否则没有理由使用set
。 在这种情况下使用它是个好习惯。 对于所有其他简单的数据types,只需使用赋值运算符即可。 调dim
(维度)所有variables是一个好主意,但是:
简单的数据types的例子是integer
, long
integer
, boolean
, string
。 这些只是数据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,而是让它成为一个Variant
types。
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
那么,让我们来分析一下这里发生的事情。
-
r
被声明为Variant`Dim r` ' TypeName(r) returns "Empty", which is the value for an uninitialized variant
-
r
被设置为包含单元格“A1”的Range
Set r = Range("A1") ' TypeName(r) returns "Range"
-
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
是一个Range
或Variant
对象,使用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`
实际上所有的变数都是一样的!