Los eventos ocurren todo el tiempo cuando un usuario abre un libro de Excel y comienza a realizar varias acciones, como ingresar datos en celdas o moverse entre hojas
Dentro del Editor de Visual Basic (ALT + F11), las subrutinas ya están configuradas y pueden activarse cuando el usuario hace algo, p. Ej. ingresar datos en una celda. La subrutina no proporciona ningún código de acción, simplemente una instrucción "Sub" y una instrucción "End Sub" sin código entre ellas. Están realmente inactivos, por lo que no sucede nada hasta que ingresa algún código.
A continuación, se muestra un ejemplo basado en el evento "Cambiar" en una hoja de trabajo:
Como programador de VBA, puede agregar código para que sucedan ciertas cosas cuando el usuario realiza una acción específica. Esto le brinda la oportunidad de controlar al usuario y evitar que realice acciones que usted no desea que haga y que podrían dañar su libro de trabajo. Por ejemplo, es posible que desee que guarden su propia copia individual del libro de trabajo con otro nombre, para que no afecten al original, que puede estar siendo utilizado por varios usuarios.
Si cierran el libro de trabajo, se les pedirá automáticamente que guarden los cambios. Sin embargo, el libro de trabajo tiene un evento "BeforeClose" y puede ingresar un código para evitar que el libro de trabajo se cierre y active un evento de "Guardar". Luego, puede agregar un botón a la hoja de trabajo y poner su propia rutina de "Guardar" en ella. También puede deshabilitar la rutina "Guardar" mediante el evento "Antes de guardar"
La comprensión de cómo funcionan los eventos es absolutamente esencial para un programador de VBA.
Tipos de eventos
Libro de trabajo Eventos - estos eventos se activan en función de lo que hace el usuario con el libro de trabajo. Incluyen acciones del usuario como abrir el libro de trabajo, cerrar el libro de trabajo, guardar el libro de trabajo, agregar o eliminar una hoja.
Eventos de la hoja de trabajo - estos eventos son activados por un usuario que realiza acciones en una hoja de trabajo específica. Cada hoja de trabajo dentro del libro de trabajo tiene un módulo de código individual, que contiene varios eventos específicamente para esa hoja de trabajo (no para todas las hojas de trabajo). Estos incluyen acciones del usuario como cambiar el contenido de una celda, hacer doble clic en una celda o hacer clic con el botón derecho en una celda.
Eventos de control Active X - Los controles Active X se pueden agregar a una hoja de trabajo usando el ícono "Insertar" en la pestaña "Desarrollador" en la cinta de Excel. Suelen ser controles de botones que permiten al usuario realizar diversas acciones bajo el control de su código, pero también pueden ser objetos como menús desplegables. El uso de controles Active X en lugar de los controles de formulario en la hoja de trabajo ofrece un amplio margen de programación. Los controles Active X le brindan mucha más flexibilidad desde el punto de vista de la programación que el uso de controles de formulario en una hoja de trabajo.
Por ejemplo, podría tener dos controles desplegables en su hoja de trabajo. Desea que la lista disponible en el segundo menú desplegable se base en lo que el usuario eligió en el primer menú desplegable. Con el evento "Cambiar" en el primer menú desplegable, puede crear código para leer lo que el usuario ha seleccionado y luego actualizar el segundo menú desplegable. También puede desactivar el segundo menú desplegable hasta que el usuario haya realizado una selección en el primer menú desplegable.
Eventos de UserForm - Puede insertar y diseñar un formulario de aspecto profesional para usarlo como ventana emergente. Todos los controles que coloca en su formulario son controles Active X y tienen los mismos eventos que los controles Active X que puede colocar en una hoja de trabajo
Eventos de gráficos - Estos eventos solo están relacionados con una hoja de gráfico y no con un gráfico que aparece como parte de una hoja de trabajo. Estos eventos incluyen cambiar el tamaño del gráfico o seleccionarlo.
Eventos de aplicación - Estos usan el objeto Aplicación en VBA. Los ejemplos permitirían que se dispare el código cuando se presiona una determinada tecla o cuando se alcanza un cierto tiempo. Puede programar una situación en la que el libro de trabajo se deja abierto las 24 horas del día, los 7 días de la semana e importa datos de una fuente externa durante la noche a una hora predeterminada.
Peligros de usar código en eventos
Cuando escribe código para hacer algo cuando el usuario realiza una determinada acción, debe tener en cuenta que su código podría desencadenar otros eventos, lo que podría poner su código en un bucle continuo.
Por ejemplo, suponga que usa el evento "Cambiar" en una hoja de trabajo para que cuando el usuario ingrese un valor en una celda, un cálculo basado en esa celda se coloque en la celda inmediatamente a la derecha.
El problema aquí es que la colocación del valor calculado en la celda desencadena otro evento de 'Cambio', que a su vez desencadena otro evento de 'Cambio', y así sucesivamente hasta que su código se haya quedado sin columnas para usar y arroje un mensaje de error.
Debe pensar detenidamente al escribir el código del evento para asegurarse de que otros eventos no se activen inadvertidamente.
Desactivar eventos
Puede usar código para deshabilitar eventos para solucionar este problema. Lo que deberá hacer es incorporar código para deshabilitar eventos mientras su código de evento se está ejecutando y luego volver a habilitar los eventos al final del código. A continuación, se muestra un ejemplo de cómo hacerlo:
1234 | Sub DisableEvents ()Application.EnableEvents = FalseApplication.EnableEvents = TrueEnd Sub |
Tenga en cuenta que esto deshabilita todos los eventos directamente en la aplicación de Excel, por lo que esto también afectaría otras funciones dentro de Excel. Si usa esto por cualquier motivo, asegúrese de que los eventos se vuelvan a activar después.
Importancia de los parámetros en los eventos
Los eventos generalmente tienen parámetros que puede usar para obtener más información sobre lo que está haciendo el usuario y la ubicación de la celda en la que se encuentra.
Por ejemplo, el evento Cambio de hoja de trabajo se ve así:
1 | Private Sub Worksheet_Change (ByVal Target As Range) |
Al usar el objeto de rango, puede averiguar las coordenadas de fila / columna de celda en las que el usuario se encuentra realmente.
1234 | Private Sub Worksheet_Change (ByVal Target As Range)MsgBox Target.ColumnMsgBox Target.RowEnd Sub |
Si solo desea que su código funcione en una determinada columna o número de fila, agregue una condición que salga de la subrutina si la columna no es la requerida.
123 | Private Sub Worksheet_Change (ByVal Target As Range)Si Target.Column 2, salga de SubEnd Sub |
Esto soluciona el problema de que su código desencadena múltiples eventos, ya que solo funcionará si el usuario ha cambiado una celda en la columna 2 (columna B)
Ejemplos de eventos de libros de trabajo (no exhaustivos)
Los eventos del libro de trabajo se encuentran en el objeto "ThisWorkbook" en el Explorador de proyectos de VBE. Deberá seleccionar "Libro de trabajo" en el primer menú desplegable de la ventana de código y luego el segundo menú desplegable le mostrará todos los eventos disponibles.
Evento abierto del libro de trabajo
Este evento se activa cada vez que un usuario abre el libro de trabajo. Puede usarlo para enviar un mensaje de bienvenida a un usuario capturando su nombre de usuario
123 | Private Sub Workbook_Open ()MsgBox "Bienvenida" y Application.UserNameEnd Sub |
También puede comparar su nombre de usuario con una lista que se encuentra en una hoja oculta para ver si están autorizados a acceder al libro de trabajo. Si no es un usuario autorizado, puede mostrar un mensaje y cerrar el libro de trabajo para que no puedan usarlo.
Evento de hoja nueva del libro de trabajo
Este evento se activa cuando un usuario agrega una nueva hoja al libro de trabajo
Puede usar este código solo para permitirse agregar una nueva hoja, en lugar de que diferentes usuarios agreguen hojas y ensucie el libro de trabajo
1234567 | Private Sub Workbook_NewSheet (ByVal Sh As Object)Application.DisplayAlerts = FalsoSi Application.UserName "Richard", entoncesSh.DeleteTerminara siApplication.DisplayAlerts = TrueEnd Sub |
Tenga en cuenta que debe desactivar las alertas, ya que aparecerá una advertencia para el usuario cuando se elimine la hoja, lo que permite al usuario eludir su código. ¡Asegúrate de volver a activar las alertas después!
¿Cansado de buscar ejemplos de código VBA? ¡Prueba AutoMacro!
Libro de trabajo antes de guardar evento
Este evento se activa cuando el usuario hace clic en el icono "Guardar", pero antes de que el "Guardar" realmente se lleve a cabo.
Como se describió anteriormente, es posible que desee evitar que los usuarios guarden sus cambios en el libro de trabajo original y obligarlos a crear una nueva versión usando un botón en la hoja de trabajo. Todo lo que necesita hacer es cambiar el parámetro "Cancelar" a Verdadero, y el libro de trabajo nunca se podrá guardar con el método convencional.
123 | Private Sub Workbook_BeforeSave (ByVal SaveAsUI como booleano, cancelar como booleano)Cancelar = VerdaderoEnd Sub |
Libro de trabajo antes del evento de cierre
Puede usar este evento para evitar que los usuarios cierren el libro de trabajo y, nuevamente, obligarlos a salir a través de un botón de la hoja de trabajo. Nuevamente, establezca el parámetro "Cancelar" en "Verdadero". La X roja en la esquina superior derecha de la ventana de Excel ya no funciona.
123 | Private Sub Workbook_BeforeClose (Cancelar como booleano)Cancelar = VerdaderoEnd Sub |
Ejemplos de eventos de hojas de trabajo (no exhaustivo)
Los eventos de la hoja de trabajo se encuentran bajo el objeto de nombre de hoja específico en el Explorador de proyectos de VBE. Deberá seleccionar "Hoja de trabajo" en el primer menú desplegable de la ventana de código y luego el segundo menú desplegable le mostrará todos los eventos disponibles.
Evento de cambio de hoja de trabajo
Este evento se activa cuando un usuario realiza un cambio en una hoja de trabajo, como ingresar un nuevo valor en una celda.
Puede usar este evento para poner un valor o comentario adicional al lado de la celda modificada, pero como se discutió anteriormente, no desea comenzar a desencadenar un ciclo de eventos.
12345 | Private Sub Worksheet_Change (ByVal Target As Range)Si Target.Column 2, salga de SubActiveSheet.Cells (Target.Row, Target.Column + 1). Valor = _ActiveSheet.Cells (Target.Row, Target.Column). Valor * 1,1End Sub |
En este ejemplo, el código solo funcionará si el valor se ingresa en la Columna B (columna 2). Si esto es cierto, agregará un 10% al número y lo colocará en la siguiente celda disponible
Hoja de trabajo antes del evento de doble clic
Este evento activará el código si un usuario hace doble clic en una celda. Esto puede ser extremadamente útil para informes financieros, como un balance general o una cuenta de pérdidas y ganancias, donde es probable que los gerentes cuestionen las cifras, ¡especialmente si el resultado final es negativo!
Puede usar esto para proporcionar una función de desglose, de modo que cuando el gerente desafíe un número en particular, todo lo que tenga que hacer sea hacer doble clic en el número y el desglose aparezca como parte del informe.
Esto es muy impresionante desde el punto de vista de un usuario y les ahorra preguntarse constantemente "¿por qué este número es tan alto?"
Debería escribir código para averiguar el encabezado / criterio para el número (usando las propiedades del objeto de destino) y luego filtrar los datos tabulares y luego copiarlos en el informe.
Programación VBA | ¡Code Generator funciona para usted!
Evento de activación de hoja de trabajo
Este evento ocurre cuando el usuario pasa de una hoja a otra. Se aplica a la nueva hoja a la que se está moviendo el usuario.
Podría usarse para garantizar que la nueva hoja esté completamente calculada antes de que el usuario comience a hacer algo en ella. También se puede usar para volver a calcular solo esa hoja en particular sin volver a calcular todo el libro de trabajo. Si el libro de trabajo es grande y tiene una fórmula complicada, volver a calcular una hoja ahorra mucho tiempo
123 | Private Sub Worksheet_Activate ()ActiveSheet.CalculateEnd Sub |
Eventos de control Active X (no exhaustivo)
Como se mencionó anteriormente, puede agregar controles Active X directamente en una hoja de trabajo. Pueden ser botones de comando, menús desplegables y cuadros de lista.
Los eventos de Active X se encuentran bajo el objeto de nombre de hoja específico (donde agregó el control) en el Explorador de proyectos de VBE. Deberá seleccionar el nombre del control Active X en el primer menú desplegable de la ventana de código y luego el segundo menú desplegable le mostrará todos los eventos disponibles.
Evento de clic de botón de comando
Cuando haya puesto un botón de comando en una hoja de cálculo, querrá que realice alguna acción. Para ello, coloque código en el evento Click.
Puede poner fácilmente un mensaje "¿Está seguro?" En esto para que se realice una verificación antes de que se ejecute su código.
12345 | Privado Sub CommandButton1_Click ()Botón de atenuación Retirar como varianteButtonRet = MsgBox ("¿Está seguro de que desea hacer esto?", VbQuestion o vbYesNo)Si ButtonRet = vbNo, salga de SubEnd Sub |
Evento de cambio desplegable (cuadro combinado)
Un menú desplegable de Active X tiene un evento de cambio, de modo que si un usuario selecciona un elemento en particular de la lista desplegable, puede capturar su elección usando este evento y luego escribir código para adaptar otras partes de la hoja o libro de trabajo en consecuencia.
123 | Private Sub ComboBox1_Change ()MsgBox "Seleccionaste" & ComboBox1.TextEnd Sub |
Programación VBA | ¡Code Generator funciona para usted!
Marque la casilla (casilla de verificación) Haga clic en Evento
Puede agregar una marca o casilla de verificación a una hoja de trabajo para proporcionar opciones de opciones para el usuario. Puede usar el evento de clic en él para ver si el usuario ha cambiado algo en esto. Los valores devueltos son Verdadero o Falso según se haya marcado o no.
123 | Private Sub CheckBox1_Click ()MsgBox CheckBox1.ValueEnd Sub |
Eventos de UserForm (no exhaustivo)
Excel le brinda la posibilidad de diseñar sus propios formularios. Estos pueden ser muy útiles para usar como ventanas emergentes para recopilar información o para proporcionar múltiples opciones al usuario. Usan controles Active X como se describió anteriormente y tienen exactamente los mismos eventos, aunque los eventos dependen mucho del tipo de control.
A continuación, se muestra un ejemplo de un formulario simple:
Cuando se muestra, así es como se ve en la pantalla.
Usaría eventos en el formulario para hacer cosas como ingresar un nombre de empresa predeterminado cuando se abre el formulario, para verificar que la entrada del nombre de la empresa esté de acuerdo con uno que ya está en la hoja de cálculo y no se haya escrito mal, y para agregar código al clic eventos en los botones 'Aceptar' y 'Cancelar'
El código y los eventos detrás del formulario se pueden ver haciendo doble clic en cualquier parte del formulario.
El primer menú desplegable da acceso a todos los controles del formulario. El segundo menú desplegable dará acceso a los eventos.
Evento de activación de UserForm
Este evento se desencadena cuando se activa el formulario, normalmente cuando se muestra. Este evento se puede utilizar para configurar valores predeterminados, p. Ej. un nombre de empresa predeterminado en el cuadro de texto del nombre de la empresa
123 | Sub UserForm_Activate privado ()TextBox1.Text = "Nombre de mi empresa"End Sub |
Programación VBA | ¡Code Generator funciona para usted!
Cambio de evento
La mayoría de los controles del formulario tienen un evento de cambio, pero en este ejemplo, el cuadro de texto del nombre de la empresa puede usar el evento para restringir la longitud del nombre de la empresa que se ingresa.
123456 | Sub TextBox1_Change privado ()Si Len (TextBox1.Text)> 20 EntoncesMsgBox "El nombre está restringido a 20 caracteres", vbCriticalTextBox1.Text = ""Terminara siEnd Sub |
Haga clic en Evento
Puede utilizar este evento para realizar una acción desde que el usuario haga clic en los controles del formulario, o incluso en el formulario en sí.
En este formulario hay un botón "Aceptar" y, habiendo recopilado el nombre de una empresa, queremos colocarlo en una celda de la hoja de cálculo para referencia futura.
1234 | Privado Sub CommandButton1_Click ()ActiveSheet.Range ("A1"). Valor = TextBox1.TextMe.HideEnd Sub |
Este código actúa cuando el usuario hace clic en el botón "Aceptar". Coloca el valor en el cuadro de entrada del nombre de la empresa en la celda A1 de la hoja activa y luego oculta el formulario para que el control del usuario se devuelva a la hoja de trabajo.
Eventos de gráficos
Los eventos de gráficos solo funcionan en gráficos que están en una hoja de gráfico separada y no en un gráfico que se incorpora a una hoja de trabajo estándar
Los eventos de gráficos son algo limitados y no se pueden usar en una hoja de trabajo donde es posible que tenga varios gráficos. Además, los usuarios no necesariamente quieren cambiar de una hoja de trabajo que contiene números a una hoja de gráfico; aquí no hay un impacto visual inmediato.
El evento más útil sería averiguar el componente de un gráfico en el que un usuario ha hecho clic, p. un segmento en un gráfico circular o una barra en un gráfico de barras, pero este no es un evento disponible en el rango estándar de eventos.
Este problema se puede resolver utilizando un módulo de clase para agregar un evento "Mouse Down" que devolverá detalles del componente del gráfico en el que el usuario ha hecho clic. Esto se usa en un gráfico dentro de una hoja de trabajo.
Esto implica una codificación muy complicada, pero los resultados son espectaculares. Puede crear desgloses, p. Ej. el usuario hace clic en un segmento de gráfico circular e instantáneamente ese gráfico se oculta y aparece un segundo gráfico en su lugar que muestra un gráfico circular de detalle para el segmento original, o puede producir los datos tabulares que respaldan ese segmento del gráfico circular.
Eventos de aplicación
Puede usar el objeto Aplicación en VBA para disparar el código de acuerdo con un evento en particular
Programación VBA | ¡Code Generator funciona para usted!
Application.OnTime
Esto puede permitirle disparar un fragmento de código a intervalos regulares mientras el libro de trabajo esté cargado en Excel. Es posible que desee guardar automáticamente su libro de trabajo en una carpeta diferente cada 10 minutos, o dejar la hoja de trabajo ejecutándose durante la noche para traer los datos más recientes de una fuente externa.
En este ejemplo, se ingresa una subrutina en un módulo. Muestra un cuadro de mensaje cada 5 minutos, aunque esto podría ser fácilmente otro procedimiento codificado. Al mismo tiempo, restablece el temporizador a la hora actual más 5 minutos más.
Cada vez que se ejecuta, el temporizador se reinicia para ejecutar la misma subrutina en otros 5 minutos.
1234 | Sub TestOnTime ()MsgBox "Prueba a tiempo"Application.OnTime (Now () + TimeValue ("00:05:00")), "TestOnTime"End Sub |
Application.OnKey
Esta función le permite diseñar sus propias teclas de acceso rápido. Puede hacer que cualquier combinación de teclas sea una subrutina de su creación.
En este ejemplo, la letra "a" se redirige para que, en lugar de colocar una "a" en una celda, muestre un cuadro de mensaje. Este código debe colocarse en un módulo insertado.
123456 | Sub TestKeyPress ()Application.OnKey "a", "TestKeyPress"End SubSub TestKeyPress ()MsgBox "Pulsaste 'a'"End Sub |
En primer lugar, ejecuta la subrutina "TestKeyPress". Solo necesita ejecutar esto una vez. Le dice a Excel que cada vez que se presiona la letra "a" llamará a la subrutina "TestKeyPress". La subrutina "TestKeyPress" solo muestra un cuadro de mensaje para indicarle que presionó la tecla "a". Por supuesto, podría cargar un formulario o hacer todo tipo de cosas.
Puede utilizar cualquier combinación de teclas que pueda utilizar con la función "Enviar teclas"
Para cancelar esta funcionalidad, ejecute la instrucción "OnKey" sin el parámetro "Procedimiento".
123 | Sub CancelOnKey ()Application.OnKey "a"End Sub |
Ahora todo ha vuelto a la normalidad.