Могу ли я одновременно объявить и назначить переменную в 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

0

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

 Dim recordStart, recordEnd As Integer: recordStart = 935: recordEnd = 946
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.