我可以同时在 VBA 中声明和分配一个变量吗?

Posted

技术标签:

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

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

Dim clientToTest As String
clientToTest = clientsToTest(i)

Dim clientString As Variant
clientString = Split(clientToTest)

【问题讨论】:

【参考方案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 可能想澄清你的答案,正如我读到的那样:你不能对构造函数初始化和字符串/变量值类型进行同一行赋值。可能会让一些人感到困惑。

以上是关于我可以同时在 VBA 中声明和分配一个变量吗?的主要内容,如果未能解决你的问题,请参考以下文章

c语言是在声明变量的同时,分配内存的吗?程序结束运行了,内存会释放吗?

无论如何在声明后分配一个全局变量吗?

同时声明和分配多个字符串变量

我可以预先声明用于解构对象分配的变量吗? [复制]

java声明局部变量时,省略大括号,可以同时声明两个名称和类型相同的局部变量吗?

如何从 Access VBA 中的另一个私有子获取私有子中声明的变量的值