Variables, constantes y tipos de datos en VBA
Si estás comenzando a trabajar con VBA, dos de los conceptos que más llaman la atención son los de ‘variable’ y ‘constante’. ¿Sabes de qué se tratan?
Una variable no es más que una pequeña ubicación en la memoria de tu ordenador donde puedes almacenar datos de muchos tipos.
Por ejemplo, puedes guardar números enteros (tipo Integer) o textos (tipo String). Te mostraré todos los tipos más adelante.
Las constantes también almacenan datos pero lo hacen de forma permanente (a diferencia de las variables, cuyo valor asignado puede cambiar a lo largo de la ejecución de la macro).
Como habrás adivinado el tutorial de hoy está dedicado a las variables y a las constantes, elementos fundamentales de todos los lenguajes de programación.
¿Para qué sirven las variables?
Se puede decir que las variables son palabras con las cuales se hace referencia a una determinada información dentro del proyecto VBA. Su razón de ser es porque en muchas ocasiones se necesita información con la que previamente ya se ha trabajado y hay que acceder de nuevo a ella.
Otra ventaja de trabajar con variables es que puedes cambiar el valor asignado dentro del código y continuar usándola con ese nuevo valor. Te pongo un ejemplo. El siguiente código suma los diez primeros números positivos y luego muestra el resultado en un cuadro de mensaje:
Sub Suma10()
Dim i As Integer
Dim k As Integer
For i = 1 To 10
k = k + i
Next i
MsgBox k
End Sub
En el código anterior hay dos variables: i
y k
.
Una vez declaradas las variables se utiliza un bucle For-Next
en el que se modifica su valor cuando se completa una vuelta.
La utilidad de una variable se encuentra en el hecho de que puedes modificarla mientras el código está en funcionamiento.
Debes tener en cuenta algunas reglas al crear un nombre para una variable:
- Puedes utilizar letras, números y algunos símbolos pero el primer carácter debe ser una letra.
- No puedes utilizar espacios ni puntos. Puedes usar el carácter de subrayado a modo de espacio para que las variables sean más legibles (por ejemplo en ‘Venta_anual‘).
- No puedes utilizar caracteres especiales como #, $, %, &o ¡!.
- VBA no distingue entre mayúsculas y minúsculas, por tanto ‘Tipo_interes’ es igual que ‘Tipo_Interes’. Es una buena práctica usar mayúsculas y minúsculas en las variables para hacerlas más legibles e identificar más fácilmente errores al escribirlas.
- No puedes usar palabras reservadas (las instrucciones propias del lenguaje). Por ejemplo, no puedes nombrar una variable como ‘Next’, pues forma parte del bucle
For-Next
. - No puedes usar más de255 caracteres (aunque estoy seguro de que nunca se te ocurriría… ???? )
Tipos de variables
Aunque VBA permite trabajar sin necesidad de informar sobre el tipo de datos, se considera una buena práctica especificar el tipo de datos de la variable (la palabra As del código anterior).
El tipo de datos que asignes a la variable determinará el tipo (y longitud) de datos que quieras que contenga.
En la siguiente tabla te muestro todos los tipos de datos que usa VBA:
Tipo de dato | Bytes | Rango de valdores |
---|---|---|
Byte | 1 byte | 0 a 255 |
Boolean | 2 bytes | Verdadero o falso |
Integer | 2 bytes | –32,768 a 32,767 |
Long | 4 bytes | –2,147,483,648 a 2,147,483,647 |
Single (Decimal simple) | 4 bytes | Números reales de 32 bits y 7 decimales. –3.402823E38 a –1.401298E-45 (para valores negativos); 1.401298E-45 a 3.402823E38 (valores positivos) |
Double (decimal doble) | 8 bytes | Números de 64 bits y 16 decimales. –1.79769313486232E308 a –4.94065645841247E-324 (valores negativos); 4.94065645841247E-324 a 1.79769313486232E308 (para valores positivos) |
Currency | 8 bytes | 15 dígitos a la izquierda del punto decimal y 4 a la derecha. –922,337,203,685,477.5808 to 922337203685477 |
Date | 8 bytes | 1 de enero de 0100 a 31 de diciembre de 9999 |
Object | 4 bytes | Cualquier referencia a un objeto |
String (longitud variable) | 10 bytes + 1 byte por cada carácter | 0 a aproximadamente 2 billones de caracteres |
String (longitud fija) | Tamaño de la cadena | 1 a 65.535 caracteres |
Variant (con números) | 16 bytes | Cualquier valor numérico hasta el rango de un tipo de datos doble. También puede contener valores especiales, como Empty, Error, Nothing y Null. |
Variant | (con caracteres) 22 bytes + 1 byte por cada carácter | 0 a aproximadamente 2 billones de caracteres |
Definida por el usuario | Varios | Varía según el elemento |
Cuando especificas el tipo de datos de una variable, VBA sabrá exactamente cuánto espacio reservar en la memoria para ella.
Por ejemplo, si quieres almacenar el número del mes del año, puedes usar el tipo de datos Byte (cuyos límites son 0 a 255). Como el número del mes no va a ser superior a 12, este tipo de dato funcionará bien y VBA desperdiciará menos memoria para almacenarla. Si necesitas almacenar números de filas en la variable necesitarás usar un tipo de dato que pueda contener hasta el número 1.048.756 (el número de filas de una hoja). Por tanto es mejor usar el tipo de datos Long.
Cómo declarar una variable
Como he comentado antes, no es necesario declarar explícitamente las variables antes de usarlas en los procedimientos pero recomiendo que lo hagas. Esto asegurará que VBA asignará solo la memoria adecuada a la variable y en consecuencia hará que el código se ejecute más rápido. El siguiente código es un ejemplo de declaración explícita de variables:
Sub Declaracion()
Dim X As Integer
Dim Email As String
Dim Nombre As String
Dim Num_Filas As Long
Dim FechaHoy As Date
End Sub
Para declarar una variable se usa la instrucción Dim
(abreviatura de Dimension). En la línea Dim X As Integer
he declarado la variable X como número entero. Desde ahora, cuando la utilice en mi código solo podré almacenar en ella números enteros.
ATENCIÓN: Como he comentado puedes optar por no declarar el tipo de datos. En este caso VBA considera que la variable es de tipo Variant. Una variable Variant puede contener cualquier tipo de datos. Aunque esto pueda parecer bueno, no es conveniente porque tiene a ocupar más memoria y puede hacer que el código se ejecute más lentamente.
Algo muy habitual entre muchos programadores es ‘la no declaración de variables’, es decir, comenzar a usar la variable sin declarar previamente. Sin duda es una práctica que desaconsejo totalmente.
Declarar las variables es bueno por dos razones: hace el código más eficiente y ayuda a encontrar errores causados por nombres mal escritos. VBA tiene una forma de obligarte a declarar todas las variables que uses en el código. Solo tienes que añadir la siguiente línea al principio del módulo.
Option Explicit
Al hacerlo estarás obligado a declarar todas las variables antes de ejecutar el código. Si hay alguna variable sin declarar se mostrará un error.
Al hacer clic en Aceptar se marcará la variable sin declarar. ¿Ves como es una buena idea? En el siguiente procedimiento se muestra un ejemplo de cómo Option Explicit
te puede ayudar a identificar rápidamente algunos errores frecuentes con variables (que sin esta instrucción tardarías más tiempo en encontrar).
Sub CalculoComisiones()
Dim TipoComision As Double
If Range("A1").Value > 10000 Then
TipoComision = 0.1
Else
TipoCimision = 0.05
End If
MsgBox "Total comisión: " & Range("A1").Value * TipoComision
End Sub
¿Cuánto tiempo has tardado en encontrar el error?
Al ejecutar el código anterior (sin Option Explicit
), obtendrías una comisión errónea (en caso de que el valor de A1 sea menor de 10.000). No verás mensajes de error de ningún tipo.
Para no olvidarte de incluir la instrucción Option Explicit
en todos los módulos de tus proyectos sigue estos pasos:
- En el editor de VBA haz clic en el menú Herramientas y a continuación en Opciones.
- En el cuadro Opciones activa la casilla Requerir declaración de variables en la ficha Editor.
- Cierra el cuadro haciendo clic en Aceptar.
Una vez habilitada la casilla, cada vez que crees un nuevo módulo, VBA agregará la línea Option Explicit
.
Ámbito de las variables
El alcance o ámbito de una variable determina en qué parte del código se puede usar. Puedes elegir tres ámbitos diferentes:
- A nivel de procedimiento.
- A nivel de módulo.
- A nivel de proyecto.
A nivel de procedimiento
Al declarar una variable a nivel de procedimiento, solo estará disponible dentro de ese procedimiento. No podrás usarla en otros procedimientos del módulo.
Cuando el procedimiento finaliza, la variable se borra y se libera la memoria que se usó para ella. Para declarar una variable a nivel de procedimiento debes hacerlo entre las líneas Sub
y End Sub
del procedimiento en el que la usarás.
A nivel de módulo
Cuando quieras que una variable esté disponible para todos los procedimientos de un módulo debes declararla al principio del módulo, fuera de cualquier procedimiento:
Una vez que declaras la variable en la parte superior del módulo, puedes utilizarla en todos los procedimientos de ese módulo.
En el siguiente ejemplo te muestro dos códigos. Cuando ejecuto el primer procedimiento, y más tarde ejecuto el segundo, el valor de i se convierte en 30 (ya que la variable arrastra el valor 10 del procedimiento anterior)
Option Explicit
Dim i As Integer
Sub Procedimiento1()
i = 10
End Sub
Sub Procedimiento2()
i = i + 20
MsgBox i
End Sub
A nivel de proyecto
Si quieres usar una variable en todos los procedimientos del libro (da igual el módulo), debes declararla fuera de cualquier procedimiento y con la palabra Public
(en lugar de Dim
) de esta forma:
Las variables estáticas
Cuando trabajas con variables locales (las de nivel procedimiento) tan pronto como finaliza el procedimiento donde se declaran, estas pierden el valor y se borran.
En caso de que quieras que la variable conserve su valor, necesitas utilizar la palabra clave Static
.
Te muestro un ejemplo. Te pido que ejecutes el siguiente código varias veces:
Sub Procedimiento1()
Dim i As Integer
i = i + 10
MsgBox i
End Sub
Como podrás comprobar, cada vez que lo ejecutas, se muestra el mismo valor en el cuadro de mensaje (10).
Ahora bien, si utilizas la palabra Static
en lugar de Dim
, y ejecutas varias veces el procedimiento, los valores que aparecen en el cuadro de mensaje aumentan en 10 con cada ejecución. Esto ocurre porque la variable i
conserva su valor y lo utiliza en el nuevo cálculo.
Sub Procedimiento1()
Static i As Integer
i = 10
MsgBox i
End Sub
Cómo declarar una constante
Hemos comprobado cómo las variables pueden cambiar de valor durante la ejecución del código. En otros casos necesitarás tener valores fijos. En ese caso puedes usar constantes.
Una constante te permite asignar un valor a un nombre que puedes utilizar en tus códigos.
La ventaja de usar constantes en los procedimientos es que facilita la escritura, legibilidad y manejo del código y también te permite controlar todos los valores fijos desde un solo lugar.
Por ejemplo, si estás haciendo cálculos con la velocidad de la luz y sabes que dicha velocidad es de 299.792.458 metros por segundo, puedes crear una constante (Velocidad_luz) y asignarle este valor.
Aunque la velocidad de la luz en el vacío se mantiene invariable, si queremos cambiar este valor en todas las partes del código, solo tienes que hacer el cambio en un lugar, en vez de cambiarlo manualmente cada vez que aparezca en el procedimiento.
Te muestro un ejemplo de cálculo con una constante:
Sub calculoLuz()
Dim kms As Double
Const Velocidad_luz As Long = 299792458
kms = Velocidad_luz / 1000
MsgBox "La velocidad de la luz en Km/h es de " & kms
End Sub
La siguiente línea declara la constante:
Const Velocidad_luz As Long = 299792458
Cuando se declara una constante es necesario comenzar con la palabra Const
seguida del nombre de la constante.
Observa que en el ejemplo anterior he especificado el nombre de la constante como Double
. Al igual que en las variables es una buena práctica especificar el tipo de datos para que el código sea más eficiente.
Si no declaras el tipo de dato se considerará de tipo Variant
.
Las constantes también cuentan con un ámbito o alcance, que depende de dónde y cómo se declaran.
- A nivel de procedimiento.
- A nivel de módulo
- A nivel de proyecto (para todos los módulos).
En la sección “Ámbito de las variables” te detallo los ámbitos.
Resumen
… y hasta aquí la teoría. Ahora te toca ponerlo en práctica. Para hacerlo te recomiendo crear dos o tres procedimientos que modifiquen el valor de una variable (con sumas o restas sencillas). A continuación declara la variable en diferentes ubicaciones y ejecuta los procedimientos para ver cómo se comporta el valor final.