Cuando empezamos a ver código VBA detectamos que los procedimientos pueden ser de tipo Function o de tipo Sub. Y nuestra primera pregunta es: ¿qué diferencia hay?

Pues podríamos diferenciar los tipos de procedimiento entre los que pueden devolver un valor (Function) y los que no pueden (Sub).

Los procedimientos Sub acostumbran a ir asociados a eventos de los objetos o controles. Así, al abrir un formulario de Access, se producen varios eventos seguidos (Open, Load, Activate, Resize, Current) y todos ellos son procedimientos de tipo Sub que, si bien pueden asignar valores a variables y objetos, no devuelven ningun valor por sí mismos. También los eventos de los controles generan procedimientos Sub (AfterUpdate, Click, DblClick). Cuando desde la hoja de propiedades de Access accedemos al generador de código para un procedimiento de evento, el sistema creará el procedimiento Sub.

Los procedimientos Function son independientes de los objetos y controles y nos permiten un mayor control sobre los argumentos que reciben y la respuesta que ofrecen.

Imaginemos un procedimiento muy simple que vamos a utilizar muchas veces en nuestra aplicación y que impide el acceso a ese control (esto es de Access).

Nuestro procedimiento va a realizar 2 acciones:

  • Mandar el foco al control anterior
  • Lanzar un Beep

Crearemos una Function en un módulo independiente (de esa forma su alcance es global) tal como esta:

Function NoEntrar()
  Screen.PreviousControl.SetFocus
  Beep
End function

Esa función no recibe ningun argumento ni realiza ninguna acción, pero puede ser asignada a un control (evento Al entrar) directamente en la hoja de propiedades:

=NoEntrar()

Otro tipo de función son las que reciben argumentos y devuelven valores. Por ejemplo, una función que devuelva el valor de un impuesto. Deberá recibir 2 argumentos: la base y el tipo impositivo. Y devolverá un valor. Para los 2 argumentos y la devolución será necesario definir el tipo de dato.

Empecemos por la definición de la función:

Function DameImpuesto(dblBase As Double, dblImpuesto As Double) As Double

Vemos que recibe 2 argumentos cuyo tipo de dato será Double (es decir, un número que puede contener decimales). y que devolverá también un número que puede contener decimales.

Dentro del cuerpo de la función definiremos el cálculo que deberá realizarse:

DameImpuesto = dblBase * dblImpuesto /100

Ese código hará el cálculo de tomar el valor de la variable dblBase, multiplicarla por el valor de la variable dblImpuesto y dividirá por 100. El valor obtenido se asigna al nombre de la función.

Cuando necesitamos hacer ese cálculo en cualquier parte de nuestro código sólo debemos invocar la función pasando los argumentos:

Me!txtValorImpuesto = DameImpuesto(Me!txtBase, Me!txtTipoImpositivo)

En resumen:

  • Cualquier procedimiento Sub definido por nosotros y que no deba devolver resultado puede ser sustituido por un procedimiento Function
  • Los [Procedimientos de Evento] asociados a un evento estándar son siempre Sub
  • Se puede asociar, en la ventana de propiedades, un procedimiento Function a un evento anteponiendo el signo =.
  • Se puede asociar, por código VBA, una Function a un evento de un control.
   
Me!txt.OnClick = "=MiFuncion()"

En Excel, para poder asociar una macro a un botón, este procedimiento deberá ser de tipo Sub (los procedimientos de tipo Function no aparecen en la ventana de posibles macros a asignar).

Concepto de alcance

El alcance de un procedimiento nos indica desde dónde puede ser llamado/invocado. El alcance dependerá tanto del módulo dónde se aloje el procedimiento cómo de las palabras clave que pueden preceder su declaración.

Dentro de un módulo dependiente (asociado a un objeto formulario o reporte), los procedimientos sólo pueden ser llamados desde dentro del propio módulo. Por ese motivo cualquier procedimiento Sub se crea anteponiendo la palabra clave Private. Para poder acceder desde otro módulo a ese código, primero deberá anteponerse la palabra Public y, además, el objeto deberá estar abierto para que se pueda ejecutar. Las Function de un módulo dependiente tienen como alcance el propio módulo.

Si deseamos tener una biblioteca de funciones reutilizables, estas deberán situarse en un módulo independiente. Cualquier Function situada en un módulo independiente será pública (podrá ser llamada en cualquier momento y desde cualquier sitio) excepto si va precedida de la palabra Private.

Categorías: AccessVBA

0 comentarios

Deja una respuesta

Marcador de posición del avatar

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *