El lenguaje VBA
Una programación secuencial
VBA es un lenguaje de programación secuencial, es decir, que las instrucciones que se codifican se deben ejecutar en su orden de aparición en el programa. Una instrucción solo se puede ejecutar si la que la precede se ha ejecutado.
Un perro seguirá las instrucciones en su orden de aparición: "Sentado", "Arriba", "Tumbarse".
Sintaxis posibles
En VBA, las instrucciones se separan por un retorno de carro o por el signo dos puntos “:”.
Por ejemplo, consideremos el siguiente programa:
Instrucción_1
Instrucción_2
Instrucción_3
La ejecución de este programa implicará la ejecución de Instrucción_1, después Instrucción_2 y para terminar Instrucción_3. El programa se podría haber escrito de manera equivalente como sigue:
Instrucción_1: Instrucción_2: Instrucción_3
Si una instrucción es demasiado larga para escribirse en una única línea, o si desea dividirla en varias líneas para simplificar la lectura, es posible pasar a la siguiente línea usando el símbolo subrayado (underscore) “ _ ”. De esta manera, la ejecución del programa arranca la ejecución de la instrucción Instrucción_a:
Instruc_
ción_A
Estructura de un programa
Un programa VBA se descompone en una serie de procedimientos y funciones, escritos con el objetivo de realizar una o varias operaciones. Las instrucciones se deben codificar dentro de estos procedimientos o funciones. Se trata de declarar procedimientos (y funciones).
Por tanto, en un módulo, el programa está formado por una serie de declaraciones de procedimientos y funciones. Una vez estos procedimientos se declaren, se ejecutarán cuando el programa los llame.
Para ejecutar un programa VBA, se ejecuta una macro, que es un procedimiento particular, la cual contiene las instrucciones que hacen la llamada a otras funciones y procedimientos. Para poder funcionar, un programa VBA debe tener, al menos, una macro declarada.
A continuación se muestra un ejemplo de programa VBA dentro de un módulo.
Sub Procedimiento_AProcedimiento_A()
...
End Sub
Sub Procedimiento_BProcedimiento_B()
...
End Sub
Function Funcion_C...
...
End Function
Sub Macro_1()
Procedimiento_AProcedimiento_A
...
End Sub
En este ejemplo, podemos comprobar la declaración de los procedimientos Procedimiento_A y Procedimiento_B, de la función Funcion_A y de la macro Macro_1. La primera instrucción de Macro_1 es una llamada al procedimiento Procedimiento_A. Por tanto, la primera operación ejecutada durante...
Las variables
Las variables son recipientes que permiten almacenar información en todo momento, durante la ejecución de un programa, y utilizarla en cualquier otro momento. En VBA, una variable queda definida por medio de dos atributos:
-
Su nombre, que se utilizará para acceder a la información que contiene; para obtener información adicional sobre las convenciones de nomenclatura, consulte Convenciones de nomenclatura y tipografía del código VBA.
-
El tipo de dato que almacena.
1. La sintaxis de declaración
Como sucede con las funciones y los procedimientos, para que una variable se pueda llamar y utilizar, es necesario declararla. La sintaxis de declaración de una variable es la siguiente:
Dim NombreDeVariable As TipoVariable
La palabra clave Dim sirve para declarar una variable. Viene seguida del nombre de la variable. Después de la palabra clave As, encontramos el tipo de la variable. Hay varios tipos de datos, que es posible manipular en VBA.
Al presentar a su perro, se indica su nombre y su raza ("Milou, fox-terrier"), y para usar una variable, se llama por su nombre.
2. Los tipos de datos
Hay varios tipos de datos (también tenemos las constantes).
De la misma manera que existen varias razas de perros.
a. Los tipos numéricos
Los valores enteros
El tipo Byte permite almacenar un entero comprendido entre 0 y 255 (almacenado en 8 bits, es decir, 1 byte).
Dim b As Byte ...
Las constantes
1. Las constantes de usuario
Las constantes de usuario permiten asignar una etiqueta a un valor fijo. El uso de constantes permite facilitar la programación, fundamentalmente en el marco de una eventual actualización de valores. Por ejemplo, podemos utilizar una constante para almacenar el número de días por semana. La sintaxis genérica es la siguiente:
Const NombreConstante As TipoConstante = ValorConstante
Ejemplo:
Const NUMERO_DE_DIAS_POR_SEMANA As iNTEGER = 7
La constante NUMERO_DE_DIAS_POR_SEMANA, de tipo número entero, tiene el valor 7 en todo momento, mientras se utilice en el programa.
Una vez que se ha definido el valor de la constante, no se puede modificar.
2. Las constantes de Office
En VBA, hay un determinado número de constantes de Office que están directamente relacionadas con las diferentes aplicaciones (Access, Excel, etc.). Estas constantes tienen valores predefinidos y sus nombres respetan una nomenclatura: AplicacionNombre (ac para Access, xl para Excel, vb para VB, etc.). A continuación se muestran algunos ejemplos de constantes de VBA:
Herramienta/aplicación |
Ejemplos de constantes |
Access |
acGreaterThan, acPage, acTextBox |
Excel |
xlUp, xlLabel, xlPasteFormats |
VB |
vbBlue, vbMinimizedFocus, vbFriday |
Las tablas
Hasta ahora, hemos visto la manera de almacenar un valor en una variable. También es posible almacenar varios valores en varias variables. Finalmente, es posible almacenar varios valores dentro de una única variable usando una tabla. Crear una tabla de n elementos implica crear n variables diferentes al mismo tiempo.
Las variables de tipo tabla sirven para almacenar grupos de datos del mismo tipo. Se podrá acceder a cada elemento de la tabla utilizando un número secuencial. Una modificación de uno de los elementos de la tabla no modifica el resto de los elementos de la tabla.
Una tabla puede estar compuesta por una o varias dimensiones, cada dimensión se define por medio de unos límites inferior y superior. Estos límites pueden ser fijos o dinámicos. Las tablas solo pueden cambiar de dimensión durante la ejecución del programa, cuando son dinámicas.
Una tabla siempre necesitará 20 bytes de memoria, más 4 bytes por dimensión y el número de bytes necesarios según el tipo de valores almacenados.
1. Las tablas de tamaño fijo
Se determina una tabla de tamaño fijo cuando se define durante la declaración de la variable.
Option Base 0
Dim Tabla(4) As Integer
El índice 4 especifica el tamaño de la tabla. La numeración de los elementos puede comenzar en 0 o 1, según la definición de la instrucción...
Los operadores
Existen varios operadores en VBA que se pueden utilizar, según los tipos de variables. Los resultados de los operadores se representan en los siguientes ejemplos, a la derecha del símbolo =.
1. Los operadores numéricos
+, -, *, /: operadores matemáticos de las operaciones básicas
+: suma
1 + 4 = 5
-: resta
6 - 2 = 4
*: multiplicación
3 * 6 = 18
/: división
35 / 5 = 7
\: para la división entera
8 \ 3 = 2
^: potencia
3 ^ 4 = 3 * 3 * 3 * 3 = 81
mod: módulo
El módulo devuelve el resto de la división entera de un número entre otro.
25 mod 3 = 1' (car 25 = 3 * 8 + 1)
2. Los operadores de cadenas de caracteres
&: concatenación
Para concatenar dos cadenas de caracteres entre ellas, se usa el símbolo ampersand “ & ”. Observe que el operador + también puede funcionar, pero se pueden producir errores si utiliza este operador, ya que se usa para las variables numéricas.
"Hello " & "world" = "Hello world"
3. Los operadores de fechas
+: suma
#01/19/2018# + 365 = #01/19/2019#
-: resta
#02/15/2016# - 3 = #02/12/2016#
4. Los operadores booleanos, operadores lógicos
And: operador Y
True And False = False
Or: operador O
True Or False = True
Not: operador NO
Not True = False
Xor: operador O EXCLUSIVO
Xor permite determinar si es una u otra, pero no las dos al mismo tiempo.
True Xor False = True ...
Los procedimientos
Un procedimiento es una serie de instrucciones que modifica el entorno, pero no devuelve ningún valor al final. Un procedimiento puede estar directamente codificado en un módulo, así como relacionado con un evento sobre un objeto de Access (formulario, botón, etc.). Algunos procedimientos se pueden crear automáticamente a partir de una macro de Access o del asistente de Access.
Para nuestro perro, "Sentarse" o "Ir a la caja" son procedimientos.
1. Declaración de un procedimiento
La declaración de un procedimiento en VBA se hace con la palabra clave Sub, según la siguiente sintaxis:
[Private o Public] Sub Nombre_de_Procedimiento([argumento_1 As
Tipo_Argumento, ...])
'Comentarios
Instrucciones
End Sub
Nombre_de_Procedimiento es el nombre del procedimiento, y argumento_1, el nombre de un argumento de tipo Tipo_Argumento. La expresión entre corchetes [Private o Public] significa que podemos añadir si queremos una de las palabras clave Public o Private, utilizadas para definir el carácter público o privado del procedimiento. Si no se utiliza ninguna de estas palabras clave, el procedimiento será público por defecto.
Un procedimiento público se puede llamar desde cualquier otra ubicación del programa. Un procedimiento privado solo se puede llamar desde otro procedimiento...
Las funciones
Una función es una serie de instrucciones que devuelve un único valor, a saber, el resultado de una expresión.
Nuestro perro va a traernos un periódico si le pedimos "Ve a buscar un periódico".
1. Declaración de una función
La declaración de una función en VBA se hace con la palabra clave Function, según la siguiente sintaxis:
[Private o Public] Function Nombre_Funcion([argumento_1
As Tipo_Argumento, ...]) As Tipo_Retorno
'Comentarios
Instrucciones
Nombre_Funcion = expresión
End Function
Nombre_Funcion es el nombre de la función y argumento_1 el nombre de un argumento de tipo Tipo_Argumento. Una función se puede declarar con cero, uno o varios argumentos. As Tipo_Retorno permite determinar el tipo de valor que la función devolverá. La expresión entre corchetes [Private o Public] significa que podemos añadir si queremos, una de las palabras clave Public o Private, utilizadas para definir el carácter público o privado de la función. Si no se utiliza ninguna de estas palabras clave, la función será pública por defecto.
A continuación se muestra un ejemplo de función El_Doble, que recibe un entero x como argumento y devuelve el doble de su valor (x*2).
Function El_Doble (x As Long) As Long
'Función...
Pasar argumentos por valor y por referencia
1. Pasar argumentos
Durante la llamada a una función o procedimiento, algunas veces el programa necesita información para ejecutarse; es el caso, por ejemplo, de la función El_Doble, que necesita tener el valor x para devolver el doble.
Nuestro perro necesita saber qué buscar: "busca…la pelota".
La información proporcionada al procedimiento o función, se llama parámetros (también se utiliza la palabra argumento).
La pelota es el argumento para el perro.
La sintaxis general del paso de argumentos es la siguiente:
[Optional] [ByRef o ByVal] [ParamArray] <nombre_argumento>
[As Tipo_Argumento]
Cada una de las palabras clave tiene un impacto en la naturaleza del argumento.
a. Los argumentos obligatorios
Cuando un argumento es obligatorio para que el programa cumpla su función, la sintaxis es la siguiente:
Nombre_argumento As Tipo_Argumento
Por ejemplo, si se retoma la función El_Doble para que la función se ejecute, se debe proporcionar obligatoriamente el argumento x:
x as Long
b. Los argumentos opcionales
Si el argumento se puede proporcionar opcionalmente, se precede de la palabra clave Optional. Por ejemplo, un procedimiento que debe mostrar el nombre y apellidos de una persona, así como el nombre de pila, se escribirá como sigue:
Nombre As String, Apellidos As String, Opcional Nombre_De_Pila As String
Nombre_De_Pila es opcional, ya que puede que no tenga.
El perro sabe que estamos "fuera" cuando le decimos "salimos".
Es posible saber si el argumento se ha recibido o no durante la llamada a la función o procedimiento, con la función VBA IsEmpty, cuya sintaxis es la siguiente:
IsEmpty(Nombre_Argumento)
Esta instrucción devuelve True si se omite el argumento Nombre_Argumento, y False en caso contrario.
c. Pasar por referencia
Usando la palabra clave ByRef, la función o procedimiento al que se pasa el argumento...
Ámbito y ciclo de vida de las variables
1. El ámbito
Cuando se declaran y se utilizan variables en un programa, se plantea la cuestión de la accesibilidad de estas variables respecto al conjunto del programa. Hay varias maneras de declarar variables/constantes. Según la palabra clave utilizada durante la declaración, la variable será accesible solamente desde algunos puntos del programa. De la misma manera, una variable solo se puede conservar durante la ejecución de un procedimiento o durante toda la ejecución de un programa.
Se definen tres niveles de acceso posibles:
-
A nivel de un procedimiento: se trata de todas las variables declaradas dentro del procedimiento, no son visibles “fuera” del procedimiento. Se utilizan las palabras clave Dim y Static.
Para el perro, se tratará de una habitación de la casa.
-
A nivel de un módulo: todos los procedimientos y funciones que se declaren dentro del módulo tendrán acceso a esta variable. Se utilizan las palabras clave Dim y Private.
Se tratará de la casa completa.
-
A nivel del conjunto de los módulos del proyecto: se usa la palabra clave Public.
Es el interior y el exterior de la casa.
En el siguiente ejemplo, la variable varProc tiene un ámbito de nivel procedimiento, la variable varModuloPrivado tiene un ámbito de nivel módulo y la variable varModuloPublico tiene un ámbito de nivel proyecto....
Convenciones de nomenclatura y tipos de código VBA
Es muy recomendable, incluso obligatorio, seguir ciertas reglas de nomenclatura cuando se escribe un programa en VBA. Estas convenciones fundamentalmente permiten facilitar la lectura y relectura del código. Las secciones que siguen permiten ayudarle a conocer algunas de estas reglas.
Las reglas que siguen no son las únicas que se pueden utilizar. Cada empresa, equipo de desarrollo o desarrollador puede tener su propia regla de nomenclatura. Sin embargo, las reglas de nomenclatura más frecuentes se indican en las siguientes secciones.
1. Regla general
Los nombres de objetos, variables, constantes, funciones y procedimientos están sujetos a algunas reglas en VBA.
-
el nombre comienza por una letra;
-
el nombre está limitado a 255 caracteres;
-
el nombre puede estar compuesto por letras, cifras y el carácter de subrayado (_);
-
el nombre no puede contener el carácter de puntuación ni de espacio;
-
el nombre no puede corresponder a una palabra de VBA reservada;
-
el nombre debe ser único dentro de un mismo ámbito.
No podemos tener dos Rantanplan en una habitación, ni dos Milou en la casa, ni siquiera dos Snoopy en el exterior.
Ejemplos de nombres válidos
Nombre_Perro
NombrePerro
Nombre_1_Perro
Aunque no esté prohibido en VBA, se desaconseja utilizar caracteres acentuados, ya que son específicos y solo se pueden gestionar con ciertos teclados, lo que hace complicado su manejo posterior en el programa.
Le llamaremos Idefix en lugar de Idéfix.
2. Convención de nomenclatura de los objetos
De manera general, se deben renombrar los objetos de la interfaz (Controls). El nombre de los objetos sigue el modelo TypeOfControl, seguido de un número autoincrementado por Access. A continuación se muestran algunos ejemplos de nombres:
-
Texto10
-
Lista3
-
Comando7
Más allá de la dificultad de saber en el momento de codificar qué objeto hace referencia el nombre, es frecuente utilizar un prefijo que determine el tipo de objeto del que se trata, seguido del nombre del objeto. El uso de un carácter de subrayado entre el prefijo y el nombre del objeto puede ayudar en la lectura, pero no es un requisito previo.
A continuación se listan algunos prefijos para los objetos de control:
Prefijo |
Objeto correspondiente |
Ejemplo |
Cbo |
ComboBox: zona de lista desplegable |
Cbo_Usuario... |
Las estructuras de decisión condicional
Cuando se desea ejecutar código dependiendo de varias alternativas, es necesario llamar a estructuras de decisión condicional.
¿Qué cesta elegir?
1. La estructura de prueba If … Then … End If
a. Condicional único
En VBA, se usa la siguiente sintaxis:
If condición_1 Then
Instrucción_A
[Else
Instrucción_B]
End If
Los corchetes indican que las instrucciones situadas dentro son opcionales. El funcionamiento de esta estructura es el siguiente:
Si la condición condición_1 se cumple, entonces se ejecutará la instrucción Instrucción_A, en caso contrario se ejecutará la instrucción Instrucción_B.
Si el dueño está en el sofá, selecciono la cesta roja.
Por ejemplo, consideremos un programa que asigna a una variable bMayor, declarada inicialmente, el valor True si un valor comprendido entre 0 y 99 se almacena en una variable Edad y este valor es estrictamente superior a 17. El programa se escribiría de la siguiente manera:
If Edad > 17 Then
bMayor = True
Else
bMayor = False
End If
De esta manera, si el valor almacenado en la variable Edad es estrictamente superior a 17 (es decir, contiene un valor comprendido entre 18 y 99), bMayor vale True (porque la persona...
Los bucles
En VBA, cuando queremos ejecutar varias veces la misma serie de instrucciones, en lugar de copiar n veces las mismas instrucciones, como en el siguiente ejemplo:
Sub Metodo_Erroneo()
Msgbox "Hola"
Msgbox "Hola"
....
Msgbox "Hola"
End Sub
Es posible crear bucles, que indicarán al programa que debe ejecutar una serie de instrucciones varias veces. Hay varios tipos de bucles, que se explican en las siguientes secciones.
1. El bucle Do Loop
Hay varias estructuras de bucles Do Loop en VBA. Cada estructura tiene su sintaxis.
a. Do While Loop
La siguiente es la sintaxis:
Do While CondicionAComprobar
Instrucciones
Loop
La instrucción dentro del bucle se ejecuta mientras la condición CondicionAComprobar se cumpla.
El perro ve al cartero y ladra mientras esté frente a la casa.
b. Do Loop While
La sintaxis es la siguiente:
Do
Instrucciones
Loop While CondicionAComprobar
La instrucción dentro del bucle se ejecuta una primera vez, y se ejecuta de nuevo mientras la condición CondicionAComprobar se cumpla.
El perro ladra, ve al cartero y ladra mientras él esté frente a la casa.
c. Do Until Loop
La sintaxis es la siguiente:
Do Until CondicionAComprobar
Instrucciones
Loop
La instrucción dentro del bucle se ejecuta hasta...
Las entradas-salidas en VBA
Durante la ejecución de un programa, es posible interactuar con el usuario por medio de cuadros de diálogo. Estos cuadros de diálogo permiten al programa dar información al usuario, así como pedírsela. Hay dos funciones principales que muestran estos cuadros de diálogo.
1. La función InputBox
Esta función muestra un cuadro de diálogo en el que el usuario puede escribir texto o hacer clic en un botón, y la función devuelve al programa el contenido de la zona de texto en forma de cadena de caracteres. Esta función VBA se declara de la siguiente manera:
Public Function InputBox( _
ByVal Prompt As String, _
Optional ByVal Title As String = "", _
Optional ByVal DefaultResponse As String = "", _
Optional ByVal Xpos As Integer = -1, _
Optional ByVal YPos As Integer = -1, _
Optional ByVal HelpFile As String = "", _
Opcional Context As Long) As String
Como puede comprobar al leer la declaración de esta función, muchos de los argumentos son opcionales. A continuación se muestra a qué corresponden:
Argumento |
Descripción |
Prompt |
Corresponde al texto que se mostrará encima de la zona de texto en la que el usuario deberá escribir. Este argumento es obligatorio, limitado a 1024 caracteres. Es posible extender el texto en varias líneas, insertando retornos de carro (Chr(13)) y saltos de línea (Chr(10)). |
Title |
Corresponde al título que tomará el cuadro de diálogo. Este argumento es opcional y, si no se define ningún título, se mostrará como nombre de la aplicación "Microsoft Access". |
DefaultResponse |
Corresponde al valor por defecto de la zona de texto durante la visualización del cuadro de diálogo. Este argumento es opcional y, si no se define ningún valor por defecto, la zona de texto está vacía durante la visualización. |
Xpos |
Corresponde a la distancia horizontal, en píxeles (unidad relacionada con las pantallas), entre el borde izquierdo de la ventana y el borde izquierdo del cuadro de diálogo. Este argumento es opcional y, si no se indica ningún valor, el cuadro... |
Las salidas anticipadas: instrucción Exit
Hasta ahora, el código contenido en las funciones y procedimientos se debía ejecutar hasta llegar a la línea de salida del programa (End Function o End Sub). Sin embargo, puede ser útil poder salir de una función o procedimiento antes del fin de su ejecución. Es posible hacerlo gracias a la palabra clave Exit, seguida de la palabra clave que determina la sección de código de la que saldrá el código.
El perro que haya encontrado su hueso, deja de buscar.
Cuando empiece la programación, recomendamos no empezar de manera prematura con su código, porque esto puede causar dificultades en caso de error de diseño o programación.
1. Salida de la función: Exit Function
Es posible salir de una función antes del fin End Function. En el ejemplo siguiente, el programa saldrá de la función si el argumento proporcionado es igual a 1:
Function SiNoNul(x as Integer) As Boolean
SiNoNul = False
If x = 1 Then
Exit Function
End If
...
End Function
En caso en que la variable x que se pase como argumento no sea igual a 1, el código se continúa hasta llegar a la instrucción de fin de la función End Function.
2. Salida de un procedimiento: Exit Sub
Es posible salir de un procedimiento antes del fin End Sub. En el siguiente ejemplo, el programa saldrá...
La administración de errores en VBA
Cuando comenzamos en programación, incluiso cuando ya hemos escrito varios miles de líneas de código, puede suceder que el programa no esté perfectamente codificado y que haya errores al intentar ejecutarlo. Hay varios tipos de errores, y vamos a explicar los métodos que nos pueden permitir evitarlos.
1. Los posibles tipos de error
Cuando codificamos, hay varios errores posibles que se pueden cometer a diferentes niveles del código.
a. Los errores de sintaxis
Hablamos de error de sintaxis cuando el programa está escrito de manera incorrecta, desde un punto de vista sintáctico. Por lo general VBE detecta directamente este tipo de error y la línea se colorea en rojo (o en el color elegido en las opciones, ver la sección Las opciones de VBE - Formato del editor, en el capítulo VBE y seguridad en Access 2019). Para que se haga esta detección automática, es necesario marcar la casilla de selección Comprobación automática de sintaxis en las opciones de VBE (ver la sección Las opciones de VBE - Editor, en el capítulo VBA y seguridad en Access 2019). Los errores de sintaxis pueden deberse al olvido de palabras o a la incorrecta escritura de palabras.
Ejemplos de errores
El siguiente código genera un error, ya que se ha olvidado la palabra clave Then.
Sub AusenciaPalabaClave ()
Dim a As Integer
'la línea siguiente está incompleta,
se ha olvidado la palabra clave Then
If a=1
a = a - 2
End If
End Sub
El siguiente código genera un error, ya que la palabra clave End tiene un error ortográfico.
Sub ErrorOrtograficoPalabraClave()
Dim a As Integer
If a = 1 Then
a = a + 1
' la línea siguiente tiene un error ortográfico,
' la palabra clave And se debe sustituir por la palabra clave End
And if
End Sub
El código siguiente genera un error, ya que los paréntesis implican el uso de una asignación de variable.
Sub ErrorEnParentesis ()
'la línea siguiente tiene demasiados...