Posso dichiarare e assegnare contemporaneamente una variabile in VBA?


165

Sono nuovo di VBA e voglio sapere se posso convertire la seguente dichiarazione e assegnazione in una riga:

Dim clientToTest As String
clientToTest = clientsToTest(i)

o

Dim clientString As Variant
clientString = Split(clientToTest)

Risposte:


239

Sfortunatamente non c'è una scorciatoia in VBA, Il più vicino che otterrai sarà una cosa puramente visiva usando il :carattere di continuazione se lo vuoi su una riga per leggibilità;

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

Suggerimento (riepilogo di altre risposte / commenti): funziona anche con oggetti (Excel 2010):

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

13
+1, ricordo che Microsoft ha suggerito durante l'accumulo a .NET che gli sviluppatori VB6 iniziano a farlo per prepararci a VB.NET.
John M Gant,

Questa è la mia più grande lamentela riguardo VBA; Scommetto che un programmatore junior impiegherebbe solo un giorno per aggiungere questo collegamento a VBA se il management volesse aggiungerlo.
Pete Alvin,

21

Puoi fare questo con gli oggetti, come nel seguito.

Dim w As New Widget

Ma non con stringhe o varianti.


Questo non è corretto, nel suo insieme. Puoi dichiarare e inizializzare una variabile sulla stessa riga con qualsiasi tipo di dati (valore o oggetto), semplicemente separando l '"azione" con il semi-colo :. Vi sono alcune limitazioni in quanto non è possibile avere più dichiarazioni di valore sulla stessa riga (ad es var1 = val1: var2 = val2.). Risolverà speradicamente e ti permetterà di fare questo tipo di incarico a volte ma nel suo insieme non suggerito da questa notazione.
GoldBishop,

2
@GoldBishop, sì, usare i due punti per combinare più dichiarazioni in una sola riga generalmente funziona (come diceva Alex K.). Quello che sto dicendo non funzionerà con stringhe o varianti (o probabilmente con altre primitive) è la Dim x As New Tsintassi, che funziona solo con oggetti.
John M Gant,

Sì, non funzionerà su una linea di inizializzazione del costruttore ma funzionerà con le assegnazioni Variant e String. Lo uso sempre per tipi di valore e alcuni tipi di oggetti. dim str as String: str = "value"ed dim str as Worksheet: set str = ActiveWorkbook.worksheets("Sheet1")entrambi funzionano ripetutamente. Anche se, se faccio un'istanza di oggetto, sbaglierei dim ws as New Worksheet: set ws = ActiveWorkbook.Worksheets("Sheet1")come qualsiasi altra operazione non valida in VBA.
GoldBishop,

3
Il trucco dei due punti funziona con le varianti e le assegnazioni di stringhe. La Newparola chiave no. Questo è tutto ciò che sto dicendo.
John M Gant,

2
@JohnMGrant potrebbe voler chiarire la tua risposta, mentre la leggo, afferma: che non puoi eseguire l'assegnazione sulla stessa riga con l'inizializzazione del costruttore e i tipi di valore stringa / variante. Potrebbe essere un po 'confuso per alcuni.
GoldBishop,

2

in effetti puoi, ma non così.

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

'code...

End Sub

E puoi impostare le variabili in modo diverso quando chiami il sub o lasciarle ai loro valori predefiniti.


5
Questo è per argomenti, non variabili locali.
ivan_pozdeev,

1

In alcuni casi l'intera necessità di dichiarare una variabile può essere evitata usando Withstatement .

Per esempio,

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

questo può essere riscritto come

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

0

È possibile definire e assegnare il valore come mostrato di seguito in una riga. Ho fornito un esempio di due variabili dichiarate e assegnate in una riga singola. se il tipo di dati di più variabili è lo stesso

 Dim recordStart, recordEnd As Integer: recordStart = 935: recordEnd = 946
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.