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.

Definir los tipos de las variables

En el capítulo anterior vimos como usar Option Explicit y las ventajas que acarrea, pero también conlleva un trabajo extra: debemos definir todas y cada una de nuestras variables. Pero, ¿qué debemos indicar para definir nuestra variable?

La forma más sencilla de declarar una variable es la siguiente:

Option Compare Database
Option Explicit

Function
DeclararVariables()
    Dim UnaVariable
    Dim OtraVariable
    Dim Resultado

    UnaVariable = 125648
    OtraVariable = "Pepe se fue a comer"
    Resultado = UnaVariable + OtraVariable
    Debug.Print Resultado
End Function

Y en un principio puede parecer que está bien. Definimos las variables, le asignamos un valor, e incluso VBA nos dice que hemos cometido un fallo al intentar ejecutarla, ya que no le puede sumar un número a un texto:

Error 13: No coinciden los tipos

Entonces, ¿cuál es el problema? El "problema" es que no hemos indicado el tipo de la variable al definirla con Dim, y eso equivale a dimensionar las variables con el tipo Variant. ¿Y qué es ese tipo? Ese tipo de variables, Variant, es el tipo más tragón que existe: se lo come todo, o casi todo, como hemos podido ver: le podemos asignar textos, números, fechas, o cualquier cosa que se nos ocurra. y no sólo se lo come todo, sino que también engorda. Por ejemplo, si declaramos una variable como String (texto variable), el tamaño de la variable será de 10 bytes más la longitud del texto guardado, mientras que si en Variant será de 22 bytes más la longitud del texto. Y si la declaramos como Double (número con precisión doble), el mayor de los declaradores de números, su tamaño será de 8 bytes, mientras que si usamos un Variant, el tamaño será de 16 bytes, independientemente del tamaño del número. Hoy en día, con la potencia y especificaciones de los ordenadores, tal vez no importe que una variable consuma unos bytes más que otra, pero hay que tener en cuenta que la memoria no está sólo ocupada por nuestras variables, sino que también está el código que estamos ejecutando, las demás variables que hemos declarado, nuestra base de datos, otros programas en ejecución, más otros datos temporales, y tampoco es cuestión de saturar la memoria del ordenador con variables ;-).

Pero hay otra excusa, y mucho mejor, para que se indiquen los tipos a usar, y sobre todo cuando se trata de números: la precisión decimal y el valor máximo a almacenar. Para entenderlo, vamos a hacer una pequeña prueba en una función de VBA:

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

Si ejecutamos la función desde la ventana Inmediato de VBA, nos encontramos con que las variables declaradas como Single y Currency devuelve el valor correcto: 0,2. Pero no ocurre lo mismo con la variable Double, que devuelve el valor 0,199999999999989. Pero, ¿por qué ocurre esto? Porque una variable de tipo Double, al poder almacenar números muy altos, o con muchos decimales, pierde algo de precisión en determinadas cirunstancias y operaciones, como la que hemos visto. ¿Y qué ocurre con el tipo Variant? Que cuando lo declaramos, no sabe qué tipo de dato va a almacenar, pero al pasarle un valor con decimales, se "convierte" en un tipo similar al Double, con sus mismas características, y volvemos a encontrarnos con la pérdida de precisión. Para evitar estos problemas, debemos tener en cuenta qué valores va a almacenar la variable, para asignarle el menor tipo posible, y evitar la pérdida de información. Tenemos una tabla con los tipos admitidos por VBA en su ayuda, en la página Resumen de tipos de datos. Cabe destacar que el tipo de datos con decimales y mejor precisión es el Currency.

Nota: La pérdida de información con los números con decimales es aplicable también a los tipos de datos de los campos de las tablas.

Para determinar el tipo de datos a usar, se suele usar la siguiente regla: si estamos seguros de que no vamos a necesitar la parte decimal de los números, siempre se usa un tipo de datos que no almacena esta parte (Byte, Integer o Long); si se precisa de la parte decimal, se usará uno de los tipos Single, Double, Decimal o Currency. Y siempre se escogerá el tipo más pequeño que pueda almacenar los valores que deseamos, ya que a tipo más pequeño, menor tamaño ocupa y mejor precisión decimal tiene.

Por último, indicar que en los apuntes Fechas y horas en Access se indicó que las fechas y horas se almacenan como números de precisión doble. Aunque esto es así, la precisión decimal para las horas, minutos y segundos está ajustada en estos tipos de datos para no perder precisión y evitar problemas como los que nos hemos encontrado con el tipo de datos Double.

Hasta ahora hemos visto como declarar las variables en distintas línea, pero, ¿qué pasa si declaramos las variables en la misma línea? Que es una forma completamente correcta, pero hay que tener en cuenta la regla de oro: variable a la que no indicamos el tipo, es una variable Variant:

'¿Qué ocurre cuando colocamos varias
'variables en la misma línea y sólo
'indicamos el tipo a la última?

Sub VariablesSinTipo()
    Dim a, b, c, d As Integer

    'Pues que a, b y c no son Integer,
    'son Variant

    a = "Pepe"
    b = 250.36
    c = Now()

    'La única Integer es d
    d = 200

    Debug.Print "El valor de a es " & a
    Debug.Print "El valor de b es " & b
    Debug.Print "El valor de c es " & c
    Debug.Print "El valor de d es " & d
End Sub

Si queremos que todas las variables de la línea sean de tipo Integer, debemos indicarlo en cada una de las variables:

Dim a As Integer, b As Integer, c As Integer, d As Integer
2008 Patxi Sanz
Libro de visitas
Hosted by www.Geocities.ws

1