Evento cuando una Celda o un Rango en Particular cambia su contenido.
Aveces queremos ejecutar un conjunto de líneas de código cuando se cambia el contenido en una celda o Rango de celdas en específico, algo asi como escribir nuestro código en un Evento hipotético asociado al cambio de la celda o Rango - Cells_Change(Target As Range) - . No existe tal cosa!, empezando porque lo eventos en VBA de Excel estan en algunas de las siguientes categorías: |
Como se puede ver no existe eventos asociados al Objeto Range (Por lo menos directamente), no obstante, podemos hacer esta tarea utilizando el Evento Change de Worksheet y el Método Intersect del objeto Applications. (Curso de Macros) Ejemplo Entendamos lo anterior con un Ejemplo: Supongamos que tenemos una lista desplegable de validación de datos en la celda E4 donde aparecen unos tipos de chile, como se muestra en la Imagen 1. |
Cada vez que se seleccione el ítem Carolina Reaper queremos aparezca un cuadro de diálogo que indique que es un tipo de Chile con altos niveles de pungenación (muy picantes). Como mencionamos no tenemos un evento que detecte el cambio de contenido en una celda, no obstante nos podemos lograr algo similar con el Evento Worksheet_Change y el Método Intersect de objeto Application. Veamos este evento y método... Evento Worksheet_Change El Evento Change ocurre cuando cualquier celda en una hoja es cambiado por el usario o por código VBA. El Evento Change NO se activa cuando un cálculo generá un valor diferente en las celdas o cuando un objeto es añadido a la hoja. Dicho de otro modo cuando cambiamos el contenido de cualquier celda en la hoja este Evento se dispará ejecuatando el código contenido dentro de el. Si el valor de uan celda cambia por actualización de fórmulas este no se ejecuta. El Evento Worksheet_Change recibe un argumento llamado Target y que corresponde a un objeto Range el cual es la celda que cambio o las celdas que cambiaron de contenido. Para nuestro problema solo queremos que se ejecute cuando una celda en especifico cambie, para nuestro caso la celda E4. Para poder hacer esto utilizamos el método intersect. Método Intersect El Método intersect retorna las celdas en común entre dos o más rangos especificados en sus parámetros rangos, por ejemplo:
Devuelve Range("A1:B1") que son las celdas en común de estos dos rangos, si no tiene celdas en común entonces no devuelve nada (Nothing). Con lo anterior podemos indicar el código que se ejecuta solo cuando cambie el contenido de la celda E4, ya que utilizamos el método Intersect, si la celda Target (Celda que se cambia el contenido y proporcionado por el Evento Worksheet) se intersecta con un rango proporcionado por nosotros, en este ejemplo Range("E4"), así:
Como el método es miembro del <Global Object> podemos omitir la jerarquía del objeto Applications, por lo que lo podemos escribir de formas más compacta, así:
|
Evento Worksheet_Change + Método Intersect Con la combinación del evento Change y el método intersect ya podemos ejecutar ciertas líneas de código cuando una celda en particular cambie su contenido o si lo queremos un cojunto de celdas, el código es: Private Sub Worksheet_Change(ByVal Target As Range) 'Target: Contiene la celda a la cual se cambia If Application.Intersect(Target, Range("E4")) Is Nothing Then Exit Sub Else 'Líneas de código a ejecutar End If End Sub Para nuestro ejemplo queremos que muestre un cuadro de diálogo con un texto de advertencia, si cuando el valor que cambia en la celda E4 corresponde a Carolian Reaper Código: |
Private Sub Worksheet_Change(ByVal Target As Range) 'Target: Contiene la celda a la cual se cambia If Application.Intersect(Target, Range("E4")) Is Nothing Then Exit Sub Else If Target.Value = "Carolina Reaper" Then MsgBox prompt:="Altos nivels de pungenación", _ Title:="Advertencia", _ Buttons:=vbCritical End If End If End Sub |
|