¿Puedo declarar y asignar simultáneamente una variable en VBA?


164

Soy nuevo en VBA y quiero saber si puedo convertir la siguiente declaración y asignación en una línea:

Dim clientToTest As String
clientToTest = clientsToTest(i)

o

Dim clientString As Variant
clientString = Split(clientToTest)

Respuestas:


238

Desafortunadamente, no hay taquigrafía en VBA. Lo más cercano que obtendrás es algo puramente visual usando el :carácter de continuación si lo quieres en una línea para facilitar la lectura;

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

Sugerencia (resumen de otras respuestas / comentarios): también funciona con objetos (Excel 2010):

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

13
+1, recuerdo que Microsoft sugirió durante el desarrollo de .NET que los desarrolladores de VB6 comienzan a hacer esto para prepararnos para VB.NET.
John M Gant

Esta es mi mayor queja sobre VBA; Apuesto a que un programador junior tardaría solo un día en agregar este acceso directo a VBA si la gerencia se preocupara por agregarlo.
Pete Alvin

21

Puede hacer eso con los objetos, como se muestra a continuación.

Dim w As New Widget

Pero no con cadenas o variantes.


Esto no es correcto, en su conjunto. Puede declarar e inicializar una variable en la misma línea con cualquier tipo de datos (valor u objeto), simplemente separando la "acción" con el punto y coma :. Existen algunas limitaciones, ya que no puede tener múltiples declaraciones de valor en la misma línea (es decir var1 = val1: var2 = val2). Se generará errores esporádicamente y le permitirá hacer este tipo de asignación a veces, pero en general no es sugerido por esta notación.
GoldBishop

2
@GoldBishop, sí, usar los dos puntos para combinar varias declaraciones en una sola línea generalmente funciona (como dijo Alex K.). Lo que digo que no funcionará con cadenas o variantes (o probablemente con otras primitivas tampoco) es la Dim x As New Tsintaxis, que solo funciona con objetos.
John M Gant

Sí, no funcionará en una línea de inicialización de constructor, pero funcionará con asignaciones de variantes y cadenas. Lo uso todo el tiempo para los tipos de valor y algunos tipos de objetos. dim str as String: str = "value"y dim str as Worksheet: set str = ActiveWorkbook.worksheets("Sheet1")ambos trabajan repetidamente. Sin dim ws as New Worksheet: set ws = ActiveWorkbook.Worksheets("Sheet1")embargo , si hago una instanciación de objetos, se produciría un error como cualquier otra operación no válida en VBA.
GoldBishop

3
El truco de dos puntos funciona con asignaciones de variantes y cadenas. La Newpalabra clave no lo hace. Eso es todo lo que digo.
John M Gant

2
@JohnMGrant podría querer aclarar su respuesta, mientras lo leo, dice: que no puede hacer la misma línea con la inicialización del constructor y los tipos de valores de cadena / variante. Puede ser un poco confuso para algunos.
GoldBishop

2

de hecho, puedes, pero no de esa manera.

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

'code...

End Sub

Y puede establecer las variables de manera diferente al llamar al sub, o dejarlas en sus valores predeterminados.


55
Esto es para argumentos, no para variables locales.
ivan_pozdeev

1

En algunos casos, toda la necesidad de declarar una variable se puede evitar mediante el uso de la Withinstrucción .

Por ejemplo,

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

esto puede reescribirse como

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

0

Puede definir y asignar valor como se muestra a continuación en una línea. He dado un ejemplo de dos variables declaradas y asignadas en una sola línea. si el tipo de datos de múltiples variables es el mismo

 Dim recordStart, recordEnd As Integer: recordStart = 935: recordEnd = 946
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.