【问题标题】:Can I simultaneously declare and assign a variable in VBA?我可以同时在 VBA 中声明和分配一个变量吗?
【发布时间】:2011-03-16 10:17:10
【问题描述】:

我是 VBA 新手,想知道是否可以将以下声明和赋值转换为一行:

Dim clientToTest As String
clientToTest = clientsToTest(i)

Dim clientString As Variant
clientString = Split(clientToTest)

【问题讨论】:

    标签: vba variable-declaration


    【解决方案1】:

    您可以在一行中定义和分配一个值,如下所示。我已经给出了在一行中声明和分配的两个变量的示例。如果多个变量的数据类型相同:

    Dim recordStart, recordEnd As Integer: recordStart = 935: recordEnd = 946
    

    【讨论】:

      【解决方案2】:

      不幸的是,VBA 中没有简写,如果您希望将其放在一行中以提高可读性,那么您将获得的最接近的是使用 : 延续字符的纯视觉事物;

      Dim clientToTest As String:  clientToTest = clientsToTest(i)
      Dim clientString As Variant: clientString = Split(clientToTest)
      

      提示(其他答案/cmets 的摘要):也适用于对象(Excel 2010):

      Dim ws  As Worksheet: Set ws = ActiveWorkbook.Worksheets("Sheet1")
      Dim ws2 As New Worksheet: ws2.Name = "test"
      

      【讨论】:

      • +1,我记得微软在构建 .NET 期间曾建议 VB6 开发人员开始这样做,以便为 VB.NET 做好准备。
      • 这是我对 VBA 最大的抱怨;我敢打赌,如果管理层愿意添加此快捷方式,初级程序员只需一天时间即可将其添加到 VBA。
      【解决方案3】:

      在某些情况下,使用With statement 可以避免声明变量的全部需要。

      例如,

          Dim fd As Office.FileDialog
          Set fd = Application.FileDialog(msoFileDialogSaveAs)
          If fd.Show Then
              'use fd.SelectedItems(1)
          End If
      

      这可以改写为

          With Application.FileDialog(msoFileDialogSaveAs)
            If .Show Then
              'use .SelectedItems(1)
            End If
          End With
      

      【讨论】:

        【解决方案4】:

        事实上,你可以,但不是那样。

        Sub MySub( Optional Byval Counter as Long=1 , Optional Byval Events as Boolean= True)
        
        'code...
        
        End Sub
        

        并且你可以在调用 sub 时对变量进行不同的设置,或者让它们设置为默认值。

        【讨论】:

        • 这是用于参数,而不是局部变量。
        【解决方案5】:

        您可以对对象进行排序,如下所示。

        Dim w As New Widget
        

        但不是字符串或变体。

        【讨论】:

        • 这是不正确的,作为一个整体。您可以使用任何数据类型(值或对象)在同一行上声明和初始化变量,只需将“动作”与分号: 分开即可。有一些限制,因为您不能在同一行有多个值声明(即var1 = val1: var2 = val2)。它会偶尔出现错误,并允许您有时执行此类分配,但总体而言,此符号不建议这样做。
        • @GoldBishop,是的,使用冒号将多个语句组合成一行通常有效(正如 Alex K. 所说)。我所说的不适用于字符串或变体(或者可能也不适用于其他原语)是 Dim x As New T 语法,它只适用于对象。
        • 是的,不能在构造函数初始化行上工作,但它可以用于 Variant 和 String 分配。我一直将它用于值类型和一些对象类型。 dim str as String: str = "value"dim str as Worksheet: set str = ActiveWorkbook.worksheets("Sheet1") 都重复工作。虽然,如果我进行对象实例化 dim ws as New Worksheet: set ws = ActiveWorkbook.Worksheets("Sheet1") 会像 V​​BA 中的任何其他无效操作一样出错。
        • 冒号技巧适用于变体和字符串赋值。 New 关键字没有。这就是我要说的。
        • @JohnMGrant 可能想澄清你的答案,正如我读到的那样:你不能对构造函数初始化和字符串/变量值类型进行同一行赋值。可能会让一些人感到困惑。
        猜你喜欢
        • 2016-02-29
        • 2012-02-08
        • 2022-01-09
        • 2020-07-27
        • 2011-08-19
        • 1970-01-01
        • 1970-01-01
        • 2012-11-02
        • 2010-10-01
        相关资源
        最近更新 更多