vba中的dim和set有啥区别

Posted

技术标签:

【中文标题】vba中的dim和set有啥区别【英文标题】:What is the difference between dim and set in vbavba中的dim和set有什么区别 【发布时间】:2011-04-21 19:15:37 【问题描述】:

请原谅我是 VBA 的新手。

有时我会使用

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

我其他时候使用

Set r = Range("A1")

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

请问您是参考了哪个教程或书籍来理解这一点的吗? 这个答案并没有真正解释“为什么” VBA 非常聪明,它不需要你像很多语言那样告诉它你到底在做什么。然而,这增加了时间。如果您在各种不同的变体上使用大量不同的维度,那么它会增加时间。如果你告诉 VBA 当它看到一个变量时会发生什么,那么它就不必解决它。此外,如果您告诉 VBA 变量是整数而不是字符串,那么它不会占用太多 RAM。尽管后一点在常见的小型 VBA 项目中可能不那么有效,但它仍然是很好的编码实践。 可以在没有Dim首先使用变量的情况下使用Set吗?【参考方案2】:

Dimdeclares the variable。

Dim r As Range

Setsets 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 被声明为 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's "Default Member of a Class"。


至于您的Set 示例:

我其他时候使用

Set r = Range("A1")

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

【讨论】:

@PierreClaverie 是的 :) 它包括 DimSet 的原始引用 @Wolf 不确定您是否知道,但 VBA 语言参考现在维护在 github 上。 github.com/OfficeDev/VBA-content/blob/master/VBA/… @RubberDuck 我不知道(我是 vb* 的新手),感谢您添加此注释。 不客气@Wolf。我知道现在很难找到 VBA 和旧的 VB6 文档。【参考方案3】:

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

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

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

Dim r As Integer
r=5

【讨论】:

【参考方案4】:

Dim 只是声明了值和类型。

Set 为变量赋值。

【讨论】:

【参考方案5】:

如果一个变量被定义为一个对象,例如将 myfldr 作为文件夹,使用关键字“Set”为其赋值。

【讨论】:

【参考方案6】:

Dim是Dimension的缩写,在VBA和VB6中用于声明局部变量。

另一方面,Set 与变量声明无关。 Set 关键字用于分配一个对象变量给一个新对象。

希望能为您澄清差异。

【讨论】:

【参考方案7】:

根据 SET 语句的 VBA 帮助,它设置对对象的引用。因此,如果您更改属性,实际对象也会发生变化。

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`

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

【讨论】:

以上是关于vba中的dim和set有啥区别的主要内容,如果未能解决你的问题,请参考以下文章

VBA中ByVal和 ByRef有啥区别?

vb6里面dim和set的区别

Java中的Collection和Set接口有啥区别?

HTTP/2 协议中的 WINDOW_UPDATE 和 SETTINGS 帧有啥区别?

在 Excel VBA 中使用 New 关键字和调用 CreateObject 有啥区别?

java中 List 与Set 有啥区别?