Чи можу я одночасно оголосити та призначити змінну в 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.