Могу ли я одновременно объявить и назначить переменную в VBA?

165

Я новичок в VBA и хочу знать, смогу ли я преобразовать следующее объявление и присваивание в одну строку:

Dim clientToTest As String
clientToTest = clientsToTest(i)

или

Dim clientString As Variant
clientString = Split(clientToTest)
Йен Р. О'Брайен
источник

Ответы:

239

К сожалению, в 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.
Джон М Гант
Это моя самая большая жалоба на VBA; Могу поспорить, что младшему программисту понадобится всего один день, чтобы добавить этот ярлык в VBA, если руководство захочет его добавить.
Пит Элвин
21

Вы можете сделать это с помощью объектов, как показано ниже.

Dim w As New Widget

Но не со строками или вариантами.

Джон М Гант
источник
Это не правильно, в целом. Вы можете объявить и инициализировать переменную в одной строке с любым типом данных (значением или объектом), просто разделив «действие» с помощью точки с запятой :. Существуют некоторые ограничения, поскольку вы не можете иметь несколько объявлений значений в одной строке (т.е. var1 = val1: var2 = val2). Он будет ошибаться сперадически и позволит вам иногда выполнять этот тип назначения, но в целом не предлагается этим обозначением.
GoldBishop
2
@GoldBishop, да, использование двоеточия для объединения нескольких операторов в одну строку обычно работает (как сказал Алекс К.). То, что я говорю, не будет работать со строками или вариантами (или, возможно, с другими примитивами) - это 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")произойдет ошибка, как и любая другая недопустимая операция в VBA.
GoldBishop
3
Трюк с двоеточием работает с вариантами и строковыми присвоениями. NewКлючевое слово не делает. Это все, что я говорю.
Джон М Гант
2
@JohnMGrant, возможно, захочет уточнить ваш ответ, так как я читал его, заявляет: вы не можете выполнять присваивание одной строки с инициализацией конструктора и типами строковых / вариантных значений. Может быть, немного смущает некоторых.
GoldBishop
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
Vadzim
источник
0

Вы можете определить и присвоить значение, как показано ниже в одной строке. Я привел пример двух переменных, объявленных и назначенных в одной строке. если тип данных нескольких переменных одинаков

 Dim recordStart, recordEnd As Integer: recordStart = 935: recordEnd = 946
Арпан Сайни
источник