在vba中dim和set之间有什么区别

时间:2010-10-06 12:22:08

标签: vba excel-vba vb6 excel

请原谅我是VBA的新手。

有时候我会用

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

其他时候我使用

Set r = Range("A1")

有什么区别?什么时候应该使用什么?

7 个答案:

答案 0 :(得分:68)

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

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

Dim i as Integer
i = 5

Dim myWord as String
myWord = "Whatever I want"

object的示例包括RangeWorksheetWorkbook。它们有自己的方法和属性。

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

如果您尝试使用不带Set的最后一行,VB将抛出错误。现在您已声明object,您可以访问其属性和方法。

myString = myRange.Value

答案 1 :(得分:58)


但是,我认为这不是你真正想要的。

  

有时我会使用:

    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

所以,让我们分解这里发生的事情。

  1. r被声明为变体

    `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"
    
  4. 在这种情况下,Range的默认属性为.Value,因此以下两行代码是等效的。

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

    有关默认对象属性的更多信息,请参阅Chip Pearson's "Default Member of a Class"


    至于您的Set示例:

      

    其他时候我使用

    Set r = Range("A1")
    

    如果没有先声明rRangeVariant对象...使用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`

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