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?

È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top