Kann ich in VBA gleichzeitig eine Variable deklarieren und zuweisen?

163

Ich bin neu in VBA und möchte wissen, ob ich die folgende Deklaration und Zuordnung in eine Zeile konvertieren kann:

Dim clientToTest As String
clientToTest = clientsToTest(i)

oder

Dim clientString As Variant
clientString = Split(clientToTest)
Ian R. O'Brien
quelle

Antworten:

236

Leider gibt es in VBA keine Abkürzung. Das nächste, was Sie erhalten, ist eine rein visuelle Verwendung des :Fortsetzungszeichens, wenn Sie es zur besseren Lesbarkeit in einer Zeile verwenden möchten.

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

Hinweis (Zusammenfassung anderer Antworten / Kommentare): Funktioniert auch mit Objekten (Excel 2010):

Dim ws  As Worksheet: Set ws = ActiveWorkbook.Worksheets("Sheet1")
Dim ws2 As New Worksheet: ws2.Name = "test"
Alex K.
quelle
13
+1, ich erinnere mich, dass Microsoft während des Aufbaus von .NET vorgeschlagen hat, dass VB6-Entwickler dies tun, um uns auf VB.NET vorzubereiten.
John M Gant
Dies ist meine größte Einzelbeschwerde über VBA; Ich wette, ein Junior-Programmierer würde nur einen Tag brauchen, um diese Verknüpfung zu VBA hinzuzufügen, wenn das Management sie hinzufügen möchte.
Pete Alvin
21

Sie können dies mit Objekten wie im Folgenden tun.

Dim w As New Widget

Aber nicht mit Strings oder Varianten.

John M Gant
quelle
Dies ist insgesamt nicht korrekt. Sie können eine Variable in derselben Zeile mit einem beliebigen Datentyp (Wert oder Objekt) deklarieren und initialisieren, indem Sie einfach die "Aktion" mit dem Semikolo trennen :. Es gibt einige Einschränkungen, da Sie nicht mehrere Wertdeklarationen in derselben Zeile (dh var1 = val1: var2 = val2) haben können. Es wird speradisch ausfallen und es Ihnen ermöglichen, diese Art von Zuweisung manchmal durchzuführen, aber insgesamt nicht durch diese Notation vorgeschlagen.
GoldBishop
2
@GoldBishop, ja, die Verwendung des Doppelpunkts zum Kombinieren mehrerer Anweisungen in einer einzigen Zeile funktioniert im Allgemeinen (wie Alex K. sagte). Was ich sage, funktioniert nicht mit Zeichenfolgen oder Varianten (oder wahrscheinlich auch mit anderen Grundelementen), ist die Dim x As New TSyntax, die nur mit Objekten funktioniert.
John M Gant
Ja, funktioniert nicht in einer Konstruktorinitialisierungszeile, aber es funktioniert mit Varianten- und Zeichenfolgenzuweisungen. Ich benutze es die ganze Zeit für Werttypen und einige Objekttypen. dim str as String: str = "value"und dim str as Worksheet: set str = ActiveWorkbook.worksheets("Sheet1")beide arbeiten wiederholt. Wenn ich jedoch eine Objektinstanziierung mache, dim ws as New Worksheet: set ws = ActiveWorkbook.Worksheets("Sheet1")würde dies wie bei jeder anderen ungültigen Operation in VBA fehlschlagen.
GoldBishop
3
Der Doppelpunkttrick funktioniert mit Varianten- und Zeichenfolgenzuweisungen. Das NewSchlüsselwort nicht. Das ist alles, was ich sage.
John M Gant
2
@JohnMGrant möchte möglicherweise Ihre Antwort klarstellen, während ich sie lese: Sie können keine Zuweisung in derselben Zeile mit Konstruktorinitialisierung und Wertetypen für Zeichenfolgen / Varianten durchführen. Könnte für manche etwas verwirrend sein.
GoldBishop
2

in der Tat können Sie, aber nicht so.

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

'code...

End Sub

Und Sie können die Variablen beim Aufrufen des Subwoofers unterschiedlich festlegen oder auf ihre Standardwerte setzen.

Patrick Lepelletier
quelle
5
Dies gilt für Argumente, nicht für lokale Variablen.
ivan_pozdeev
1

In einigen Fällen kann die gesamte Notwendigkeit, eine Variable zu deklarieren, durch die Verwendung einer Anweisung vermieden werdenWith .

Beispielsweise,

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

Dies kann umgeschrieben werden als

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