vba 中的 dim 和 set 有什么区别

What is the difference between dim and set in vba

提问人: 提问时间:10/6/2010 最后编辑:11 revs, 7 users 49%Ram 更新时间:4/15/2023 访问量:213071

问:

请原谅我是 VBA 的新手。

有时我使用

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

其他时候我使用

Set r = Range("A1")

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

Excel VBA VB6

评论

0赞 StayOnTarget 4/15/2023
我对此进行了 2 次编辑,这些编辑被回滚了......只是为了讨论...首先是从标题中删除“in VBA”,因为这会重复一个我认为违反准则且多余的标签。第二个是删除 [excel] 标签,因为尽管给出了一个 Excel 示例,但核心问题实际上并不特定于 Excel。这是 stackoverflow.com/q/349613/3195477 的欺骗目标,这是关于这个话题的一个完全普遍的问题。(也许骗子实际上应该走另一条路......

答:

12赞 Tobias Schittkowski 10/6/2010 #1

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

Set:你正在设置属性(这里:将 r 的值设置为 Range(“A1”) - 这不是一个类型,而是一个值)。

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

Dim r As Integer
r=5
4赞 Justin Niessner 10/6/2010 #2

Dim只需声明值和类型。

Set为变量赋值。

88赞 2 revs, 2 users 93%Michael #3

除非引用对象引用,否则没有理由使用。最好只在该上下文中使用它。对于所有其他简单数据类型,只需使用赋值运算符即可。但是,(维度)所有变量是个好主意:setdim

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

Dim i as Integer
i = 5

Dim myWord as String
myWord = "Whatever I want"

an 的示例是 、 或 .它们有自己的方法和属性。objectRangeWorksheetWorkbook

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

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

myString = myRange.Value

评论

3赞 Ram 10/9/2010
我能知道你参考了哪个教程或书籍来理解这一点吗?
23赞 kizzx2 1/26/2012
这个答案并没有真正解释“为什么”
1赞 Rapid 8/28/2013
VBA非常聪明,它不需要你像很多语言那样告诉它你到底在做什么。然而,这增加了时间。如果你在各种不同的变量上使用一大堆不同的维度,那么它就会增加时间。如果你告诉 VBA 当它看到一个变量时会发生什么,那么它就不必解决它。此外,如果您告诉 VBA 变量是整数而不是字符串,那么它不会占用那么多 RAM。尽管后一点在普通的小型 VBA 项目中可能不那么有效,但它仍然是很好的编码实践。
0赞 solstice333 1/6/2019
可以不先使用变量吗?SetDim
2赞 user2479175 #4

如果将变量定义为对象,例如将 myfldr 调暗为文件夹,则使用关键字“Set”为其分配一个值。

75赞 10 revs, 5 users 85%RubberDuck #5

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

有时我使用:

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

这永远行不通。否则,您将收到运行时错误 #91 Object variable 或 With block variable not set。这是因为必须用于将变量值分配给对象引用。然后上面的代码就可以工作了。SetSet

我认为下面的代码说明了您真正要问的问题。假设我们不声明一个类型,而让一个类型代替。rVariant

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设置为包含单元格“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")

如果不首先声明 or 对象,这是行不通的......使用语句 - 除非您没有启用,否则您应该启用。总是。否则,您将使用尚未声明的标识符,并且它们都隐式声明为 VariantsrRangeVariantDimOption Explicit

评论

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

根据 VBA 对 SET 语句的帮助,它设置了对 object.so 的引用,如果更改属性,实际对象也会更改。

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`

实际上,所有的VAR都是一样的!

1赞 2 revs, 2 users 80%IqbalHamid #7

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

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

希望这能为您澄清差异。