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


163

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

Dim clientToTest As String
clientToTest = clientsToTest(i)

要么

Dim clientString As Variant
clientString = Split(clientToTest)

Answers:


237

不幸的是,VBA中没有简写形式。:如果您希望在一行上使用连续字符,则最接近的是使用连续字符的纯视觉对象;

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

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

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

13
+1,我记得Microsoft在建立.NET的过程中建议VB6开发人员开始这样做,以使自己为VB.NET做好准备。
John M Gant 2010年

这是我对VBA的最大抱怨;我敢打赌,如果管理层愿意添加此快捷方式,那么初级程序员只需一天就可以将该快捷方式添加到VBA。
皮特·阿尔文,

21

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

Dim w As New Widget

但不能使用字符串或变体。


总体而言,这是不正确的。您可以在任意一行中使用任何数据类型(值或对象)声明和初始化变量,只需将“ action”与semi-colo分开即可:。有一些限制,因为您不能在同一行(即var1 = val1: var2 = val2)上有多个值声明。它会偶尔出现错误,并允许您有时进行这种类型的分配,但总体而言,此表示法并不建议这样做。
GoldBishop 2012年

2
@GoldBishop,是的,通常使用冒号将多个语句合并为一行(如Alex K.所说)。我要说的是不适用于字符串或变体(或者可能也不适用于其他原语)的是Dim x As New T语法,仅适用于对象。
John M Gant 2012年

是的,不会在构造函数初始化行上工作,但是它将与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")将像VBA中的任何其他无效操作一样出错。
GoldBishop 2012年

3
冒号技巧适用于变体和字符串分配。的New关键字没有。我就是这么说
John M Gant 2012年

2
在我阅读时,@ JohnMGrant可能想澄清您的答案,指出:您不能使用构造函数初始化和字符串/变量值类型进行同一行赋值。可能会使某些人感到困惑。
GoldBishop 2012年

2

实际上,您可以,但不是那样。

Sub MySub( Optional Byval Counter as Long=1 , Optional Byval Events as Boolean= True)

'code...

End Sub

而且,您可以在调用子程序时对变量进行不同的设置,或将其设置为默认值。


5
这用于参数,而不是局部变量。
ivan_pozdeev

1

在某些情况下,通过使用语句可以避免声明变量的全部需求With

例如,

    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

0

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

 Dim recordStart, recordEnd As Integer: recordStart = 935: recordEnd = 946
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.