请原谅我是VBA的新手。
有时候我用
Dim r as Range
r = Range("A1")
其他时候我用
Set r = Range("A1")
有什么不同?我什么时候应该使用什么?
Answers:
set
除非引用对象引用,否则没有理由使用。最好在这种情况下使用它。对于所有其他简单数据类型,只需使用赋值运算符。但是,dim
(维度)所有变量是一个好主意:
简单数据类型的例子是integer
,long
,boolean
,string
。这些只是数据类型,没有自己的方法和属性。
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
Set
不用先Dim
输入变量就可以使用吗?
Dim
声明变量。
Dim r As Range
Set
将变量设置为对象引用。
Set r = Range("A1")
但是,我认为这不是您真正要问的。
有时我使用:
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
因此,让我们分解一下这里发生的情况。
r
声明为Variant
`Dim r` ' TypeName(r) returns "Empty", which is the value for an uninitialized variant
r
设置为Range
包含单元格“ A1”
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
是aRange
或Variant
object ,这将无法工作Dim
-除非您未Option Explicit
启用,否则应该这样做。总是。否则,您使用的是尚未声明的标识符,它们都隐式声明为 Variants。
昏暗:您正在定义一个变量(这里:r是Range类型的变量)
设置:您正在设置属性(此处:将r的值设置为Range(“ A1”)-这不是类型,而是值)。
您必须将set与对象一起使用,如果r是简单类型(例如int,string),则只需编写:
Dim r As Integer
r=5
Dim
只需声明值和类型。
Set
为变量分配一个值。
Dim
Dimension的缩写,在VBA和VB6中用于声明局部变量。
另一方面,与变量声明无关。该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`
实际上,所有变量都相同!