Logo_Access_global_380x114Favicon_Access_global_180x180Logo_Access_global_380x114Logo_Access_global_380x114
  • Home
  • University
    • Destellos formativos
  • Labs
  • TV
  • Secciones
    • El mundo de Access
    • Explorando VBA
      • Artículos sobre VBA
      • Un trocito de código
    • Entrevistas
      • Profesionales de Access
    • El rincón de Excel
    • Bases de datos
      • MS SQL
      • MySQL
      • postgreSQL
      • SQLite
    • Clases magistrales
    • Utilidades hechas con Access
  • Access en el mundo
  • ¿Quiénes somos?
  • Cómo colaborar
  • Eventos
✕
            No hay resultados Mostrar todos los resultados
            Tipo de variable Decimal
            13/12/2021
            Encriptar una cadena de texto
            13/12/2021
            Mostrar todos

            Dim WithEvents

            Publicado por José Bengoechea
            Categorías
            • Artículos sobre VBA
            Etiquetas
            • Access
            • Jose Bengoechea
            • WithEvents
            Evento

            Pero… ¿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
            
            Compartir
            1
            José Bengoechea
            José Bengoechea

            Entradas relacionadas

            15/01/2022

            El evento NotInList


            Leer más
            13/12/2021

            Tipo de variable Decimal


            Leer más

            Deja una respuesta Cancelar la respuesta

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

            ETIQUETAS

            Access API ComboBox Consultas CountOfDeclarationLines CountOfLines CStr DCount Diseño DoCmd Excel Fecha FileExists FileSystemObject Filtros For Each...Next Formulario Formularios Funciones Funciones de dominio GetFolder Google maps Informes InStr Kill Listbox Mid Mod Módulos Node ProcCountLines Procedimientos ProcOfLine References Replace Ribbon RunCommand Split Tablas TreeView VBA VBE VBIDE With...End With WizHook

            ÚLTIMAS ENTRADAS

            • 0
              VBA: crea códigos QR sin conexión a Internet
              31/05/2023
            • 0
              VBA: imprimir sin informes
              30/05/2023

            ¿QUIERES PUBLICITAR TU EMPRESA AQUÍ?

            SUSCRÍBETE A NUESTRO
            NEWSLETTER

            Recibirás información puntual sobre el mundo de Access y VBA

            ¡Próximamente!

            Promovemos el uso de Access y de la programación en VBA en todo el mundo

            Centro de conocimiento


            Toda la sabiduría de los mejores programadores de Access y VBA a tu alcance.

            Legal

            Política de privacidad

            Condiciones de uso

            Condiciones del redactor

            ®Access Global 2021 | All right reserved
                      No hay resultados Mostrar todos los resultados