esegue automaticamente una macro Excel su una modifica di cella
-
03-07-2019 - |
Domanda
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 cella particolare da monitorare e Macro
è il nome della macro.
C'è un modo migliore?
Soluzione
Il tuo codice sembra piuttosto buono.
Fai attenzione, tuttavia, per la tua chiamata a Range (" H5 ")
è un comando di scelta rapida per Application.Range (" H5 ")
, che è equivalente a Application.ActiveSheet.Range (" H5 ")
. Questo potrebbe andare bene, se le uniche modifiche sono le modifiche dell'utente - che è la più tipica - ma è possibile che i valori della cella del foglio di lavoro cambino quando non è il foglio attivo tramite modifiche programmatiche, ad es. VBA.
Con questo in mente, utilizzerei 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 usare Me.Range (" H5 ")
, se il gestore eventi si trova nella tabella codici per il foglio di lavoro in questione (di solito lo è):
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Me.Range("H5")) Is Nothing Then Macro
End Sub
Spero che questo aiuti ...
Altri suggerimenti
Gestisci l'evento Worksheet_Change
o l'evento Workbook_SheetChange
.
I gestori di eventi accettano un argomento "Target as Range", in modo da poter verificare se l'intervallo che sta cambiando include la cella che ti interessa.
Preferisco così, non usare 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 trascorso molto tempo a ricercare questo e ad imparare come funziona, dopo aver incasinato davvero i trigger dell'evento. Dato che c'erano così tante informazioni sparse, ho deciso di condividere ciò che ho scoperto funzionare in un unico posto, passo dopo passo come segue:
1) Apri l'Editor VBA, in Progetto VBA (YourWorkBookName.xlsm) apri l'oggetto Microsoft Excel e seleziona il foglio a cui si riferisce l'evento di modifica.
2) La vista del codice predefinito è " Generale. " Dall'elenco a discesa in alto al centro, seleziona " Foglio di lavoro. & Quot;
3) Private Sub Worksheet_SelectionChange è già lì come dovrebbe essere, lasciarlo da solo. Copia / incolla il codice di Mike Rosenblum dall'alto e modifica il riferimento .Range alla cella per cui stai osservando una modifica (B3, nel mio caso). Non posizionare ancora la tua Macro, tuttavia (ho rimosso la parola "Macro" dopo "Dopo", quindi:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Me.Range("H5")) Is Nothing Then
End Sub
o dall'elenco a discesa in alto a sinistra, seleziona " Modifica " e nello spazio tra Private Sub e End Sub, incolla If Not Intersect (Target, Me.Range (" H5 ")) Is Nothing Then
4) Sulla riga dopo " Quindi " disattiva gli eventi in modo che quando chiami la tua macro, non si inneschino eventi e prova a eseguire nuovamente questo Foglio di lavoro_cambia in un ciclo infinito che arresta in modo anomalo Excel e / o incasina tutto:
Application.EnableEvents = False
5) Chiama la tua macro
Call YourMacroName
6) Riattiva gli eventi in modo da attivare la modifica successiva (e qualsiasi / tutti gli altri eventi):
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
Ciò comporta l'attivazione / disattivazione degli eventi dai moduli, il che crea problemi e consente semplicemente il trigger di modifica, disattiva gli eventi, esegue la macro e riattiva gli eventi.
Ho una cella collegata al database delle scorte online e aggiornata frequentemente. Voglio innescare una macro ogni volta che il valore della cella viene aggiornato.
Credo che questo sia simile alla modifica del valore della cella da parte di un programma o di qualsiasi aggiornamento di dati esterni, ma gli esempi sopra riportati in qualche modo non funzionano per me. Penso che il problema sia dovuto al fatto che gli eventi interni di Excel non sono stati attivati, ma questa è la mia ipotesi.
Ho fatto quanto segue,
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