【问题标题】:Declaring variables in VBA在 VBA 中声明变量
【发布时间】:2021-04-20 19:04:43
【问题描述】:
Dim x, y as Date

这两个代码语句有什么区别

Dim x as Date, y as Date

差异的实际结果是什么,我还缺少哪些其他隐藏的声明功能?

【问题讨论】:

    标签: vba


    【解决方案1】:
    Dim x, y as Date
    

    相当于:

    Dim x 
    Dim y as Date
    

    这相当于:

    Dim x as Variant
    Dim y as Date
    

    当您省略变量的类型时,它假定为 Variant 类型

    根据您的问题进行编辑:

    Dim a! ' same as Dim a as Short
    Dim b@ ' same as Dim b as Currency
    Dim c# ' same as Dim c as Double
    Dim d$ ' same as Dim d as String
    Dim e% ' same as Dim e as Integer
    Dim f& ' same as Dim f as Long
    

    参考:http://bytes.com/topic/visual-basic/answers/643371-declaration-shortcuts

    【讨论】:

    • 所以使用逗号并不是我想的那样的捷径。是否有任何快捷方式可以在 dim 语句中初始化变量?我见过使用冒号之类的,我通常不使用。
    • 还有Def语句; DefSng A-Z 使变量名为 A 到 Z 的类型为 Single。然而,这太可怕了,可以用来为杀人辩护。
    • 我不知道那些,确实很凶
    • @CodeCamper 除了上面列出的那些速记符号(例如,Dim s$ 等同于 Dim s as String),我会放弃寻找快捷方式。将每个变量声明放在单独的行中,并在环境允许的情况下尽可能强地键入它们,这是一种很好的做法,并且可以使代码更清晰、更易于维护。
    • @DavidZemens 为了便于阅读,我通常喜欢在我用其他语言声明它们的同一行上声明变量内容。有什么捷径可以做到这一点吗?我肯定会使用这些快捷方式。
    【解决方案2】:
    Dim x, y as Date
    
    each 变量需要

    As <Type>,因此在上面的示例中,只有 yDatexVariant (未指定类型时的默认值)

    Dim x as Date, y as Date
    

    两个变量都是Dates,因为每个变量都有一个As

    【讨论】:

    • VBA 中 Dim 的所有语法糖(包括初始化 Dim 中的变量)是否有文档页面?例如,我假设两者都是日期,直到我看到工具提示告诉我它是一个变体。此外,如果我将某些东西声明为变体,除了辅助弹出不再起作用之外,编程现实的实际区别是什么?
    • 变体打破了强类型的原则;如果你有一个date_of_birth 变量,你可以给它分配任何东西(一个数字,一个字符串,一个对象引用),如果它是一个variant,如果它是一个Date,但是你肯定知道它有什么值是一个有效的日期,你永远不需要检查。变体的性能也低于类型化变量。
    • @AlexK。谢谢 Alex,DefVar A-AZ 是我最好的新朋友。我再也不用声明变量了!如果我理解正确,这实际上会声明 128255 个变体?多么有用!
    【解决方案3】:

    为了易读性,我通常喜欢在我用其他语言声明它们的同一行声明变量内容。有什么捷径可以做到这一点吗?

    对于Constant 表达式,是的:

    Const i as Integer = 6
    Const myName as String = "David Zemens"
    

    对于动态变量,不使用冒号是不可能的,即Dim i as Integer: i = 6,但冒号实际上被解释为换行符,所以这样做并没有真正的优势。

    虽然可以通过这种方式分配设计时已知的简单值,但如果您环顾四周,您会发现这在 VBA 编程中根本不常用。相反,您通常会在模块/过程的顶部看到 ALL 声明,然后是那些需要初始值的变量的赋值语句。所有其他分配都发生在运行时代码中需要进行或更改分配的位置

    Dim i as Integer
    Dim x as Date
    Dim y as Date
    
    i = 1
    x = DateValue(Now())
    
    y = DateAdd("d", i, x)
    
    MsgBox y
    

    比较以下:

    Dim i as Integer: i = 6
    

    够简单吧?但是呢:

    Dim i as Integer: i = SomeFunction(arg1, arg2, obj.Property1)
    

    上述方法可行,但当然如果函数的参数在此声明之前分配,任何对象变量都被实例化,等等。

    我的意思是,虽然在某些情况下您可以这样做,但在绝大多数情况下这样做根本不切实际,为了保持一致性,我个人会建议不要使用这种内联声明和赋值。

    【讨论】:

      【解决方案4】:
          Dim x, y as Date
      'Is the same as:
          Dim x as Variant
          Dim y as Date
      

      现在

          Dim x as Date, y as Date
      'Is the same as:
          Dim x as Date
          Dim y as Date
      

      如果您不为 VBA 变量声明数据类型,则 VBA 使用 Variant(默认数据类型)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-27
        • 1970-01-01
        • 1970-01-01
        • 2011-02-12
        • 2020-01-08
        • 1970-01-01
        相关资源
        最近更新 更多