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

Ahora, mi código 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 célula en particular, la supervisión y Macro es el nombre de la macro.

Hay una manera mejor?

InformationsquelleAutor namin | 2009-01-03

5 Comentarios

  1. 106

    El código se ve muy bien.

    Tener cuidado, sin embargo, para la llamada a Range("H5") es un atajo comando para Application.Range("H5"), que es equivalente a Application.ActiveSheet.Range("H5"). Esto podría estar bien, si los únicos cambios son de usuario-cambios-que es la más típica, pero es posible que la hoja de cálculo de los valores de las celdas a cambiar, cuando no es la hoja activa a través de los cambios de programación, por ejemplo, de VBA.

    Con esto en mente, me gustaría utilizar 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 utilizar Me.Range("H5"), si el controlador de eventos en el código de página de la hoja de cálculo 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…

    • lo que si la celda H5 se cambia de otra hoja, decir sheet2, a continuación, la función de arriba no funciona. plz ayuda en esto.
    • Para cualquier persona que viene aquí a partir de una búsqueda de google, asegúrese de que pegar este código en la hoja en vba, no un módulo como yo lo hice. mira stackoverflow.com/questions/15337008/…
    • Aplicación.ActiveSheet.Range(«H5»). ==> objetivo.el padre de familia.range(«H5»), es aún más seguro
    • Siempre que no se especifique explícitamente una referencia de hoja, Excel supone la ActiveSheet y siempre que no se especifique explícitamente que es Excel que está trabajando con Excel supone Application.
    • Tenga en cuenta que, en una hoja de cálculo de módulo de código (que es donde un Worksheet_Change evento debe estar ubicado), sin Range hace no por defecto para ActiveSheet sino que se refiere a la hoja que contiene el código. El código en esta respuesta es por lo tanto efectivamente el mismo que el código de la pregunta. (Nota: en 2009 cuando esta respuesta fue escrito, es mayo ha sido diferente, pero estoy bastante seguro de que no lo era.)
    • Bonita camioneta, estás en lo correcto.

  2. 7

    Manejar el Worksheet_Change evento o la Workbook_SheetChange evento.

    Los controladores de eventos toman un argumento «Target as Range», así que usted puede comprobar si el rango que incluye el cambio de la celda en la que está interesado.

    • Gracias, funciona. Puedo comprobar el intervalo de con, digamos, Target.Address = Range("H5").Address. Hay una manera más fácil?
    • Una alternativa: Not (Intersect(Target, Range("H5")) Is Nothing) . ¿Es esta la forma que lo haría?
    • El primer comentario (Target.Address = Range("H5").Address) no funciona si su celda sólo fue parte de la nueva gama. El segundo comentario todavía sufre de los problemas descritos por Mike Rosenblum.
  3. 3

    Prefiero de esta manera, no usar el celular, pero un rango de

        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
    • Es el mismo que el de una célula. Puede establecer un rango como una celda, un rango de continuo las células, o incluso células dispersas (separadas por comas).
  4. 3

    Pasé mucho tiempo investigando este y el aprendizaje de cómo funciona todo, después de realmente jugar el evento desencadena. Ya no era tan dispersos info me he decidido a compartir lo que he encontrado para trabajar todos en un mismo lugar, el paso a paso de la siguiente manera:

    1) Abrir el Editor de VBA, en virtud de Proyecto de VBA (YourWorkBookName.xlsm) abierto de Objetos de Microsoft Excel y seleccione la Hoja a la que el evento de cambio le pertenecen.

    2) El código predeterminado de la vista es «General». Desde la lista desplegable en la parte superior central, seleccione «Hoja de cálculo».

    3) Private Sub Worksheet_SelectionChange ya está allí, como debe ser, dejarlo solo. Copiar/Pegar Mike Rosenblum código de arriba y cambiar el .Rango de referencia a la celda para la que usted está viendo un cambio (B3, en mi caso). No coloque la Macro sin embargo, (he quitado 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 desde la lista desplegable en la parte superior izquierda, seleccione «Cambiar» y en el espacio entre Private Sub y End Sub, pegar If Not Intersect(Target, Me.Range("H5")) Is Nothing Then

    4) En la línea después de «Entonces» apaga eventos, de modo que cuando se llama a la macro, no desencadenar los acontecimientos y tratar de ejecutar este Worksheet_Change de nuevo en un ciclo sin fin que se bloquea Excel y/o de otra manera lo echa todo a perder:

    Application.EnableEvents = False

    5) Llamar a la macro

    Call YourMacroName

    6) Girar los acontecimientos de vuelta, así que la próxima cambiar (y de cualquier/todos los otros eventos) disparo:

    Application.EnableEvents = True

    7) Fin Si el bloque 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

    Esta toma de giro de los eventos de encendido/apagado de los Módulos, lo que crea problemas y simplemente permite que el cambio de gatillo, desactiva los eventos, se ejecuta la macro y se convierte eventos de nuevo.

  5. 0

    Tengo una celda que está vinculado a acciones en línea de la base de datos y se actualiza frecuentemente. Quiero activar una macro siempre que el valor de la celda es actualizado.

    Creo que este es similar al valor de la celda cambio por un programa o cualquier externos de actualización de datos, pero por encima de ejemplos de alguna manera no funciona para mí. Creo que el problema es debido a que excel interna no se desencadenan los eventos, pero eso 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
    • No puedo conseguir que esto funcione, por alguna razón. Cuando le digo a la ejecución de código en VBA es tirar un pop-up menú y me pregunta si quiero ejecutar la macro en lugar de ejecutar la macro de forma automática?

Dejar respuesta

Please enter your comment!
Please enter your name here