繁体   English   中英

vba中dim和set有什么区别

[英]What is the difference between dim and set in vba

请原谅我是 VBA 的新手。

有时我用

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

其他时候我用

Set r = Range("A1")

有什么不同? 我什么时候应该使用什么?

除非引用对象引用,否则没有理由使用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

但是,我认为这不是您真正要问的。

有时我使用:

 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

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

  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")

如果不首先使用Dim语句声明rRangeVariant对象,这将不起作用 - 除非您没有启用Option Explicit ,您应该这样做。 总是。 否则,您将使用尚未声明的标识符,并且它们都被隐式声明为Variants

Dim:您正在定义一个变量(此处:r 是 Range 类型的变量)

设置:您正在设置属性(此处:将 r 的值设置为 Range("A1") - 这不是类型,而是值)。

您必须对对象使用 set,如果 r 是一个简单类型(例如 int、string),那么您只需编写:

Dim r As Integer
r=5

Dim只是声明了值和类型。

Set为变量赋值。

如果将变量定义为对象,例如 Dim myfldr As Folder,则使用关键字“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`

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM