Pregunta

¿Cómo puedo ejecutar automáticamente una macro de Excel cada vez que cambia un valor en una celda en particular?

En este momento, mi código de trabajo es:

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Range("H5")) Is Nothing Then Macro
End Sub

donde " H5 " es la celda en particular que se está monitoreando y Macro es el nombre de la macro.

¿Hay una mejor manera?

¿Fue útil?

Solución

Tu código se ve muy bien.

Tenga cuidado, sin embargo, su llamada a Range (" H5 ") es un comando de acceso directo a Application.Range (" H5 ") , que es equivalente a Application.ActiveSheet.Range (" H5 ") . Esto podría estar bien, si los únicos cambios son los cambios del usuario, que es el más típico, pero es posible que los valores de las celdas de la hoja de trabajo cambien cuando no sea la hoja activa a través de cambios programáticos, por ejemplo. VBA.

Teniendo esto en cuenta, utilizaría Target.Worksheet.Range (" H5 ") :

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Target.Worksheet.Range("H5")) Is Nothing Then Macro
End Sub

O puede usar Me.Range (" H5 ") , si el controlador de eventos está en la página de códigos de la hoja de trabajo en cuestión (generalmente lo está):

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Me.Range("H5")) Is Nothing Then Macro
End Sub

Espero que esto ayude ...

Otros consejos

Maneje el evento Worksheet_Change o el evento Workbook_SheetChange .

Los controladores de eventos toman un argumento " Target As Range " ;, para que puedas verificar si el rango que está cambiando incluye la celda en la que estás interesado.

Prefiero esta manera, no usando una celda sino un rango

    Dim cell_to_test As Range, cells_changed As Range

    Set cells_changed = Target(1, 1)
    Set cell_to_test = Range( RANGE_OF_CELLS_TO_DETECT )

    If Not Intersect(cells_changed, cell_to_test) Is Nothing Then 
       Macro
    End If

Pasé mucho tiempo investigando esto y aprendiendo cómo funciona todo, después de desordenar los desencadenantes del evento. Como había tanta información dispersa, decidí compartir lo que encontré para trabajar todo en un solo lugar, paso a paso, de la siguiente manera:

1) Abra el Editor de VBA, en Proyecto VBA (YourWorkBookName.xlsm) abra el Objeto de Microsoft Excel y seleccione la Hoja a la que pertenecerá el evento de cambio.

2) La vista de código predeterminada es " General. " En la lista desplegable en la parte superior central, seleccione " Hoja de trabajo. & Quot;

3) Private Sub Worksheet_SelectionChange ya está allí como debería, déjelo en paz. Copie / pegue el código de Mike Rosenblum desde arriba y cambie la referencia de rango a la celda que está buscando para un cambio (B3, en mi caso). Sin embargo, no coloque su Macro (eliminé la palabra " Macro " después de " Entonces "):

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Me.Range("H5")) Is Nothing Then
End Sub

o en la lista desplegable en la parte superior izquierda, seleccione " Cambiar " y en el espacio entre Private Sub y End Sub, pegue If Not Intersect (Target, Me.Range (" H5 ")) No es nada entonces

4) En la línea después de " Luego " desactiva los eventos para que cuando llames a tu macro, no desencadene eventos e intente ejecutar Worksheet_Change nuevamente en un ciclo que nunca termina y que bloquea Excel y / o de otra manera desordena todo:

Application.EnableEvents = False

5) Llama a tu macro

Call YourMacroName

6) Vuelva a activar los eventos para que se activen los siguientes cambios (y cualquier otro evento):

Application.EnableEvents = True

7) Finaliza el bloque If y el Sub:

    End If
End Sub

El código completo:

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Me.Range("B3")) Is Nothing Then
        Application.EnableEvents = False
        Call UpdateAndViewOnly
        Application.EnableEvents = True
    End If
End Sub

Esto activa y desactiva los eventos de los módulos, lo que crea problemas y simplemente permite que se active el cambio, desactiva los eventos, ejecuta la macro y vuelve a activar los eventos.

Tengo una celda que está vinculada a la base de datos de acciones en línea y se actualiza con frecuencia. Quiero activar una macro cada vez que se actualice el valor de la celda.

Creo que esto es similar al cambio de valor de celda por un programa o cualquier actualización de datos externos, pero los ejemplos anteriores de alguna manera no funcionan para mí. Creo que el problema se debe a que los eventos internos de Excel no se activan, pero esa es mi suposición.

Hice lo siguiente,

Private Sub Worksheet_Change(ByVal Target As Range) 
  If Not Intersect(Target, Target.Worksheets("Symbols").Range("$C$3")) Is Nothing Then
   'Run Macro
End Sub
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top