请原谅我是VBA的新手。
有时候我会用
Dim r as Range
r = Range("A1")
其他时候我使用
Set r = Range("A1")
有什么区别?什么时候应该使用什么?
答案 0 :(得分:68)
除非引用对象引用,否则没有理由使用set
。在这种情况下只使用它是一种好习惯。对于所有其他简单数据类型,只需使用赋值运算符。但dim
(维度)所有变量是个好主意:
简单数据类型的示例包括integer
,long
,boolean
,string
。这些只是数据类型,没有自己的方法和属性。
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
答案 1 :(得分:58)
Dim r As Range
Set
sets the variable to an object reference。
Set r = Range("A1")
但是,我认为这不是你真正想要的。
有时我会使用:
Dim r as Range r = Range("A1")
这永远不会奏效。如果没有Set
,您将收到运行时错误#91 Object variable or 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
被声明为变体
`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's "Default Member of a Class"。
至于您的Set
示例:
其他时候我使用
Set r = Range("A1")
如果没有先声明r
是Range
或Variant
对象...使用Dim
语句,除非您没有{{}已启用{1}},您应该这样做。总是。否则,您使用的是未声明的标识符,并且它们都隐式声明为Variants。
答案 2 :(得分:7)
Dim:你正在定义一个变量(这里:r是Range类型的变量)
设置:您正在设置属性(此处:将r的值设置为Range(“A1”) - 这不是类型,而是值)。
你必须使用set with objects,如果r是一个简单类型(例如int,string),那么你只需要写:
Dim r As Integer
r=5
答案 3 :(得分:4)
Dim
只是声明值和类型。
Set
为变量赋值。
答案 4 :(得分:1)
如果将变量定义为对象,例如Dim myfldr As Folder,使用关键字“Set”为其分配值。
答案 5 :(得分:1)
SELECT MONTHNAME(datepicker) MONTH, COUNT(*) as Total,(status = '0' )as red , (status = '1') as green ,(status = '2') as yellow
FROM mrinsert
WHERE YEAR(datepicker)=2018
GROUP BY month(datepicker);
是Dimension的缩写,在VBA和VB6中用于声明局部变量。
另一方面,设置与变量声明无关。 Dim
关键字用于将对象变量分配给新对象。
希望能为您澄清差异。
答案 6 :(得分: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`
实际上所有的变量都是一样的!