Usando variables en VBA
- Índice.
- Variables explícitas e implícitas.
- Definir los tipos de las variables.
- Ámbito y Accesibilidad de las variables.
- Parámetros por valor y por referencia.
- Variables de objeto.
- Bibliografía.
Ámbito y Accesibilidad de las variables
Aunque Ámbito y Accesibilidad son los nombres que se les da a estas propiedades de las variables, los podemos cambiar por: ¿desde dónde puedo acceder y ver las variables que he creado? Ya que las 2 propiedades se interrelacionan entre ellas: dependiendo del ámbito donde creemos las variables, serán accesibles desde más módulos y objetos de Access. Y dependiendo de donde declaremos las variables, podemos clasificarlas en 3 grupos:
- Variables en una función.
- Variables en un módulo.
- Variables en un módulo de clase.
Variables en una función
Estas variables se dimensionan o declaran dentro de una función o método, y solamente existen en memoria cuando se está ejecutando la función o método donde se han declarado, y de la misma forma, sólo podemos acceder o modificar sus valores desde dentro de esa función o método. Este tipo de variables se dimensionan con Dim, y un ejemplo de estas variables son los ejemplos que hemos visto en las anteriores páginas de estos apuntes:
Function PruebaDecimales()
Dim dbl As Double
Dim sng As Single
Dim cur As Currency
Dim var
dbl = ((152.2) - Fix(152.2))
Debug.Print "El valor para un tipo doble es: " & dbl
sng = ((152.2) - Fix(152.2))
Debug.Print "El valor para un tipo single es: " & sng
cur = ((152.2) - Fix(152.2))
Debug.Print "El valor para un tipo currency es: " & cur
var = ((152.2) - Fix(152.2))
Debug.Print "El valor para un tipo variant es: " & var
End Function
En este ejemplo, declaramos 4 variables dentro de la función con Dim, y estas 4 variables sólo se inicializan y usan cuando se ejecuta la función, eliminándose de la memoria cuando ya no se usan.
Dentro de una función o método sólo podemos declarar las variables con Dim (y con Static, pero ese lo veremos después), ya que todas las variables declaradas en el ámbito de una función, siempre van a ser privadas a la función. O lo que es lo mismo, no podemos acceder a estas variables desde fuera de la función donde se crean: su accesibilidad está limitada a la función donde se declaran.
Hemos dicho que con Dim declaramos una variable dentro de una función, y que cada vez que ejecutemos esa función, se inicializa la variable, se realizan las operaciones que se desee con ella, y una vez salgamos de la función, la variable se elimina de la memoria y se pierde su valor. ¿Qué ocurre si queremos disponer de una variable que sea privada a una función, no pudiendo acceder a ella más que desde dentro de esa función, pero que no pierda su valor cuando salgamos de esa función? Para eso tenemos la declaración Static, que nos permite tener una variable privada a la función, pero que no pierde su valor entre las llamadas a esta:
Public Sub PruebaStatic()
'Su declaración es similar a usar Dim
Static VariableEstatica As Integer
'Como la vamos incrementando, comprobamos
'que no nos pasamos, para evitar errores
If VariableEstatica > 100 Then VariableEstatica = 0
'Incrementamos su valor
VariableEstatica = VariableEstatica + 1
'Y lo mostramos
Debug.Print "El valor de la variable estática es " & VariableEstatica
End Sub
Si ejecutamos esta subrutina desde la ventana Inmediato del editor de VBA, veremos que nos devuelve el mensaje indicando que la variable vale uno. Pero si la volvemos a ejecutar, la variable tendrá el valor 2, luego 3, 4, etc., hasta llegar a 100, donde la reiniciamos y vuelve a valer uno.
Variables en un módulo
Las variables que se declaran en un módulo estándar de VBA pueden ser de 2 tipos: privadas del módulo o públicas a la base de datos. Estas variables se declaran siempre en la sección Declaraciones del módulo, y podemos indicar si van a ser privadas o públicas dependiendo del modificador que usemos al declararlas.
- Variables privadas: se declaran con las instrucciones
Dim o Private, y sólo serán accesibles dentro del módulo que contiene su declaración. A estas variables se puede acceder desde cualquier procedimiento que hayamos declarado dentro de ese módulo. Además, estas variables mantienen el valor que almacenan durante el tiempo que mantenemos abierta la base de datos, ya que en cualquier momento podemos acceder a las funciones que tiene el módulo.
- Variables públicas: se declaran con la instrucción
Public y son accesibles desde cualquier punto de la aplicación, además de mantener su valor mientras se ejecuta la base de datos. Como se ve en la imagen, también podemos usar el identificador Global, pero no se recomienda su uso porque ha sido declarado como obsoleto. Es decir, en próximas versiones de Access puede desaparecer esta instrucción y nuestras bases de datos empezarían a dar errores por no saber VBA a qué nos referimos al usar esta palabra.
Con Private y Public también podemos definir si las funciones y métodos que hemos creado en el módulo van a ser privados o públicos, de igual forma que las variables. Por defecto, a un procedimiento que no indicamos si es público o privado, tendrá una accesibilidad pública, mientras que a una variable siempre hay que indicar la visibilidad, ya que con la instrucción declaramos la variable y reservamos su espacio, además de indicar la accesibilidad.
Hay una posibilidad de reducir la visibilidad de un módulo, y es usar la intrucción Option Private Module en el inicio de la sección Declaraciones. Si colocamos esta instrucción, ese módulo se comportará como un módulo normal en la base de datos donde lo hemos creado, pero estará oculto si llamamos a la base de datos desde otra base de datos. Por ejemplo, podemos evitar que determinadas funciones y variables se puedan usar directamente cuando creamos una base de datos que va a funcionar como un complemento de Access.
Variables en un módulo de clase
Una variable en un módulo de clase, ya sea un módulo de clase creado por nosotros, o los módulos que acompañan a los formularios e informes (un módulo de un formulario es un módulo de clase), tienen el mismo comportamiento, público o privado, que las variables de los módulos, pero con una pequeña diferencia: para acceder a una variable pública en un módulo de clase, hay que disponer de una instancia de esa clase, o no podremos disponer de esa variable. Esto no ocurre con los módulos "normales", ya que este tipo de módulos son públicos y accesibles directamente.
Existe otro tipo de accesibilidad en los módulos de clase, que es Friend. Con este modificador se consigue que un procedimiento creado en un módulo de clase sea accesible desde el proyecto o base de datos donde se encuentra el código del módulo de clase, pero se oculta cuando tratamos de usar el mismo procedimiento desde otra base de datos, con un resultado similar al que ocurre cuando usamos la instrucción Option Private Module. La diferencia es que el modificador Friend sólo funciona con procedimientos y métodos, pero no con variables, y que sólo actúa sobre la función que se declara como Friend.
|