Introducción
En este artículo se describe cómo usar variables en los subprocesos de Microsoft Excel en Microsoft Visual Basic para Aplicaciones.
Más información
Variables en un sub procedimiento
Una característica eficaz de los lenguajes de programación es la capacidad de almacenar algo en una variable para que el contenido de la variable se pueda utilizar o se pueda cambiar más adelante en el procedimiento. En este documento se describe el uso siguiente de variables en Visual Basic:
- Cómo se declaran las variables.
- Los procedimientos y los proyectos que pueden usar la variable.
- La duración de una variable.
Declarar una variable en una macro
La forma más sencilla de declarar una variable en una macro es usar la instrucción Dim. En la línea siguiente se declaran dos variables, como enteros:
Dim x As Integer, y As Integer
Con x e y especificados como enteros, se indica a Visual Basic que reserve memoria suficiente para una variable entera (2 bytes cada uno para x e y) y que la información almacenada en x o y es un número entero entre -32768 y 32767.
NOTA: Si declara más de una variable mediante una sola instrucción Dim, debe especificar el tipo de datos para cada variable.
Si no especifica el tipo de datos para cada variable, como en el siguiente código de Visual Basic, solo la variable y se configura como una variable entera. La variable x será un tipo de variante:
Dim x, y As Integer
Para obtener más información, vea Tipo de datos Variant a continuación.
Para realizar una prueba variable, siga estos pasos:
Guarde y cierre los libros abiertos y, a continuación, abra un libro nuevo.
Inicie el Editor de Visual Basic (presione ALT+F11).
En el menú Insertar, haga clic en Módulo.
Escriba el código siguiente:
Sub Variable_Test()
Dim x As Integer, y As Integer
x = 10
y = 100
MsgBox "el valor de x es " & x & _
Chr(13) & "el valor de y es " & y
End SubEjecute la macro Variable_Test . Aparecerá un mensaje similar al siguiente:
the value of x is 10
the value of y is 100Haga clic en Aceptar.
En la Variable_Test macro, cambie la línea siguiente:
x = 10:
x = "error"Ejecute la macro Variable_Test .
Recibirá un error en tiempo de ejecución porque "error" no es un entero y está intentando asignar este valor de cadena a la variable entera x.
Resumen del tipo de datos
Estos son los tipos de datos de variables comunes:
tipo de datos Variant
Si no especifica un tipo de datos al declarar una variable o no declara ninguna variable, Visual Basic especifica automáticamente el tipo de datos variant para esta variable. Las siguientes son las ventajas de las variables que se declaran como este tipo de datos:
- Las variables pueden contener valores de cadena, fecha, hora, booleanos o numéricos.
- Las variables pueden convertir los valores que contienen automáticamente.
La desventaja es que las variables variantes requieren al menos 16 bytes de memoria. 16 bytes de memoria pueden ser significativos en grandes procedimientos o en módulos complejos.
Para ver cómo funciona esto en la Variable_Test macro, siga estos pasos:
Cambie el código de la Variable_Test macro a:
Sub Variable_Test()
Dim x, y
x = "string"
y = 1.23
MsgBox "the value of x is " & x & _
Chr(13) & "the value of y is " & y
End Sub
Ejecute la macro Variable_Test .
No recibirá un error porque puede asignar nada a las variables variant x e y.
NOTA: También puede dejar fuera la línea siguiente y la macro seguirá funcionando como las variables x e y se tratan como tipos de datos Variant:
Dim x, y
Ámbito de una variable
Al declarar una variable, otras macros pueden verla o no en el mismo módulo, en otros módulos o en otros proyectos. Esta disponibilidad de una variable en módulos se denomina ámbito. Los tres tipos de ámbito son nivel de procedimiento, nivel de módulo privado y nivel de módulo público. El ámbito depende de cómo y dónde declare la variable o variables.
Ámbito de nivel de procedimiento
Una variable con ámbito de nivel de procedimiento no se ve fuera del procedimiento donde se declara. Si establece el valor de una variable que tiene ámbito de nivel de procedimiento, otras macros no verán el contenido de esa variable.
Para comprobar que una variable con ámbito de nivel de procedimiento no se ve fuera del procedimiento donde se declara, siga estos pasos:
Inserte un nuevo módulo en el proyecto.
Escriba las dos macros siguientes en este módulo:
Sub Macro1() Dim x As Integer x = 10 MsgBox "x, as seen by Macro1 is " & x 'the next line runs Macro2 Macro2 End Sub Sub Macro2() MsgBox "x, as seen by Macro2 is " & x End SubEjecuta Macro1 y recibirás el siguiente mensaje:
x, as seen by Macro1 is 10Haga clic en Aceptar y recibirá el siguiente mensaje:
x, as seen by Macro2 isHaga clic en Aceptar.
Macro2 no muestra un valor para la variable x porque la variable x es local en Macro1.
Ámbito de nivel de módulo privado y público
Puede definir variables en la sección de declaraciones de un módulo (en la parte superior de un módulo, sobre todos los sub procedimientos) y establecer el ámbito de la variable mediante la instrucción Public, la instrucción Dim o la instrucción Private. Si coloca la instrucción Public delante de la variable, la variable estará disponible para todas las macros de todos los módulos del proyecto. Si coloca la instrucción Dim o la instrucción Private delante de la variable, la variable solo está disponible para las macros del módulo en el que se declara.
Para ver la diferencia entre la instrucción Public y la instrucción Dim, siga estos pasos:
Guarde y cierre los libros abiertos y, a continuación, abra un libro nuevo.
Inicie el Editor de Visual Basic.
Inserte un módulo en el proyecto.
-
Type the following code into this module: Public x As Integer Sub Macro_1a() x = 10 MsgBox x Macro_1b End Sub Sub Macro_1b() x = x * 2 MsgBox x Macro2 End Sub Inserte otro módulo en el proyecto.
Escriba el código siguiente en este módulo:
Sub Macro2()
x = x * 3
CuadroMsj x
End SubEjecutar Macro_1a macro en el primer módulo.
Con la variable x declarada como "Public x As Integer", las tres macros del proyecto tienen acceso al valor de x. El primer cuadro de mensaje muestra un valor de 10. El segundo cuadro de mensaje muestra un valor de 20 (porque x se multiplica por 2 en Macro_1b). El tercer cuadro de mensaje muestra un valor de 60 (porque el valor de x se cambió a 20 en Macro_1b y, a continuación, se multiplicó por 3 en Macro2).
Cambie la línea de declaración en el primer módulo de:
Public x As Integer:
Dim x As IntegerEjecute la macro Macro_1a .
Con la variable x declarada como "Dim x As Integer", solo las macros del primer módulo tienen acceso al valor de x. Por lo tanto, el primer cuadro de mensaje muestra un valor de 10, el segundo cuadro de mensaje muestra un valor de 20 (dado que x se multiplica por 2 en Macro_1b) y el tercer cuadro de mensaje muestra un valor de 0 (porque Macro2 no ve el valor de x y la macro 2 usa el valor no inicializado de cero).
Cambie la línea de declaración en el primer módulo de:
Dim x As Integer:
Private x As IntegerEjecute la macro Macro_1a .
Los mismos cuadros de mensaje se muestran con el ámbito de la instrucción Private que con la instrucción Dim. La variable x tiene el mismo ámbito, privado para el módulo donde se declara.
NOTA: Si quiere que el ámbito de la variable se limite al módulo en el que se declara, use la privatestatement en lugar de la instrucción Dim. Ambos logran el mismo efecto, pero el ámbito es más claro al leer el código si usa la instrucción Private.
Duración de una variable
El tiempo durante el cual una variable conserva su valor se conoce como su vida útil. El valor de una variable puede cambiar a lo largo de su vida, pero conservará un valor. Además, cuando una variable pierde el ámbito, ya no tiene un valor.
Inicializar el valor de una variable
Al ejecutar una macro, todas las variables se inicializan en un valor. Una variable numérica se inicializa en cero, una cadena de longitud variable se inicializa en una cadena de longitud cero (""), y una cadena de longitud fija se rellena con el código ASCII 0. Las variables variant se inicializan en Empty. Una variable Vacía se representa mediante un cero en un contexto numérico y una cadena de longitud cero ("") en un contexto de cadena.
Variables de nivel de procedimiento
Si tiene una variable que se declara en una macro mediante la instrucción Dim, la variable conserva su valor mientras se ejecuta la macro. Si esta macro llama a otras macros, el valor de la variable se conserva (pero no está disponible para las demás macros) siempre y cuando estas otras macros también se estén ejecutando.
Para demostrar cómo funcionan las variables de nivel de procedimiento, siga estos pasos:
Inserte un nuevo módulo en el proyecto.
Escriba las dos macros siguientes en este módulo:
Sub Macro1()
'set x as a procedure level variable
Dim x As Integer
MsgBox "el valor inicializado de x es " & x
x = 10
MsgBox "x is " & x
'la línea siguiente ejecuta Macro2
Macro2
MsgBox "x sigue siendo " & x
End Sub
Sub Macro2()
CuadroMsj "x, como se ve en Macro2 es " & x
End SubEjecutar Macro1.
Aparecerá un mensaje similar al siguiente:
the initialized value of x is 0Haga clic en Aceptar y recibirá el mensaje:
x is 10Haga clic en Aceptar y recibirá el siguiente mensaje:
x, as seen by Macro2 isHaga clic en Aceptar.
Macro2 no muestra un valor para la variable x porque la variable x es local en Macro1. Recibe el siguiente mensaje:
x is still 10Haga clic en Aceptar.
Ejecutar Macro1.
Recibe los mismos mensajes que se describen en los pasos 3 a 6 porque en cuanto Macro1 dejó de ejecutarse en el paso 6, se perdió el valor de la variable x. Por lo tanto, al volver a ejecutar Macro1 en el paso 7, el primer mensaje muestra el valor de x como cero (el valor inicializado).
Palabra clave estática
Si se declara una variable de nivel de procedimiento mediante la palabra clave Static, la variable conserva su valor hasta que se restablece el proyecto. Por lo tanto, si tiene una variable estática, la próxima vez que llame al procedimiento, la variable estática se inicializa en su último valor.
Para ver cómo funciona la palabra clave Static, siga estos pasos:
1.
Change the code in Macro1 to:
Sub Macro1()
'set x as a procedure level variable
Static x As Integer
MsgBox "the initialized value of x is " & x
x = x + 10
MsgBox "x is " & x
End Sub
Ejecutar Macro1.
Recibirá el mensaje:
the initialized value of x is 0Haga clic en Aceptar y recibirá el mensaje:
x is 10Haga clic en Aceptar.
Ejecute Macro1 y recibirá el siguiente mensaje:
the initialized value of x is 10Haga clic en Aceptar y recibirá el siguiente mensaje:
x is 20Haga clic en Aceptar.
Los valores que aparecen en los mensajes son diferentes la segunda vez porque la variable x se declara como variable estática y la variable conserva su valor después de ejecutar Macro1 la primera vez.
NOTA: Si tiene una variable de nivel de módulo, su duración es la misma que si fuera una variable estática de nivel de procedimiento.
Para comprobar la duración de una variable de nivel de módulo, siga estos pasos:
1.
Change the code in the module that contains Macro1 to the following:
Dim x As Integer 'create a module-level variable
Sub Macro1()
MsgBox "the initialized value of x is " & x
x = x + 10
MsgBox "x is " & x
End Sub
Ejecuta Macro1 y recibirás el siguiente mensaje:
the initialized value of x is 0Haga clic en Aceptar y recibirá el siguiente mensaje:
x is 10Haga clic en Aceptar
Ejecuta Macro1 y recibirás este mensaje:
the initialized value of x is 10Haga clic en Aceptar.
Aparecerá un mensaje similar al siguiente:
x is 20Haga clic en Aceptar.
Los valores que aparecen en los mensajes son diferentes la segunda vez porque la variable x se declara como variable estática y conserva su valor después de ejecutar Macro1 la primera vez.
Restablecer un proyecto para restablecer variables
Si desea restablecer el valor de una variable estática o de una variable de nivel de módulo, haga clic en el botón Restablecer en el
Standard barra de herramientas o haga clic en Restablecer en el menú Ejecutar.
Si hace esto para el proyecto Macro1 y, a continuación, vuelve a ejecutar Macro1, el valor de la variable x se inicializa de nuevo en cero y recibe el primer mensaje:
the initialized value of x is 0