Esegui automaticamente una macro di Excel su un cambiamento di cella

Come posso eseguire automaticamente una macro di Excel ogni volta che cambia un valore in una particolare cella?

In questo momento, il mio codice di lavoro è:

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

dove "H5" è la particolare cella monitorata e Macro è il nome della macro.

C’è un modo migliore?

Il tuo codice sembra abbastanza buono.

Fai attenzione, tuttavia, che la tua chiamata a Range("H5") sia un comando di scelta rapida per Application.Range("H5") , che è equivalente a Application.ActiveSheet.Range("H5") . Questo potrebbe andar bene, se le uniche modifiche sono le modifiche dell’utente – che è il più tipico – ma è ansible che i valori delle celle del foglio di lavoro cambino quando non è il foglio attivo tramite modifiche programmatiche, ad esempio VBA.

Con questo in mente, vorrei utilizzare 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 

Oppure puoi utilizzare Me.Range("H5") , se il gestore eventi si trova nella Me.Range("H5") codici per il foglio di lavoro in questione (di solito è):

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

Spero che questo ti aiuti…

Gestire l’evento Worksheet_Change o l’evento Workbook_SheetChange .

I gestori di eventi prendono un argomento “Target As Range”, così puoi verificare se l’intervallo che sta cambiando include la cella a cui sei interessato.

Preferisco in questo modo, non usando una cella ma un intervallo

  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 

Ho passato molto tempo a fare ricerche su questo e ad imparare come funziona, dopo aver davvero incasinato gli inneschi dell’evento. Dato che c’erano così tante informazioni sparse ho deciso di condividere ciò che ho trovato per lavorare tutto in un unico posto, passo dopo passo come segue:

1) Apri l’editor VBA, in VBA Project (YourWorkBookName.xlsm), apri Microsoft Excel Object e seleziona il foglio a cui si riferisce l’evento change.

2) La vista di codice predefinita è “Generale”. Dall’elenco a discesa nella parte centrale in alto, seleziona “Foglio di lavoro”.

3) Private Sub Worksheet_SelectionChange è già lì come dovrebbe essere, lasciarlo da solo. Copia / incolla il codice di Mike Rosenblum da sopra e cambia il riferimento .Range alla cella per cui stai guardando una modifica (B3, nel mio caso). Non posizionare ancora la tua Macro, tuttavia (ho rimosso la parola “Macro” dopo “Allora”):

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

oppure dall’elenco a discesa in alto a sinistra, seleziona “Cambia” e nello spazio tra If Not Intersect(Target, Me.Range("H5")) Is Nothing Then privati ​​e Fine If Not Intersect(Target, Me.Range("H5")) Is Nothing Then , incolla If Not Intersect(Target, Me.Range("H5")) Is Nothing Then

4) Sulla linea dopo “Allora” distriggers gli eventi in modo che quando chiami la tua macro, non attivi eventi e tenti di eseguire di nuovo questo Worksheet_Change in un ciclo senza fine che blocca Excel e / o altrimenti rovina tutto:

 Application.EnableEvents = False 

5) Chiama la tua macro

 Call YourMacroName 

6) Attiva nuovamente gli eventi in modo che il successivo cambiamento (e qualsiasi / tutti gli altri eventi) si attivino:

 Application.EnableEvents = True 

7) Termina il blocco If e il Sub:

  End If End Sub 

L’intero codice:

 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 

Questo porta gli eventi di triggerszione / distriggerszione fuori dai Moduli che creano problemi e semplicemente lascia che il cambiamento si avvii, distriggers gli eventi, esegue la macro e ritriggers gli eventi.

Ho una cella che è collegata al database azionario online e aggiornata di frequente. Voglio triggersre una macro ogni volta che il valore della cella viene aggiornato.

Credo che questo sia simile al cambiamento del valore delle celle da parte di un programma o di qualsiasi aggiornamento di dati esterni, ma gli esempi sopra non funzionano per me. Penso che il problema sia perché gli eventi interni excel non vengono triggersti, ma questa è la mia ipotesi.

Ho fatto il seguente,

 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