La programación de eventos fue introducida en Excel 97 y ha sido de gran utilidad desde entonces ya que nos permite ejecutar código VBA en el momento exacto en que el usuario realiza alguna acción determinada o cuando hay un cambio de estado en la aplicación.
Eventos en Excel
Los eventos en Excel son acciones iniciadas por el usuario, como el seleccionar una hoja diferente dentro del libro o modificar el valor de una celda. Al suceder dicho evento se ejecutará un procedimiento asociado el cual contendrá nuestro código VBA.
Es importante mencionar que el catálogo de eventos en Excel ya está definido y no podemos definir nuevos eventos. Además, cada evento tiene asociado un procedimiento con un nombre y argumentos específicos que debemos respetar para poder utilizarlos. Por ejemplo, si queremos mostrar un mensaje al momento de seleccionar una hoja diferente debemos utilizar el evento Workbook_SheetActivate de la siguiente manera:
Private Sub Workbook_SheetActivate(ByVal Sh As Object) MsgBox "Evento Workbook_SheetActivate" End Sub
Si cambiamos el nombre del procedimiento por Workbook_SheetActivate2, el código jamás se ejecutará porque Excel buscará el procedimiento con el nombre correcto pero no lo encontrará. Por el contrario, si escribimos correctamente el nombre del procedimiento pero modificamos los argumentos, entonces Excel se dará cuenta de la diferencia y mostrará el siguiente mensaje de error:
Es así como podemos hacer nuestra primera conclusión: Los eventos en Excel ya están definidos en la herramienta y debemos utilizar el nombre del procedimiento asociado a cada uno de ellos respetando también sus argumentos.
Jerarquía de eventos en Excel
Existen tres objetos en Excel que contienen la mayoría de los eventos generalmente utilizados: Application, Workbook y Worksheet. El objeto de mayor jerarquía es Application y se refiere a Excel mismo. El siguiente objeto en la jerarquía es el objeto Workbook que hace referencia a un libro de Excel y el último objeto de la jerarquía es Worksheet y que hace referencia a una hoja de Excel.
Cada uno de estos objetos contiene eventos por sí mismo pero también contiene eventos que hacen referencia a los eventos de los objetos por debajo de la jerarquía. Por ejemplo, el objeto Workbook tiene el evento SheetActivate que se activará cada vez que seleccionamos una hoja diferente de nuestro libro. El objeto Worksheet tiene el evento Activate que se ejecuta también al seleccionar una hoja específica del libro.
La diferencia entre ambos eventos es la siguiente. Si queremos ejecutar un código solamente para la Hoja1, debemos utilizar el evento Activate del objeto Worksheet, pero si queremos que nuestro código se ejecute al activar cualquier hoja del libro, entonces debemos utilizar el evento SheetActivate del objeto Workbook que al estar un nivel superior en la jerarquía tendrá la capacidad de activar dicho evento sobre todas las hojas del libro.
Para dejar claro el funcionamiento de ambos eventos he creado un libro de Excel que puedes descargar el cual muestra un mensaje al momento de seleccionar una hoja diferente dentro del libro. Se mostrará un cuadro de diálogo con el mensaje “Evento Workbook_SheetActivate” que corresponde al objeto Workbook y al seleccionar la Hoja1 se mostrará el mensaje “Evento Worksheet_Activate”.
Este ejemplo también será útil para dejar en claro el orden de ejecución de los eventos. La ejecución comienza siempre con los eventos del objeto de menor jerarquía y continúa con los objetos de mayor jerarquía. En nuestro ejemplo, al seleccionar la Hoja1 se mostrará primero el mensaje del procedimiento Worksheet_Activate y posteriormente el mensaje del procedimiento Workbook_SheetActivate.
Eventos disponibles para un objeto
Hasta ahora hemos hablado sobre los eventos de Excel y los procedimientos vinculados a cada uno de ellos. También conocemos los objetos que contienen los eventos, su jerarquía y el orden de ejecución, así que solo nos resta saber cuáles son todos los eventos disponibles para cada objeto.
Una manera de conocer los eventos de un objeto es utilizar el Examinador de objetos que podemos acceder desde el Editor de Visual Basic dentro del menú Ver. Al mostrarse el Examinador de objetos tendremos dos paneles, en la izquierda estarán las clases (objetos) y al seleccionar alguno de ellos el panel derecho mostrará sus eventos, sus métodos y propiedades. En la siguiente imagen podemos ver algunos de los eventos del objeto Worksheet que son fácilmente identificados por un pequeño icono color amarillo en forma de rayo:
En la imagen superior se muestran los eventos Activate, BeforeDoibleClick, BeforeRightClick, Calculate, Change, pero no son todos los objetos del objeto Worksheet, así que deberás utilizar la barra de desplazamiento vertical para ver el resto de los eventos del objeto. Al seleccionar alguno de los eventos se mostrará mayor detalle en el panel inferior.
Ubicación del código para un evento
Ahora que ya sabemos cómo identificar todos los eventos de un objeto es necesario conocer la ubicación donde debemos colocar el procedimiento asociado a cada uno de ellos. Para los eventos del objeto Worksheet es necesario colocar el código dentro del módulo asociado a cada hoja. Para el ejemplo mencionado anteriormente, coloqué el código del evento Activate dentro del módulo de la Hoja1 de la siguiente manera:
Los eventos del objeto Workbook deben colocarse dentro del módulo ThisWorkbook que se encuentra por debajo de los módulos de código de las hojas:
Un beneficio que nos ofrece el Editor de Visual Basic es que provee dos listas desplegables en la parte superior del panel derecho donde podremos elegir el objeto y de inmediato sus procedimientos serán desplegados en la segunda lista.
Al seleccionar alguno de los eventos de la segunda lista se insertará el código del procedimiento utilizando el nombre y argumentos adecuados en espera de que introduzcamos el código VBA que será ejecutado al suceder el evento.
Es importante respetar la ubicación adecuada para cada uno de los procedimientos de los eventos o de lo contrario Excel no los encontrará y por lo tanto no serán ejecutados. A diferencia de los eventos para los objetos Worksheet y Workbook, no existe un repositorio específico para los eventos del objeto Application sino que deben ser incluidos ya sea dentro del módulo ThisWorkbook o dentro de un módulo de clase independiente.
Eventos del objeto Application
Para utilizar un evento del objeto Application dentro del módulo ThisWorkbook comenzamos por declarar el objeto y posteriormente inicializarlo dentro del evento Workbook_Open de la siguiente manera:
Public WithEvents App As Application Private Sub Workbook_Open() Set App = Application End Sub
La palabra clave WithEvents nos ayuda a indicar que la variable App del tipo Application puede provocar eventos. Posteriormente dentro del procedimiento Workbook_Open inicializamos dicha variable. Una vez hecho esto podemos elegir la opción App dentro de la primera lista desplegable del panel y posteriormente elegir cualquiera de los eventos disponibles para el objeto Application dentro de la segunda lista.
De esta manera podemos utilizar los eventos del objeto Application dentro del módulo de código ThisWorkbook y al igual que con los ejemplos anteriores, al seleccionar el evento de la segunda lista, Excel colocará el código base para el procedimiento del evento.
La programación de eventos en Excel es de suma importancia cuando necesitamos controlar el comportamiento de Excel en base a las acciones tomadas por el usuario. Si quieres saber más sobre programación en Excel te recomiendo consultar el artículo Introducción a las macros.