【问题标题】:What is the difference between dim and set in vbavba中dim和set有什么区别
【发布时间】:2023-02-14 23:12:27
【问题描述】:

请原谅我是 VBA 的新手。

有时我用

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

其他时候我用

Set r = Range("A1")

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

【问题讨论】:

    标签: excel vba vb6


    【解决方案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 项目中可能不那么有效,但它仍然是很好的编码实践。
    • 可以使用Set而不首先使用Dim变量吗?
    【解决方案2】:

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

    有时我使用:

        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 设置为包含单元格“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's "Default Member of a Class"


      至于你的Set例子:

      其他时候我用

      Set r = Range("A1")
      

      如果不首先声明 r 是一个 RangeVariant 对象,这是行不通的……使用 Dim 声明——除非你没有启用 Option Explicit,你应该这样做。总是。否则,您正在使用尚未声明的标识符,它们都被隐式声明为Variants

    【讨论】:

    • @PierreClaverie 是 :) 它包括原始参考资料暗淡
    • @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】:

        如果一个变量被定义为一个对象,例如Dim myfldr As Folder,使用关键字“Set”为其分配一个值。

        【讨论】:

          【解决方案6】:

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

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

          希望这能为您澄清差异。

          【讨论】:

            【解决方案7】:

            根据 VBA help on SET statement,它设置了对对象的引用。因此,如果更改属性,实际对象也会更改。

            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`
            

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

            【讨论】:

              猜你喜欢
              • 2011-04-21
              • 1970-01-01
              • 2010-10-06
              • 2011-07-05
              • 1970-01-01
              • 2020-10-01
              • 2021-11-25
              相关资源
              最近更新 更多