valor - ejecutar macro sin abrir excel
ejecutar automáticamente una macro de Excel en un cambio de celda (4)
Maneje el evento Worksheet_Change o el evento Workbook_SheetChange.
Los manejadores de eventos toman un argumento "Target As Range", para que pueda verificar si el rango que está cambiando incluye la celda que le interesa.
¿Cómo puedo ejecutar automáticamente una macro de Excel cada vez que cambia un valor en una celda 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 particular que se monitorea y Macro
es el nombre de la macro.
¿Hay una mejor manera?
Prefiero de 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
Tengo una celda que está vinculada a una base de datos en línea y se actualiza con frecuencia. Quiero activar una macro siempre 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 es porque los eventos internos de Excel no se desencadenan, 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
Tu código se ve bastante bien.
Tenga cuidado, sin embargo, para 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 cambios de usuario, que es el más típico, pero es posible cambiar los valores de celda de la hoja de trabajo cuando no es la hoja activa a través de cambios programáticos, por ejemplo, VBA.
Con esto en mente, 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 para la hoja de trabajo en cuestión (generalmente lo es):
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...