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.

Declaración de un tipo personalizado

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.

Constantes integradas