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.
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 ProcA ()
...
End Sub
Sub ProcB()
...
End Sub
Function FuncionA...
...
End Function
Sub Macro1()
ProcA
...
End Sub
En este ejemplo, podemos comprobar la declaración de los procedimientos ProcA y ProcB, de la función FuncionA y de la macro Macro1. La primera instrucción de Macro1 es una llamada al procedimiento ProcA. Por tanto, la primera operación ejecutada durante la ejecución de la macro Macro1 será la ejecución del procedimiento...
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:
-
Su nombre, que se utilizará para acceder a la información que contiene.
-
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.
2. Los tipos de datos
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
b = 10
El tipo Integer contiene un entero comprendido entre -32 768 y 32 767 (en 16 bits).
Dim i As Integer
i = 315
El tipo Long contiene un entero comprendido entre -2 147 483 648 y 2 147 483 647 (en 32 bits).
Dim l As Long
l = 70000
Los valores reales (decimales)
El tipo Single contiene un valor real comprendido entre -3,4028823 ...
Las constantes
1. Las constantes de usuario
Las constantes de usuario permiten asignar un nombre 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 un porcentaje de IVA. La sintaxis genérica es la siguiente:
Const NombreConstante As TipoConstante = ValorConstante
Ejemplo:
Const IVA As Double = 21.0
La constante IVA, de tipo número decimal, tiene el valor 21,0 en todo momento, mientras se utilice en el programa.
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 |
Constantes de ejemplo |
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
5 + 2 = 7
-: resta
3 - 1 = 2
*: multiplicación
5 * 2 = 10
/: división
20 / 4 = 5
\: para la división entera
5 \ 2 = 2
ˆ: potencia
2 ˆ 4 = 2 * 2 * 2 * 2 = 16
mod: módulo
El módulo devuelve el resto de la división entera de un número entre otro.
10 mod 3 = 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
#02/15/2016# + 5 = #02/20/2016#
-: 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
False Xor False...
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.
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_Procedimiento([argumento_1
Tipo_Argumento, ...])
'Comentarios
Instrucciones
End Sub
Nombre_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 llamará desde cualquier otra ubicación del programa. Un procedimiento privado solo se puede llamar desde otro procedimiento (o función), que se sitúa en el mismo módulo del programa.
Para hacer...
Las funciones
Una función es una serie de instrucciones que devuelve un único valor, a saber, el resultado de una expresión.
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 Al_Cubo, que recibe un entero n como argumento y devuelve su valor al cubo (n3= n * n * n).
Function Al_Cubo(n As Long) As Long
'Función que devuelve el valor de n potencia 3
Al_Cubo = n * n * 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 Al_Cubo, que necesita tener el valor n para devolver su cubo. La información que se proporciona al procedimiento o a la función se llama argumento.
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 será la siguiente:
Nombre_argumento As Tipo_Argumento
Por ejemplo, si se retoma la función Al_Cubo para que la función se ejecute, se debe proporcionar obligatoriamente el argumento n:
N 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.
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, recibe «realmente» la variable y, si se modifica en el cuerpo de la función o del procedimiento, su valor también se modificará en la salida del procedimiento...
Á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.
-
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.
-
A nivel del conjunto de los módulos del proyecto: se usa la palabra clave Public.
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.
Public varModuloPublico As Integer
Dim varModuloPrivado as Integer
Sub Init()
varModuloPublico = 50
varModuloPrivado...
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.
Ejemplos de nombres válidos
Nombre_Becario
NombreBecario
Nombre_1_Becario
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.
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:
-
Texto12
-
Lista2
-
Comando8
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 |
Lst |
ListBox: zona de lista |
Lst_Empresas |
Txt |
TextBox: zona de texto |
Txt_Nombre |
Lbl |
Label: etiqueta |
Lbl_Fecha_del_dia |
Btn |
CommandButton: botón de comando |
Btn_Salir... |
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.
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.
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 que tiene estrictamente más de 17 años es mayor de edad, - mayoría...
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 sintaxis:
Do While CondicionAComprobar
Instrucciones
Loop
La instrucción dentro del bucle se ejecuta mientras la condición CondicionAComprobar se cumpla.
b. Do Loop While
La sintaxis 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.
c. Do Until Loop
La sintaxis siguiente:
Do Until CondicionAComprobar
Instrucciones
Loop
La instrucción dentro del bucle se ejecuta hasta que la condición CondicionAComprobar se cumpla.
d. Do Loop Until
La sintaxis siguiente:
Do
Instrucciones
Loop Until CondicionAComprobar
La instrucción...
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.
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 0:
Function SiNoNul(x as Integer) As Boolean
SiNoNul = False
If x = 0 Then
Exit Function
End If
...
End Function
En caso en que la variable x que se pase como argumento no sea igual a 0, 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á del procedimiento si el argumento proporcionado es una cadena de caracteres vacía.
Sub SiNoVacia (x as String)
If x = "" Then
Exit Sub
End If
...
End Sub
En caso en que la variable...
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 2016). 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 2016). 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 + 1
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...