Puis-je déclarer et affecter simultanément une variable dans VBA?

165

Je suis nouveau sur VBA et je veux savoir si je peux convertir la déclaration et l'affectation suivantes en une seule ligne:

Dim clientToTest As String
clientToTest = clientsToTest(i)

ou

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

Réponses:

239

Il n'y a malheureusement pas de raccourci dans VBA, le plus proche que vous obtiendrez est une chose purement visuelle utilisant le :caractère de continuation si vous le souhaitez sur une seule ligne pour plus de lisibilité;

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

Astuce (résumé des autres réponses / commentaires): Fonctionne également avec les objets (Excel 2010):

Dim ws  As Worksheet: Set ws = ActiveWorkbook.Worksheets("Sheet1")
Dim ws2 As New Worksheet: ws2.Name = "test"
Alex K.
la source
13
+1, je me souviens que Microsoft avait suggéré lors de la construction de .NET que les développeurs VB6 commencent à faire cela pour se préparer pour VB.NET.
John M Gant
C'est ma plus grande plainte à propos de VBA; Je parie que cela ne prendrait qu'un jour à un programmeur junior pour ajouter ce raccourci vers VBA si la direction voulait l'ajouter.
Pete Alvin
21

Vous pouvez faire cela avec des objets, comme dans l'exemple suivant.

Dim w As New Widget

Mais pas avec des chaînes ou des variantes.

John M Gant
la source
Ce n'est pas correct dans l'ensemble. Vous pouvez déclarer et initialiser une variable sur la même ligne avec n'importe quel type de données (valeur ou objet), en séparant simplement «l'action» par le point virgule :. Il y a quelques limitations car vous ne pouvez pas avoir plusieurs déclarations de valeur sur la même ligne (ie var1 = val1: var2 = val2). Il se déréglera spéradiquement et vous permettra de faire ce type d'affectation parfois mais dans son ensemble non suggéré par cette notation.
GoldBishop
2
@GoldBishop, oui, utiliser les deux-points pour combiner plusieurs déclarations en une seule ligne fonctionne généralement (comme l'a dit Alex K.). Ce que je dis ne fonctionnera pas avec des chaînes ou des variantes (ou probablement avec d'autres primitives non plus), c'est la Dim x As New Tsyntaxe, qui ne fonctionne qu'avec des objets.
John M Gant
ouais ne fonctionnera pas sur une ligne d'initialisation du constructeur, mais cela fonctionnera avec les affectations de variantes et de chaînes. Je l'utilise tout le temps pour les types de valeur et certains types d'objets. dim str as String: str = "value"et les dim str as Worksheet: set str = ActiveWorkbook.worksheets("Sheet1")deux fonctionnent à plusieurs reprises. Bien que, si je fais une instanciation d'objet dim ws as New Worksheet: set ws = ActiveWorkbook.Worksheets("Sheet1"), l'erreur serait comme toute autre opération non valide dans VBA.
GoldBishop
3
L'astuce deux-points fonctionne avec les assignations de variantes et de chaînes. Le Newmot-clé ne le fait pas. C'est tout ce que je dis.
John M Gant
2
@JohnMGrant voudra peut-être clarifier votre réponse, comme je l'ai lu, déclare: que vous ne pouvez pas faire une affectation de même ligne avec l'initialisation du constructeur et les types de valeur chaîne / variante. Cela pourrait être un peu déroutant pour certains.
GoldBishop
2

en fait, vous pouvez, mais pas de cette façon.

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

'code...

End Sub

Et vous pouvez définir les variables différemment lors de l'appel du sous-marin, ou les laisser à leurs valeurs par défaut.

Patrick Lepelletier
la source
5
C'est pour les arguments, pas pour les variables locales.
ivan_pozdeev
1

Dans certains cas, le besoin de déclarer une variable peut être évité en utilisant Withstatement .

Par exemple,

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

cela peut être réécrit comme

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

Vous pouvez définir et attribuer une valeur comme indiqué ci-dessous sur une seule ligne. J'ai donné un exemple de deux variables déclarées et affectées en une seule ligne. si le type de données de plusieurs variables est le même

 Dim recordStart, recordEnd As Integer: recordStart = 935: recordEnd = 946
Arpan Saini
la source