Pasa Programación, apuntes y soluciones con Access
Página principal Mis apuntes de Access Mis utilidades Mis ejemplos Mis agradecimientos Enlaces a otras Webs

Usando variables en VBA

  1. Índice.
  2. Variables explícitas e implícitas.
  3. Definir los tipos de las variables.
  4. Ámbito y Accesibilidad de las variables.
  5. Parámetros por valor y por referencia.
  6. Variables de objeto.
  7. Bibliografía.

Variables explícitas e implícitas

Muchas veces nos encontramos con qué códigos que en un principio tienen que funcionar, no funcionan como esperamos, o simplemente devuelven unos resultados que no son los correctos. Y aunque repasamos cientos de veces el código, compilamos y volvemos a repasar, no encontramos ningún error que nos indique el porqué del fallo.

Una situación como la descrita anteriormente se da en el siguiente código. Para ver el resultado, copia el código y pégalo en un módulo de Access, y luego llama a la función desde la ventana Inmediato del editor de VBA.

Option Compare Database

Function
FuncionConFallos()
    strUnTexto = "Hola Pepe"
    strOtroTexto = "Hola Juan"

    strResultado = strUnTexto & vbCrLf & strOtoTexto
    Debug.Print strResultado
End Function

Al llamar a la función desde la ventana Inmediato, nos aparecerá lo siguiente:

FuncionConFallos
"Hola Pepe"
 

Lo cual, en un principio, no es lógico, ya que usamos 2 variables para almacenar unos textos, y luego el valor de esas 2 variables lo asignamos a una tercera más un sato de línea (constante vbCrLf), y el resultado lo colocamos en la ventana Inmediato.

Entonces, ¿por qué un código tan simple nos falla? Después de revisar el código, y si nos damos cuenta, veremos que en la asignación de la tercera variable nos hemos comido una letra en la variable strOtroTexto, con lo que los nombres ya no son iguales, y al no ser iguales, son variables diferentes que almacenan distintos valores. Si corregimos el error de escritura:

Option Compare Database

Function
FuncionSinFallos()
    strUnTexto = "Hola Pepe"
    strOtroTexto = "Hola Juan"

    strResultado = strUnTexto & vbCrLf & strOtroTexto
    Debug.Print strResultado
End Function

Y la llamamos de nuevo, obtendremos el resultado deseado:

FuncionSinFallos
"Hola Pepe"
"Hola Juan"
 

Y por suerte para nosotr@s, esta función era lo suficientemente pequeña para poder encontrar el fallo rápidamente. Pero, ¿qué pasa si la función es más compleja, o hay llamadas a otras funciones, o usos de variables públicas o de objetos de Access? La respuesta es muy sencilla: es una locura encontrar errores de escritura. Para impedir que suceda esto, es preferible que VBA no nos permita este tipo de escritura de código. Y para este propósito existe la instrucción Option Explicit, que debe escribirse en la sección Declaraciones del módulo (parte superior), antes que cualquier otra instrucción que insertemos, exceptuando otras instrucciones Option o comentarios de cçodigo:

Option Compare Database
Option Explicit

Function
FuncionConFallos()
    strUnTexto = "Hola Pepe"
    strOtroTexto = "Hola Juan"

    strResultado = strUnTexto & vbCrLf & strOtoTexto
    Debug.Print strResultado
End Function

Si ahora intentamos ejecutar esta función desde la ventana Inmediato, nos encontraremos que VBA nos advierte de que estamos usando variables no declaradas:

Error de compilación:
No se ha definido la variable

Por lo que tenemos que empezar a declarar o dimensionar las variables:

Option Compare Database
Option Explicit

Function
FuncionConFallos()
    Dim strUnTexto As String
    Dim strOtroTexto As String
    Dim strResultado As String

    strUnTexto = "Hola Pepe"
    strOtroTexto = "Hola Juan"

    strResultado = strUnTexto & vbCrLf & strOtoTexto
    Debug.Print strResultado
End Function

Ahora, si volvemos a intentar ejecutar esta función, nos volverá a aparecer el error de compilación, pero si pulsamos el botón Depurar, nos encontraremos que señala la variable strOtoTexto, que estaba mal escrita desde el principio. Entonces, lo único que debemos hacer es escribirla correctamente, y ya podemos usar la función.

El motivo de este tipo de funcionamiento, cuando no usamos la línea Option Explicit, es el carácter que da VBA a las variables. VBA permite, al contrario que otros lenguajes de programación, la declaración implícita de variables. Esto significa que, cada vez que escribimos una variable para almacenar un valor, VBA la declara y reserva un espacio en la memoria para ella. Al escribir la línea Option Explicit le indicamos a VBA que en ese módulo la declaración de variables va a ser explícita: queremos dimensionar y declarar nosotr@s mism@s las variables. Aunque en un principio parece que es mucho mejor la declaración implícita, nos podemos encontrar con el problema ya visto: tener variables mal escritas y obtener fallos, que no errores, de programación.

Nota: Aunque no lo parezca, Option Explicit puede eliminar muchos problemas y quebraderos de cabeza.

Pero como siempre se nos puede olvidar escribir la instrucción, el editor de VBA dispone de una opción que sirve para que escriba directamente esta instrucción en todos los módulos y clases que creemos, tal y como se ve en la imagen de la izquierda.

El problema es que esta opción sólo trabaja con los módulos y clases que creemos a partir de su activación. Para los módulos y clases que ya estén creados, habrá que recorrerlos e insertar esta instrucción a mano.

Para poder insertar más rápidamente la línea Option Explicit en los módulos de las bases de datos que ya hemos creado, en la base de datos que acompaña a estos apuntes, se ha agregado una función que lo hace por nosotr@s. Tan sólo debemos importarla a la base de datos que queramos actualizar y llamar a la función pública que tiene (AgregarOptionExplicit), desde la ventana Inmediato del editor de VBA.

Nota: Después de usar la función, se recomienda compilar el proyecto de VBA desde el menú Depuración -> Compilar.

2008 Patxi Sanz
Libro de visitas
Hosted by www.Geocities.ws

1