Tipo de variable Decimal
13/12/2021Encriptar una cadena de texto
13/12/2021Pero… ¿Eso qué es?
El desconocimiento de los módulos de clase y la pereza por abordarlos hace que buenos programadores de VBA desaprovechen métodos de programación que, o están relacionados con los módulos de clase pero no son exclusivos de ellos, o son realmente fáciles de usar sin necesidad de conocer nada de OOP.
Creo que es el caso de Dim Withevents. Estoy seguro de que más de uno se ha sentido intrigado y, decidido a investigar, ha creado un nuevo módulo, se ha puesto a escribir… y se ha encontrado con esto:
Y aquí se acabó el interés. “Eso es algo de los módulos de clase y ahora no tengo tiempo de meterme en esas profundidades”. Olvida que trabaja con módulos de clase a diario; son los módulos de los formularios.
Eso quiere decir que podemos usar Dim WithEvents en el módulo de un formulario y aprovechar sus ventajas.
Pero ¿Qué significa Dim WithEvents? Sencillamente, que dimensionamos un objeto con sus eventos, de manera que éstos son accesibles y podemos controlarlos desde nuestro módulo. Por ejemplo, desde un formulario podemos controlar cuándo se cierra, o cuándo se abre, otro. Su uso es muy sencillo y las posibilidades enormes.
Cuando dimensionamos WithEvents un objeto, inmediatamente se producen cambios en el editor de VBA: El objeto se ha convertido en un objeto más de nuestra aplicación, se muestra en el cuadro combinado de objetos y, si lo seleccionamos, en el cuadro combinado de procedimientos, se muestras todos los eventos de ese objeto.
Veamos, por ejemplo, cómo hacer si queremos controlar qué ocurre cuando se cierra ese formulario:
Private Sub Form_Load()
DoCmd.OpenForm "Miformulario"
Set frmMiformulario = Forms!MiFormulario
End Sub
Pero todavía nos falta un poquito más. Los eventos no se dispararán si en la propiedad correspondiente a ese evento del objeto no hemos indicado que se trata de un procedimiento de evento. Normalmente, cuando creamos el evento desde el objeto, empezamos por ahí, asignando la propiedad, pero, al declararlo desde un módulo distinto, no está garantizado que exista la propiedad, de manera que nos tenemos que asegurar de que exista. Añadimos una línea a nuestro código:
Private Sub Form_Load()
DoCmd.OpenForm "Miformulario"
Set frmMiformulario = Forms!MiFormulario
frmMiformulario.OnClose = "[Event Procedure]"
End Sub
Y ya está 😊 Al abrir el formulario principal, se abre también Miformulario y al cerrar Miformulario sale un Msgbox diciendo “Se ha cerrado el formulario MiFormulario”
¡Ah, que no! 😳 No ha ocurrido nada al cerrarse Miformulario 😳 (Es la primera vez que me pasa…) Tranquilos, lo que ocurre es que he empezado con una base de datos en blanco, con formularios en blanco y Miformulario está completamente vacío, no tiene nada de código y, por tanto su propiedad HasModule = false. Escribimos algo intrascendente en Miformulario para que cambie esto:
Option Compare Database
Option Explicit
Private Sub Form_Load()
' "Vaya, vaya"
End Sub
Y ahora sí que está. Al cerrarse Miformulario, se ha mostrado el mensaje “Se ha cerrado el formulario MiFormulario
Todo el código que hemos necesitado en el formulario principal es éste:
Option Compare Database
Option Explicit
Dim WithEvents frmMiformulario As Form
Private Sub Form_Load()
DoCmd.OpenForm "Miformulario"
Set frmMiformulario = Forms!MiFormulario
frmMiformulario.OnClose = "[Event procedure]"
End Sub
Private Sub frmMiformulario_Close()
MsgBox "Se ha cerrado el formulario " & frmMiformulario.Name
End Sub