🎃 Grandes descuentos en libros en línea, eformaciones y vídeos*. Código CALABAZA30. Pulse aquí
¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
  1. Libros
  2. VBA Access (versión 2019 y Office 365)
  3. El lenguaje VBA
Extrait - VBA Access (versión 2019 y Office 365) Programar en Access
Extractos del libro
VBA Access (versión 2019 y Office 365) Programar en Access
2 opiniones
Volver a la página de compra del libro

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...