Eventos de Excel VBA

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.

wave wave wave wave wave