Czy mogę jednocześnie zadeklarować i przypisać zmienną w VBA?


165

Jestem nowy w VBA i chcę wiedzieć, czy mogę zamienić następującą deklarację i przypisanie w jedną linię:

Dim clientToTest As String
clientToTest = clientsToTest(i)

lub

Dim clientString As Variant
clientString = Split(clientToTest)

Odpowiedzi:


239

Niestety, w VBA nie ma skrótu. Najbliżej można uzyskać czysto wizualną rzecz, używając :znaku kontynuacji, jeśli chcesz, aby był w jednej linii dla czytelności;

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

Wskazówka (podsumowanie innych odpowiedzi / komentarzy): Działa również z obiektami (Excel 2010):

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

13
+1, pamiętam, że Microsoft zasugerował podczas tworzenia wersji .NET, aby programiści VB6 zaczęli to robić, aby przygotować się na VB.NET.
John M Gant,

To jest moja największa skarga dotycząca VBA; Założę się, że młodszy programista potrzebowałby tylko jednego dnia, aby dodać ten skrót do VBA, gdyby kierownictwo chciał go dodać.
Pete Alvin

21

Możesz to zrobić z obiektami, jak poniżej.

Dim w As New Widget

Ale nie w przypadku łańcuchów lub wariantów.


To nie jest poprawne, jako całość. Możesz zadeklarować i zainicjować zmienną w tym samym wierszu z dowolnym typem danych (wartością lub obiektem), po prostu oddzielając „akcję” średnikiem :. Istnieją pewne ograniczenia, ponieważ nie można mieć wielu deklaracji wartości w tym samym wierszu (tj var1 = val1: var2 = val2.). Speradycznie będzie to błąd i pozwoli ci wykonać tego typu zadania czasami, ale jako całość nie jest sugerowana przez ten zapis.
GoldBishop

2
@GoldBishop, tak, używanie dwukropka do łączenia wielu instrukcji w jeden wiersz zwykle działa (jak powiedział Alex K.). To, co mówię, nie zadziała z łańcuchami lub wariantami (lub prawdopodobnie z innymi prymitywami) to Dim x As New Tskładnia, która działa tylko z obiektami.
John M Gant

tak, nie będzie działać z wierszem inicjalizacji konstruktora, ale będzie działać z przypisaniami typu Variant i String. Używam go cały czas dla typów wartości i niektórych typów obiektów. dim str as String: str = "value"i dim str as Worksheet: set str = ActiveWorkbook.worksheets("Sheet1")oba działają wielokrotnie. Chociaż, jeśli wykonam wystąpienie Object, dim ws as New Worksheet: set ws = ActiveWorkbook.Worksheets("Sheet1")wystąpi błąd, jak każda inna niepoprawna operacja w VBA.
GoldBishop

3
Sztuczka z dwukropkiem działa z przypisaniami wariantów i ciągów znaków. Słowo Newkluczowe nie. To wszystko, co mówię.
John M Gant

2
@JohnMGrant może chcieć wyjaśnić twoją odpowiedź, gdy ją czytam, stwierdza: że nie możesz wykonać przypisania w tym samym wierszu z inicjalizacją konstruktora i typami wartości string / variant. Może to być dla niektórych trochę zagmatwane.
GoldBishop

2

w rzeczywistości możesz, ale nie w ten sposób.

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

'code...

End Sub

I możesz ustawić zmienne inaczej podczas wywoływania sub lub pozwolić im na ich domyślne wartości.


5
Dotyczy to argumentów, a nie zmiennych lokalnych.
ivan_pozdeev,

1

W niektórych przypadkach można uniknąć całej potrzeby deklarowania zmiennej za pomocą Withinstrukcji .

Na przykład,

    Dim fd As Office.FileDialog
    Set fd = Application.FileDialog(msoFileDialogSaveAs)
    If fd.Show Then
        'use fd.SelectedItems(1)
    End If

można to przepisać jako

    With Application.FileDialog(msoFileDialogSaveAs)
      If .Show Then
        'use .SelectedItems(1)
      End If
    End With

0

Możesz zdefiniować i przypisać wartość, jak pokazano poniżej, w jednej linii. Podałem przykład dwóch zmiennych zadeklarowanych i przypisanych w jednym wierszu. jeśli typ danych wielu zmiennych jest taki sam

 Dim recordStart, recordEnd As Integer: recordStart = 935: recordEnd = 946
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.