El lenguaje VBA
Módulos
1. Presentación
El código VBA asociado a un libro está agrupado en un proyecto que contiene varias carpetas:
La carpeta Microsoft Excel Objetos |
Contiene un módulo de clase asociado al libro del proyecto (llamado por defecto ThisWorkbook) y un módulo de clase por cada una de las hojas de cálculo u hojas de gráfico del libro. En particular, en estos módulos de clase se encuentran los procedimientos de eventos asociados al libro y a las hojas. |
La carpeta Formularios |
Contiene los formularios (UserForm) del proyecto y el código VBA asociado. |
La carpeta Módulos |
Agrupa los diferentes módulos estándares (compuestos por uno o más procedimientos) que pueden ser llamados desde cualquier procedimiento del proyecto. |
La carpeta Módulos de clase |
Contiene los módulos de clase usados para la creación de nuevas clases de objetos. Los módulos de clase se utilizan especialmente para la escritura de los procedimientos de eventos asociados a los objetos Application y Chart (ver capítulo Administración de eventos). |
La lista de todos los módulos aparece en forma jerárquica en el Explorador de proyectos del entorno VBE.
Si el explorador de proyectos no está visible, elija la opción Explorador de proyectos del menú Ver o pulse el método abreviado [Ctrl] R.
Para ver el código asociado a un módulo...
Procedimientos
1. Definiciones
Los procedimientos son subprogramas que permiten descomponer una tarea de programación compleja en un conjunto de tareas más breves y simples. Permiten organizar el código dentro de módulos para obtener un código de mantenimiento más simple y fácilmente reutilizable.
En VBA Excel, se distinguen tres tipos de procedimientos:
-
Los procedimientos Sub (por subrutina) se llaman subprogramas o procedimientos Sub.
-
Los procedimientos Function se llaman funciones.
-
Los procedimientos Property se llaman procedimientos de propiedad.
En este capítulo, solamente nos interesan los dos primeros, que son los más utilizados.
-
Puntos comunes entre procedimientos Sub y funciones:
-
Ambos contienen instrucciones o métodos VBA.
-
Ambos aceptan argumentos.
-
Ambos se pueden llamar desde otras funciones o procedimientos Sub.
-
-
Características específicas de las funciones:
-
Devuelven un valor.
-
Se pueden utilizar desde Excel como cualquier función.
-
2. Acceso a los procedimientos
Para acceder a un procedimiento desde la ventana de código de un módulo, abra la segunda lista de la ventana del módulo, haga clic en el nombre del procedimiento al que desea acceder o recorra los procedimientos con [Ctrl][Flecha arriba] y [Ctrl][Flecha abajo].
Para seleccionar una palabra, haga doble clic en la palabra.
Para seleccionar una línea, sitúe el puntero del ratón a la izquierda de la línea y haga clic cuando el puntero se convierta en una flecha.
Para seleccionar un grupo de caracteres, use la técnica de arrastrar y soltar o haga [Mayús] clic.
Para seleccionar un procedimiento completo, sitúe el puntero del ratón a la izquierda de cualquier línea del procedimiento. Cuando el puntero se transforme en una flecha, haga doble clic.
Para ejecutar un procedimiento, haga clic en el procedimiento que desea ejecutar y pulse [F5] o .
Para eliminar un procedimiento, seleccione todo el procedimiento y pulse [Supr].
3. Procedimientos Sub
Hay dos tipos de procedimientos Sub:
-
Los procedimientos Sub generales,
-
Los procedimientos Sub asociados a eventos.
Un procedimiento general es un procedimiento declarado en un módulo (generalmente un módulo estándar). La llamada a este tipo de procedimiento se define explícitamente en el código.
Un procedimiento...
Variables
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.
1. Tipos de variables
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,401298E-45 (valores negativos) 1,401298E-45 a 3,402823E38 (valores positivos) |
4 |
Double (real doble de coma flotante) |
-1,79769313486231E308 a 4,94065645841247E-324 (valores negativos) 4,94065645841247E-324 a 1,79769313486231E308 (valores positivos) |
8 |
Currency (monetario de punto fijo) |
-922 337 203 685 477,5808 a 922 337 203 685 477,5807 |
8 |
Decimal |
+/-79 228 162 514 264 337 593 543950 335 sin separador decimal; +/-7,9228162514264337593543950335 con 28 cifras a la derecha del separador decimal; el menor número distinto de cero es +/-0.0000000000000000000000000001 |
12 |
Cadenas de caracteres
El tipo es 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.
Ejemplo
' Cadena de longitud variable
Dim sDomicilio As String
' Cadena de longitud fija (20 caracteres)
Dim sNombre As String * 20
Boolean o lógica
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.
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.
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...
Matrices
1. Presentación
Las variables en forma de matriz permiten almacenar y trabajar con un conjunto de valores llamados elementos. Una variable matriz se caracteriza por un número de dimensiones y un tamaño (número de ocurrencias) para cada una de las dimensiones. El número total de elementos de la tabla es el producto de los tamaños de todas las dimensiones.
Una tabla de una dimensión permite almacenar una lista de valores, una tabla de dos dimensiones permite sobre todo almacenar datos de un rango de celdas Excel: el primer argumento representa las filas y el segundo argumento representa las columnas.
El número de elementos de cada dimensión se define:
-
Por el valor del índice más grande. En este caso, el índice del primer elemento de la tabla se determina con la instrucción Option Base en la sección de declaración del módulo.
-
Por los valores del primer y del último índice de la tabla
Una tabla cuya dimensión y tamaño se especifican en su declaración es una tabla estática. Una tabla cuyo tamaño se puede especificar y modificar durante la ejecución de un programa es una tabla dinámica, o tabla de dimensión libre.
Ejemplos
' Tabla estática de una dimensión que puede almacenar
' 13 valores de tipo cadena de caracteres (índice de 0 a 12)
Option base 0
Dim TabGastos(12) as String
' Tabla estática de una dimensión que puede almacenar
' 12 valores enteros (índice de 1 a 12)
Option base 1
Dim TabGastos(12) As Integer
' Tabla estática de dos dimensiones que permite almacenar
' los valores de 11 líneas y 11 columnas
Option base 0
Dim TabGastos (10, 10) As Double
Dim TabGastos (0 to 10, 0 to 10) as Double
' Tabla dinámica de dos dimensiones
Option base 1
Dim TabGastos() As Double
Redim TabGastos(11,11)
2. Declaración de una tabla
Para crear una variable matriz, use la siguiente...
Estructuras de decisión
Es conveniente testear las condiciones específicas antes de ejecutar las instrucciones.
Las estructuras de decisión, llamadas también alternativas o bifurcaciones condicionales, permiten, tras una evaluación, optar por uno u otro bloque de código.
Se distinguen dos instrucciones de bifurcación condicional:
-
If ... Then ... Else
-
Select ... Case
IIf también se puede usar para definir un valor en función de una condición. Ejemplo: Port = IIf(Cantidad < 100, 100, 0).
1. Instrucción If
Permite ejecutar ciertas instrucciones en función del resultado de una condición.
If...Then
If <condición> Then <instrucción> [:<instrucción>]
Si hay varias instrucciones, sepárelas por el signo de puntuación : (dos puntos). Esta sintaxis se usa especialmente para pruebas cortas y simples.
Ejemplo
Si la celda A1 está vacía, emite un bip y muestra un mensaje.
Sub Test_Celda_A1()
If IsEmpty(Range("A1")) Then Beep: MsgBox "Olvidó el título"
End Sub
If...Then...End If
If <condición> Then
<instrucción1>
<instrucción2>
...
End If
Ejemplo
Sub Test_Titulo()
' Si la celda A1 no está vacía
' entonces ponerla en negrita y pintarla de rojo
If Not IsEmpty(Range("A1")) Then
With Range("A1")
.Font.Bold = True
.Interior.ColorIndex = 3
End With ...
Estructuras en ciclo
Las estructuras en ciclo (o repetitivas) permiten repetir la ejecución de un conjunto de instrucciones.
Se distinguen varios tipos de estructuras en ciclo:
-
Do...Loop
-
While...Wend
-
For...Next
-
For Each...Next
Do...Loop y While...Wend repiten las operaciones en función de una cierta condición, mientras que For...Next repite las operaciones una cantidad de veces determinada por un contador.
For Each...Next permite recorrer los elementos de una colección.
1. Instrucción Do...Loop
Ejecuta un bloque de instrucciones un número indeterminado de veces.
Sintaxis 1
Las instrucciones se ejecutan, mientras que la condición devuelve el valor True.
Do While <Condición>
<Instrucciones>
Loop
Sintaxis 2
Las instrucciones se ejecutan una primera vez sin condición y, luego, mientras la condición devuelva True.
Do
<Instrucciones>
Loop While <Condición>
Ejemplo
El siguiente código solicita al usuario que escriba un número mientras que el valor introducido no sea numérico o superior a 100.
Sub Introducir_Numero ()
Dim vRespuesta as Variant
Do
vRespuesta = InputBox("Introduzca un número > 100")
Loop While (Not IsNumeric(vRespuesta) Or vRespuesta <= 100)
End Sub
Sintaxis 3
Las instrucciones se ejecutan hasta que la condición toma el valor True (mientras que la condición devuelva el valor False).
Do Until <Condición>
<Instrucciones>
Loop
Sintaxis 4
Las instrucciones se ejecutan una primera vez sin condición y luego hasta que la condición devuelva el valor True.
Do
<Instrucciones>
Loop Until <Condición>
Ejemplo
El siguiente código solicita al usuario que escriba un número hasta que el valor introducido sea numérico y mayor que 100.
Sub Introducir_Numero()
Dim vResponse as Variant
Do
vResponse = InputBox("Introduzca un número > 100")
Loop Until (IsNumeric(vResponse) And vResponse > 100)
End Sub
2. Instrucción While...Wend
Ejecuta una serie de instrucciones...
Operadores
Los operadores permiten realizar operaciones aritméticas con variables o constantes, comparar variables entre ellas, evaluar varias condiciones, etc.
Se distinguen varios tipos de operadores:
-
Operadores aritméticos.
-
Operadores de comparación.
-
Operadores lógicos.
-
Operador de concatenación.
El operador de asignación es el signo =. El valor de la expresión situada a la derecha del signo igual se asigna a la variable situada a la izquierda del signo (ejemplo: IntA = 12, IntA = Intb * 12).
1. Operadores aritméticos
Permiten efectuar cálculos aritméticos con variables o constantes.
Operador |
Cálculo realizado |
+ |
Adición |
- |
Sustracción |
/ |
División con resultado de un número con coma flotante |
Mod |
Resto de la división entre dos números |
\ |
División con resultado entero |
* |
Multiplicación |
^ |
Potenciación |
2. Operadores de comparación
Comparan dos valores o dos cadenas de caracteres.
Operador |
Cálculo realizado |
< |
Menor que |
<= |
Menor o igual que |
> |
Mayor que |
>= |
Mayor o igual que |
= |
Igual a |
<> |
Distinto de |
La instrucción Option Compare utilizada a nivel de módulo permite declarar el método de comparación por defecto que conviene usar en la comparación de cadenas.
Puede tomar uno de estos tres valores posibles:
-
La opción Compare Binary (opción por defecto) realiza la comparación de cadenas basada en el orden derivado de la representación binaria interna de los caracteres: A < B < E < Z < a < b < e < z < Á < Ê < Ø < á < ê...
-
La opción Compare Text realiza la comparación de cadenas sin distinguir mayúsculas de minúsculas: (A=a) < (Á=á) < (B=b) < (E=e) < (Ê=ê) < (Z=z) < (Ø=ø)...
-
La opción Compare...
Reglas de escritura del código
1. Comentarios
Los comentarios permiten documentar el código VBA para hacerlo más legible.
REM comentario
o
' comentario
Al validar la línea de comentario, esta se muestra, por defecto, en verde.
2. Carácter de continuación
Una instrucción VBA puede escribirse en muchas líneas usando un guion bajo "_" precedido de un espacio.
Ejemplo
' Pide la introducción de un precio en tanto que
' esté vacío o sea incorrecto
Dim vPrecio as Variant
Do While IsEmpty(vPrecio) Or Not IsNumeric(vPrecio) _
Or vPrecio < 50 Or vPrecio > 500
vPrecio = InputBox("Escribir un importe comprendido entre " _
& "50 y 500 ")
Loop
3. Sangrías
Las sangrías (o tabulaciones) permiten una mayor legibilidad del código. Es especialmente importante usarlas en las estructuras de control (sobre todo si hay varias instrucciones If anidadas) y las estructuras de decisión.
Para generar las sangrías, use la tecla [Tab].
Para retroceder a la tabulación precedente, use las teclas [Mayús][Tab].
Para modificar el tamaño de la tabulación (cuatro espacios por defecto), seleccione Opciones en el menú Herramientas, haga clic en la pestaña Editor y modifique...