Variables en Excel VBA
Las variables permiten almacenar valores intermedios durante la ejecución del código VBA para usarlos luego en cálculos, comparaciones, pruebas…
Las variables se identifican por un nombre que permite hacer referencia al valor que contienen, y un tipo que determina la naturaleza de los datos que pueden almacenar.
Tipos de variables
1. Numéricas
Tipo | Rango | Tamaño en bytes |
---|---|---|
Byte | 0 a 255 | 1 |
Integer (entero) | -32.768 a 32.767 | 2 |
Long (entero largo) | -2.147.483.648 a 2.147.483.647 | 4 |
Single (real simple de coma flotante) | 3,402823E38 a 1,401298E45 (valores negativos)
1,401298E45 a 3,402823E38 (valores positivos) |
4 |
Double (real doble de coma flotante) | 1,79769313486231E308 a 4,94065645841247E324 (Valores negativos)
4,94065645841247E324 a 1,79769313486231E308 (valores positivos) |
8 |
Currency (monetario de punto fijo) | 8 | |
Decimal | 12 |
2. Cadenas de caracteres
Es el tipo String, existen dos tipos de cadenas:
- Las cadenas de longitud variable pueden contener aproximadamente dos mil millones de caracteres.
- Las cadenas de longitud fija pueden contener de 1 a aproximadamente 64 KB de caracteres.
Ejm
Veamos un ejm de cadenas de longitud variable y fija
' Cadena de longitud variable Dim sDomicilio As String ' Cadena de longitud fija (20 caracteres) Dim sNombre As String * 20
3. Booleano o fijo
El tipo es Boolean (o booleano). La variable puede tomar los valores True (Verdadero) o False (Falso), que es su valor por defecto. Ocupa dos bytes.
4. Fecha
El tipo es Date. La variable puede tomar los valores de fecha y de hora del 1 de enero del año 100 al 31 de diciembre de 9999. Ocupa ocho bytes.
5. Variant
Las variables de tipo Variant pueden contener datos de todo tipo, además de los valores especiales Empty, Error y Null.
Usar el tipo de dato Variant ofrece más flexibilidad en el tratamiento de datos. Por ejemplo, si una variable de tipo Variant contiene cifras, se puede usar su valor real o su representación en forma de cadena, según el contexto.
De todas formas, las variables de tipo Variant requieren 16 bytes de memoria para números y 22 bytes más la longitud de la cadena para los caracteres, esto puede ser perjudicial en el caso de procedimientos largos o en módulos complejos.
Ejm
Sub Variable_Variant() ’ Declaración de la variable "Valx" como Variant Dim Valx As Variant ’ Asignación de una sucesión de valores a la variable ’ y mostrar el tipo del resultado ’ 10 retorna un valor de tipo Integer Valx = 10 MsgBox Valx & " es de tipo " & TypeName(Valx) ’ Ejemplo que retorna un valor de tipo String Valx = "Ejemplo" MsgBox Valx & " es de tipo " & TypeName(Valx) ’ Esta multiplicación retorna un valor de tipo Double Valx = 12500.32 * 1E+21 MsgBox Valx & " es de tipo " & TypeName(Valx) ’#1/1/99# retorna un valor de tipo Date Valx = #1/1/99# MsgBox Valx & " es de tipo " & TypeName(Valx) ’ True retorna un valor de tipo Boolean Valx = True MsgBox Valx & " es de tipo " & TypeName(Valx) End Sub
6. Objeto
El tipo es Object. Para crear una variable que contenga un objeto, comienza por declarar la variable como tipo Objeto y luego asígnale un objeto.
Para declarar una variable tipo objeto hacemos lo siguiente.
Si el tipo de objeto no se conoce
InstrucciónDeDeclaración NomVariable As Object
Si se conoce el tipo de objeto, usa la sintaxis:
InstrucciónDeDeclaración NomVariable As TipoObjeto
Ejm
Sub Variables_Objeto() ’ oTest se declara como objeto ’ ShtNomCli se declara como hoja de cálculo ’ oGrafico se declara como gráfico Dim oTest As Object Dim ShtNomCli As Worksheet Dim oGrafico As Chart End Sub
Para asignarle un objeto a una variable objeto, usamos la introducción Set:
Set NomVariable = ObjetoaAsignar
Ejm
Declaración de una variable ZonaTest destinada a contener un objeto Range y asignación de las celdas A6 a B15 a esta variable.
Dim oZonaTest As Range Set oZonaTest = Range("A6:B15")
Para finalizar la asociación entre una variable y un objeto determinado, usamos la siguiente sintaxis.
Set NomVariable = Nothing
7. Definido por el usuario (o personalizado)
Los tipos de datos personalizados se crean con la instrucción Type usada a nivel de módulo.
Sintaxis
Type NomTipoPerso NomElemento1 As TipoDatos NomElemento2 As TipoDatos ... End Type
La definición del tipo solamente se puede hacer en la sección de declaración de un módulo.
Ejm
Declaración de un tipo personalizado constituido por una letra y un número entero en el módulo de código ProGene.
Uso del tipo personalizado para controlar los códigos de artículos introducidos de la celda B6 a la celda B11 de la hoja de cálculo activa. En caso de error, se muestra un mensaje.
Sub Ctrl_Articulos()
Dim codArt As TDCodArticulo
Dim ZonaTest As Range
Dim Cell As Range
‘ Controla los código ingresadps
Set ZonaText = Range(“B6:B11”)
On Error GoTo Error1:
For Each Cell In ZonaTest
codArt.Letra = Cell.Characters(1, 1).Text
codArt.Numero = Cell.Characters(2).Text
Next
Exit Sub
‘ Rutina de administración de errores
Erro1:
Cell.Select
MsgBox “Cod de artículo incorrecto” & Cell
Resume 1
End Sub
2. Declaración de variables
Para crear una variable, debes declararla, es decir, darle un nombre. Luego puedes usar ese nombre para modificar el valor de la variable, usar ese valor…
La declaración de variables en VBA puede ser implícita o explícita.
Declaraciones implícitas
Se hacen directamente al asignar un valor a un nombre de variable. El tipo de datos será entonces el tipo por defecto, o sea, Variant.
Ejm
i=12 dImporte=12000 sNombre="Juan"
Declaraciones explícitas
Requieren el uso de una instrucción de declaración (Dim, Public, Private, etc.). Si el tipo de la variable no se indica, la variable resultará del tipo por defecto, o sea, Variant.
Se puede imponer la declaración implícita de variables usando la instrucción Option Explicit en la sección de declaración de cada módulo. Para insertar esta instrucción automáticamente en cada nuevo módulo, active la opción Requerir declaración de variables del menú Herramientas – Opciones – pestaña – Editor.
Ejm
Dim I Private dImporte As Double Public sNombre as String
Para optimizar la velocidad de ejecución del código VBA, se recomienda declarar las variables en forma explícita.
Sintaxis de las instrucciones de declaración
Es la siguiente
<InstruccióndeDeclaración> NomVariable [As <TipodeDatos>]
Donde InstruccióndeDeclaración corresponde a una de las siguientes cuatro instrucciones: Dim, Public, Private o Static.
- DIm: Las variables declaradas con la instrucción Dim a nivel de módulo están disponibles para todos los procedimientos del módulo. No son accesibles desde ningún otro módulo. Las variables declaradas con la instrucción Dim a nivel de procedimiento solamente están disponibles dentro del procedimiento.
- Private: Solamente a nivel de módulo. Las variables Private solamente están disponibles para el módulo en el que son declaradas.
- Public: solamente a nivel de módulo. Las variables declaradas con la instrucción Public son
accesibles desde el conjunto de módulos de todos los proyectos de Excel abiertos. Si la
instrucción Option Private Module se especifica en la sección de declaración del módulo, las
variables solamente son públicas dentro del proyecto que las recibe. - Static: solamente a nivel de procedimiento. Las variables declaradas con la instrucción Static
conservan su valor mientras dure la ejecución del código.
3. Declaración de los tipos de variables
El tipo de variable se especifica en la declaración, tras la palabra clave As.
Ejm
Sub TotalAcum() Dim iTotal As Integer Static iAcum As Integer iTotal = iTotal + 10 iAcum = iAcum + 10 ' DEVUELVE 10 EN CADA EJECUCIÓN DEL PROCEDIMIENTO MsgBox iTotal ' DEVUELVE 10 EN LA PRIMERA EJECUCIÓN, LUEGO 20 LA SEGUNDA VEZ ' 30 LA TERCERA... MsgBox iAcum End Sub
Se puede declarar más de una variable en una misma instrucción, pero ojo, el tipo de datos solo se tendrá en cuenta para la última variable, el tipo Variant se asignará al resto.
Declaraciones implícitas del tipo
El tipo de variable se declara usando un sufijo en el momento de su utilización o por la instrucción DefType.
Empleo de un sufijo
Debemos agregar uno de los siguientes caracteres al nombre de la variable.
Sufijo | Tipo de datos |
---|---|
% | Integer |
& | Long |
! | Simple |
# | Double |
@ | Currency |
$ | String |
Ejm
Declarar la variable como tipo cadena
Dim Nombre$
Declarar la variable como tipo booleano (Currency)
Dim Deuda@
DefType
Estas instrucciones se emplean en la zona de declaración del módulo, para definir los tipos de datos por defecto de las variables cuyos nombres comienzan por los caracteres especificados.
La lista de instrucciones Deftype es la siguiente:
instrucción | Tipo de datos |
---|---|
DefBool | Boolean |
DefDbl | Double |
DefInt | Integer |
DefDate | Date |
DefLng | Long |
DefStr | String |
DefCur | Currency |
DefObj | Object |
DefSng | Single |
DefVar | Variant |
DefByte | Byte |
Ejm
Todas las variables cuyos nombres comienzan por una letra comprendida entre I y K y por la letra N son variables de tipo entero (Integer).
DefInt I-K, N
Las variables que comienzan por una letra comprendida entre A y H serán de tipo cadena (String).
DefStr A-H
La instrucción siguiente declara la variable Identificador como tipo Variant y las variables Superficie y Latitud como tipo Entero.
Dim Identificador, Superficie As Integer Dim Latitud As Integer
Convención de nombres de variables
Se recomienda utilizar una convención de nombres para las variables. Permiten estandarizar el código y hacerlo más legible y más fácil de mantener por diferentes desarrolladores.
La convención consiste en utilizar dos prefijos en el nombre de las variables.
- El primero para indicar el ámbito de la variable: p o pb (para pública), m o mo para módulo, y ningún prefijo para las locales.
- La segunda para indicar su tipo.
Veamos como quedaría.
Tipo | Prefijo | Ejemplo |
---|---|---|
Boolean | b o bln | bVisible o bInvisible |
Double | d o dbl | dTotal o dblTotal |
Integer | i o ing | iEdad o intEdad |
Long | l o lng | lCanTot o lngCanTot |
Object | o u obj | oCelda u objcelda |
String | s o str | sNombre o strNombre |
Variant | v o var | vParam o varParam |
4. Matrices
Puedes crear una variable matriz cuando necesites trabajar con un grupo de valores relacionados.
Para crear una variable matriz, se sigue la siguiente sintaxis:
<InstrucciónDeDeclaración> NomMatriz(índices) [As<TipodeDatos>]
Donde para (índices):
- Si se omite este argumento: la matriz tendrá dimensión libre.
- Si se indica un valor: la matriz tendrá un número determinado de elementos.
- Si se indica LimiteInf To LimiteSup: la matriz tendrá un número de elementos determinado y números de índice específicos.
Por defecto, el valor menor del índice de una matriz es 0.
- Para modificar el valor menor del índice, usa la instrucción Option Base MenorValorÍndice en la sección de declaración del módulo o use la sintaxis LimiteInf To LimiteSup en el argumento (índices).
- Para definir el contenido de una matriz, usa la función Array (la variable debe ser una tabla de dimensión libre) o despliega los datos en una hoja o asigne una por una cada variable de la matriz usando los índices.
Ejm
El siguiente ejemplo muestra, en la hoja activa de Excel, la lista de los factores de conversión a euros para cinco países.
Const FacFRF = 6.55957 Const FacBEF = 40.3399 Const FacDEM = 1.95583 Const FacESP = 166.386 Const FacIT = 1936.27 Sub Muestra_Factor() Dim Pais As Variant Dim Factor(5) As Double Dim i As Integer ' LISTA DE PAÍSES Pais = Array("Francia", "Belgica", "Alemania", "España", "Italia") ' LISTA DE LOS FACTORES POR PAÍS Factor(0) = FacFRF Factor(1) = FacBEF Factor(2) = FacDEM Factor(3) = FacESP Factor(4) = FactIT ' MUESTRA LOS PAISES Y SUS FACTORES EN LA HOJA DE CÁLCULO EURO For i = 0 To 4 With Sheets("Euro") .Cells(i + 1, 1) = Pais(i) .Cells(i + 1, 2) = Factor(i) End With Next i End Sub
En este ejemplo, también es posible usar una matriz de dos índices. El código VBA del procedimiento queda como sigue:
Sub Muestra_Factor2 ’ Matriz de dos índices Dim TabFactor(5, 1) Dim i As Integer ’ Lista de países y sus factores TabFactor(0, 0) = "Francia" TabFactor(0, 1) = FacFRF TabFactor(1, 0) = "Bélgica" TabFactor(1, 1) = FacBEF TabFactor(2, 0) = "Alemania" TabFactor(2, 1) = FacDEM TabFactor(3, 0) = "España" TabFactor(3, 1) = FacESP TabFactor(4, 0) = "Italia" TabFactor(4, 1) = FacITL ’ Muestra los países y sus factores en la hoja de cálculo Euro For i = 0 To 4 With Sheets ("Euro") .Cells(i + 1, 1) = TabFactor(i, 0) .Cells(i + 1, 2) = TabFactor(i, 1) End With Next i End Sub
5. Constantes
Una constante permite asignar un nombre específico a un valor.
Constantes personalizadas
La declaración de una constante se hace con la instrucción Const en la sección de declaración de un módulo o en un procedimiento.
Const NomConstante [As <TipoDato>] = <expresión> As TipoDato (El tipo de dato no puede ser un objeto (Object) ni un tipo personalizado (Type)). expresión (No puede ser una función definida por el usuario, ni una función intrínseca de Visual Basic).
Ejm
Vamos a declarar algunas constantes
Sub Constantes() ' EJMS DE CONSTANTES AUTORIZADAS Const Val1 = "Mega+" Const Val2 = 148 Const Val3 = 125.45 ' EL TIPO DE DATOS ES DOUBLE Const Val4 As Single = 125.45 ' PERMITE AHORRAR MEMORIA Const Val5 = Val2 + Val3 Const val6 = Val1 & " cuesta " & Val2 ' EJM DE CONSTANTE NO AUTORIZADA ' POR EL USO DE UNA FUNCIÓN vb Const val6 = Fix(Val4) End Sub
Para crear una constante accesible a todos los libros abiertos, se debe declarar en la sección de declaración de un módulo y situar la instrucción Public antes de la instrucción Const.
Constantes integradas
Las constantes usadas por los objetos de Microsoft Excel van precedidas por las letras ‘xl’. Las constantes usadas con otras instrucciones y funciones de Visual Basic van precedidas por las letras ‘vb’, y las constantes de Microsoft Office van precedidas por las letras ‘mso’.
Para mostrar la lista de constantes integradas, abre el examinador de objetos haciendo clic en el icono Constantes, o pulsando la tecla de función F2. Escribe la palabra constants en la lista desplegable Texto de búsqueda y dale a búsqueda.