- Eventi VBA di Excel - Introduzione
- Diversi tipi di eventi VBA di Excel
- Dove inserire il codice relativo all'evento
- Comprensione della sequenza di eventi
- Comprensione del ruolo degli argomenti negli eventi VBA
- Eventi a livello di cartella di lavoro (spiegati con esempi)
- Eventi a livello di foglio di lavoro (spiegati con esempi)
- Evento OnTime VBA di Excel
- Evento OnKey VBA di Excel
- Disabilitare gli eventi in VBA
- Impatto degli eventi Annulla stack
Quando crei o registri una macro in Excel, devi eseguire la macro per eseguire i passaggi nel codice.
Alcuni modi per eseguire una macro includono l'utilizzo della finestra di dialogo della macro, l'assegnazione della macro a un pulsante, l'utilizzo di una scorciatoia, ecc.
Oltre a queste esecuzioni di macro avviate dall'utente, puoi anche utilizzare gli eventi VBA per eseguire la macro.
Eventi VBA di Excel - Introduzione
Lasciami prima spiegare cos'è un evento in VBA.
Un evento è un'azione che può attivare l'esecuzione della macro specificata.
Ad esempio, quando apri una nuova cartella di lavoro, è un evento. Quando inserisci un nuovo foglio di lavoro, è un evento. Quando fai doppio clic su una cella, è un evento.
Esistono molti di questi eventi in VBA ed è possibile creare codici per questi eventi. Ciò significa che non appena si verifica un evento e se hai specificato un codice per quell'evento, quel codice verrà eseguito immediatamente.
Excel lo fa automaticamente non appena si accorge che si è verificato un evento. Quindi devi solo scrivere il codice e inserirlo nella subroutine dell'evento corretta (questo è trattato più avanti in questo articolo).
Ad esempio, se si inserisce un nuovo foglio di lavoro e si desidera che abbia un prefisso dell'anno, è possibile scriverne il codice.
Ora, ogni volta che qualcuno inserisce un nuovo foglio di lavoro, questo codice verrà eseguito automaticamente e aggiungerà il prefisso dell'anno al nome del foglio di lavoro.
Un altro esempio potrebbe essere quello di voler cambiare il colore della cella quando qualcuno fa doppio clic su di essa. È possibile utilizzare l'evento doppio clic per questo.
Allo stesso modo, puoi creare codici VBA per molti di questi eventi (come vedremo più avanti in questo articolo).
Di seguito è riportato un breve elemento visivo che mostra l'evento del doppio clic in azione. Non appena faccio doppio clic sulla cella A1. Excel apre immediatamente una finestra di messaggio che mostra l'indirizzo della cella.
Il doppio clic è un evento e la visualizzazione della finestra di messaggio è ciò che ho specificato nel codice ogni volta che si verifica l'evento del doppio clic.
Sebbene l'esempio sopra sia un evento inutile, spero che ti aiuti a capire cosa sono realmente gli eventi.
Diversi tipi di eventi VBA di Excel
Esistono diversi oggetti in Excel, come Excel stesso (a cui spesso ci riferiamo come applicazione), cartelle di lavoro, fogli di lavoro, grafici, ecc.
A ciascuno di questi oggetti possono essere associati vari eventi. Per esempio:
- Se crei una nuova cartella di lavoro, si tratta di un evento a livello di applicazione.
- Se aggiungi un nuovo foglio di lavoro, si tratta di un evento a livello di cartella di lavoro.
- Se modifichi il valore in una cella di un foglio, si tratta di un evento a livello di foglio di lavoro.
Di seguito sono riportati i diversi tipi di eventi che esistono in Excel:
- Eventi a livello di foglio di lavoro: Questi sono i tipi di eventi che si attiverebbero in base alle azioni intraprese nel foglio di lavoro. Esempi di questi eventi includono la modifica di una cella nel foglio di lavoro, la modifica della selezione, il doppio clic su una cella, il clic destro su una cella, ecc.
- Eventi a livello di cartella di lavoro: Questi eventi verrebbero attivati in base alle azioni a livello di cartella di lavoro. Esempi di questi eventi includono l'aggiunta di un nuovo foglio di lavoro, il salvataggio della cartella di lavoro, l'apertura della cartella di lavoro, la stampa di una parte o dell'intera cartella di lavoro, ecc.
- Eventi a livello di applicazione: Questi sono gli eventi che si verificano nell'applicazione Excel. Un esempio di questi include la chiusura di una delle cartelle di lavoro aperte o l'apertura di una nuova cartella di lavoro.
- Eventi a livello di modulo utente: Questi eventi verrebbero attivati in base alle azioni nel "Form utente". Esempi di questi includono l'inizializzazione di un modulo utente o il clic su un pulsante nel modulo utente.
- Eventi del grafico: Questi sono eventi relativi al foglio grafico. Un foglio grafico è diverso da un foglio di lavoro (che è dove la maggior parte di noi è abituata a lavorare in Excel). Uno scopo dei fogli grafici è di contenere un grafico. Esempi di tali eventi includono la modifica della serie del grafico o il ridimensionamento del grafico.
- Eventi OnTime e OnKey: Questi sono due eventi che non rientrano in nessuna delle categorie precedenti. Quindi li ho elencati separatamente. L'evento "OnTime" consente di eseguire un codice in un momento specifico o dopo che è trascorso un tempo specifico. L'evento "OnKey" consente di eseguire un codice quando viene utilizzata una specifica sequenza di tasti (o una combinazione di tasti).
Dove inserire il codice relativo all'evento
Nella sezione precedente, ho trattato i diversi tipi di eventi.
In base al tipo di evento, è necessario inserire il codice nell'oggetto pertinente.
Ad esempio, se si tratta di un evento correlato al foglio di lavoro, dovrebbe andare nella finestra del codice dell'oggetto del foglio di lavoro. Se è correlato alla cartella di lavoro, dovrebbe andare nella finestra del codice per un oggetto cartella di lavoro.
In VBA, diversi oggetti, come fogli di lavoro, cartelle di lavoro, fogli grafici, moduli utente, ecc., Hanno le proprie finestre di codice. È necessario inserire il codice dell'evento nella finestra del codice dell'oggetto pertinente. Ad esempio, se si tratta di un evento a livello di cartella di lavoro, è necessario disporre del codice dell'evento nella finestra del codice cartella di lavoro.Le sezioni seguenti riguardano i luoghi in cui è possibile inserire il codice dell'evento:
Nella finestra del codice del foglio di lavoro
Quando apri VB Editor (usando la scorciatoia da tastiera ALT + F11), noterai l'oggetto dei fogli di lavoro in Esplora progetti. Per ogni foglio di lavoro nella cartella di lavoro, vedrai un oggetto.
Quando si fa doppio clic sull'oggetto del foglio di lavoro in cui si desidera inserire il codice, si aprirà la finestra del codice per quel foglio di lavoro.
Sebbene tu possa iniziare a scrivere il codice da zero, è molto meglio selezionare l'evento da un elenco di opzioni e lasciare che VBA inserisca automaticamente il codice pertinente per l'evento selezionato.
Per fare ciò, devi prima selezionare il foglio di lavoro dal menu a discesa in alto a sinistra della finestra del codice.
Dopo aver selezionato il foglio di lavoro dal menu a discesa, viene visualizzato un elenco di tutti gli eventi relativi al foglio di lavoro. Puoi selezionare quello che desideri utilizzare dal menu a discesa in alto a destra nella finestra del codice.
Non appena si seleziona l'evento, inserirà automaticamente la prima e l'ultima riga del codice per l'evento selezionato. Ora puoi aggiungere il tuo codice tra le due righe.
Note: Non appena selezioni Foglio di lavoro dal menu a discesa, noterai due righe di codice visualizzate nella finestra del codice. Una volta selezionato l'evento per il quale si desidera il codice, è possibile eliminare le righe che apparivano di default.
Nota che ogni foglio di lavoro ha una propria finestra di codice. Quando inserisci il codice per Sheet1, funzionerà solo se l'evento si verifica in Sheet1.
Nella finestra del codice di questa cartella di lavoro
Proprio come i fogli di lavoro, se hai un codice evento a livello di cartella di lavoro, puoi inserirlo nella finestra del codice ThisWorkbook.
Quando fai doppio clic su ThisWorkbook, si aprirà la finestra del codice per esso.
Devi selezionare Cartella di lavoro dal menu a discesa in alto a sinistra della finestra del codice.
Dopo aver selezionato Cartella di lavoro dal menu a discesa, viene visualizzato un elenco di tutti gli eventi relativi alla cartella di lavoro. Puoi selezionare quello che desideri utilizzare dal menu a discesa in alto a destra nella finestra del codice.
Non appena si seleziona l'evento, inserirà automaticamente la prima e l'ultima riga del codice per l'evento selezionato. Ora puoi aggiungere il tuo codice tra le due righe.
Nota: non appena selezioni Cartella di lavoro dal menu a discesa, nella finestra del codice vengono visualizzate due righe di codice. Una volta selezionato l'evento per il quale si desidera il codice, è possibile eliminare le righe che apparivano di default.
Nella finestra del codice del form utente
Quando crei UserForm in Excel, puoi anche utilizzare gli eventi UserForm per eseguire codici basati su azioni specifiche. Ad esempio, è possibile specificare un codice che viene eseguito quando si fa clic sul pulsante.
Mentre gli oggetti Sheet e ThisWorkbook sono già disponibili quando apri VB Editor, UserForm è qualcosa che devi creare prima.
Per creare un modulo utente, fai clic con il pulsante destro del mouse su uno degli oggetti, vai su Inserisci e fai clic su Modulo utente.
Ciò inserirebbe un oggetto UserForm nella cartella di lavoro.
Quando si fa doppio clic sul Form utente (o su qualsiasi oggetto che si aggiunge al Form utente), si aprirà la finestra del codice per il Form utente.
Ora, proprio come i fogli di lavoro o ThisWorkbook, puoi selezionare l'evento e inserirà la prima e l'ultima riga per quell'evento. E poi puoi aggiungere il codice nel mezzo.
Nella finestra del codice grafico
In Excel, puoi anche inserire fogli Grafico (che sono diversi dai fogli di lavoro). Un foglio grafico deve contenere solo grafici.
Dopo aver inserito un foglio grafico, sarai in grado di vedere l'oggetto foglio Grafico nell'editor VB.
Puoi aggiungere il codice dell'evento alla finestra del codice del foglio grafico proprio come abbiamo fatto nel foglio di lavoro.
Fare doppio clic sull'oggetto del foglio Grafico in Esplora progetti. Questo aprirà la finestra del codice per il foglio grafico.
Ora devi selezionare Grafico dal menu a discesa in alto a sinistra della finestra del codice.
Dopo aver selezionato Grafico dal menu a discesa, si ottiene un elenco di tutti gli eventi relativi al foglio Grafico. Puoi selezionare quello che desideri utilizzare dal menu a discesa in alto a destra nella finestra del codice.
Nota: non appena selezioni Grafico dal menu a discesa, noterai due righe di codice visualizzate nella finestra del codice. Una volta selezionato l'evento per il quale si desidera il codice, è possibile eliminare le righe che apparivano di default.
Modulo in classe
I moduli di classe devono essere inseriti proprio come i moduli utente.
Un modulo di classe può contenere codice relativo all'applicazione, che sarebbe Excel stesso e i grafici incorporati.
Tratterò il modulo di classe come un tutorial separato nelle prossime settimane.
Si noti che, a parte gli eventi OnTime e OnKey, nessuno degli eventi di cui sopra può essere archiviato nel normale modulo VBA.Comprensione della sequenza di eventi
Quando attivi un evento, non accade isolatamente. Può anche portare a una sequenza di più trigger.
Ad esempio, quando inserisci un nuovo foglio di lavoro, accadono le seguenti cose:
- È stato aggiunto un nuovo foglio di lavoro
- Il foglio di lavoro precedente viene disattivato
- Il nuovo foglio di lavoro viene attivato
Sebbene nella maggior parte dei casi, potresti non doverti preoccupare della sequenza, se stai creando codici complessi che si basano su eventi, è meglio conoscere la sequenza per evitare risultati imprevisti.
Comprensione del ruolo degli argomenti negli eventi VBA
Prima di passare agli esempi di eventi e alle fantastiche cose che puoi fare con esso, c'è un concetto importante che devo trattare.
Negli eventi VBA, ci sarebbero due tipi di codici:
- Senza argomenti
- Con argomenti
E in questa sezione, voglio coprire rapidamente il ruolo degli argomenti.
Di seguito è riportato un codice che non contiene argomenti (le parentesi sono vuote):
Private Sub Workbook_Open() MsgBox "Ricorda di riempire la scheda attività" End Sub
Con il codice sopra, quando apri una cartella di lavoro, mostra semplicemente una finestra di messaggio con il messaggio "Ricorda di riempire la scheda attività".
Ora diamo un'occhiata a un codice che ha un argomento.
Private Sub Workbook_NewSheet(ByVal Sh As Object) Sh.Range("A1") = Sh.Name End Sub
Il codice sopra usa l'argomento Sh che è definito come un tipo di oggetto. L'argomento Sh potrebbe essere un foglio di lavoro o un foglio grafico, poiché l'evento precedente viene attivato quando viene aggiunto un nuovo foglio.
Assegnando il nuovo foglio che viene aggiunto alla cartella di lavoro alla variabile oggetto Sh, VBA ci ha consentito di utilizzarlo nel codice. Quindi, per fare riferimento al nuovo nome del foglio, posso usare Sh.Name.
Il concetto di argomenti sarà utile quando esaminerai gli esempi di eventi VBA nelle sezioni successive.
Eventi a livello di cartella di lavoro (spiegati con esempi)
Di seguito sono riportati gli eventi più comunemente utilizzati in una cartella di lavoro.
NOME DELL'EVENTO | COSA SCARICA L'EVENTO |
Attivare | Quando una cartella di lavoro è attivata |
Dopo il salvataggio | Quando una cartella di lavoro è installata come componente aggiuntivo |
Prima di salvare | Quando viene salvata una cartella di lavoro |
PrimaChiudi | Quando una cartella di lavoro è chiusa |
PrimaStampa | Quando viene stampata una cartella di lavoro |
Disattivare | Quando una cartella di lavoro è disattivata |
NuovoFoglio | Quando viene aggiunto un nuovo foglio |
Aprire | Quando si apre una cartella di lavoro |
FoglioAttiva | Quando un foglio nella cartella di lavoro è attivato |
FoglioPrima dell'eliminazione | Quando un foglio viene eliminato |
FoglioPrima di DoubleClick | Quando si fa doppio clic su qualsiasi foglio |
Foglio prima del clic destro | Quando si fa clic con il pulsante destro del mouse su qualsiasi foglio |
FoglioCalcola | Quando un foglio viene calcolato o ricalcolato |
FoglioDisattiva | Quando una cartella di lavoro è disattivata |
Aggiornamento tabella pivot del foglio | Quando una cartella di lavoro viene aggiornata |
FoglioSelezioneModifica | Quando una cartella di lavoro viene modificata |
WindowActivate | Quando una cartella di lavoro è attivata |
Disattiva finestra | Quando una cartella di lavoro è disattivata |
Nota che questo non è un elenco completo. Puoi trovare l'elenco completo qui.
Ricorda che il codice per l'evento Workbook è memorizzato nella finestra del codice degli oggetti ThisWorkbook.
Ora diamo un'occhiata ad alcuni utili eventi della cartella di lavoro e vediamo come possono essere utilizzati nel tuo lavoro quotidiano.
Evento aperto cartella di lavoro
Supponiamo che tu voglia mostrare all'utente un promemoria amichevole per riempire le loro schede attività ogni volta che aprono una cartella di lavoro specifica.
Puoi usare il codice seguente per farlo:
Private Sub Workbook_Open() MsgBox "Ricorda di riempire la scheda attività" End Sub
Ora non appena apri la cartella di lavoro con questo codice, ti mostrerà una finestra di messaggio con il messaggio specificato.
Ci sono alcune cose da sapere quando si lavora con questo codice (o con i codici degli eventi della cartella di lavoro in generale):
- Se una cartella di lavoro ha una macro e vuoi salvarla, devi salvarla nel formato .XLSM. Altrimenti il codice macro andrebbe perso.
- Nell'esempio sopra, il codice dell'evento verrebbe eseguito solo quando le macro sono abilitate. Potresti vedere una barra gialla che chiede l'autorizzazione per abilitare le macro. Fino a quando non è abilitato, il codice dell'evento non viene eseguito.
- Il codice dell'evento Workbook viene inserito nella finestra del codice dell'oggetto ThisWorkbook.
Puoi perfezionare ulteriormente questo codice e mostrare il messaggio solo di venerdì.
Il codice seguente farebbe questo:
Private Sub Workbook_Open() wkday = Weekday(Date) If wkday = 6 Then MsgBox "Ricorda di riempire la scheda attività" End Sub
Si noti che nella funzione Weekday, a domenica viene assegnato il valore 1, lunedì è 2 e così via.
Quindi per venerdì ho usato 6.
L'evento Workbook Open può essere utile in molte situazioni, ad esempio:
- Quando vuoi mostrare un messaggio di benvenuto alla persona quando viene aperta una cartella di lavoro.
- Quando si desidera visualizzare un promemoria all'apertura della cartella di lavoro.
- Quando vuoi attivare sempre un foglio di lavoro specifico nella cartella di lavoro quando viene aperto.
- Quando si desidera aprire file correlati insieme alla cartella di lavoro.
- Quando si desidera acquisire la data e l'ora ogni volta che si apre la cartella di lavoro.
Evento NewSheet della cartella di lavoro
L'evento NewSheet viene attivato quando si inserisce un nuovo foglio nella cartella di lavoro.
Supponiamo che tu voglia inserire il valore di data e ora nella cella A1 del foglio appena inserito. Puoi usare il codice seguente per farlo:
Private Sub Workbook_NewSheet(ByVal Sh As Object) On Error Riprendi successivo Sh.Range("A1") = Format(Now, "dd-mmm-yyyy hh:mm:ss") End Sub
Il codice sopra utilizza "On Error Resume Next" per gestire i casi in cui qualcuno inserisce un foglio grafico e non un foglio di lavoro. Poiché il foglio grafico non ha la cella A1, mostrerebbe un errore se "On Error Resume Next" non viene utilizzato.
Un altro esempio potrebbe essere quando si desidera applicare alcune impostazioni di base o formattazione a un nuovo foglio non appena viene aggiunto. Ad esempio, se desideri aggiungere un nuovo foglio e desideri che ottenga automaticamente un numero di serie (fino a 100), puoi utilizzare il codice seguente.
Private Sub Workbook_NewSheet(ByVal Sh As Object) In caso di errore Riprendi successivo con Sh.Range("A1") .Value = "S. No." .Interior.Color = vbBlue .Font.Color = vbWhite End With For i = da 1 a 100 Sh.Range("A1").Offset(i, 0).Value = i Next i Sh.Range("A1", Range ("A1").End(xlDown)).Borders.LineStyle = xlContinuous End Sub
Il codice sopra fa anche un po' di formattazione. Dà alla cella di intestazione un colore blu e rende il carattere bianco. Applica anche un bordo a tutte le celle piene.
Il codice sopra è un esempio di come un breve codice VBA può aiutarti a rubare alcuni secondi ogni volta che inserisci un nuovo foglio di lavoro (nel caso in cui sia qualcosa che devi fare ogni volta).
Cartella di lavoro prima di salvare l'evento
L'evento Before Save viene attivato quando si salva una cartella di lavoro. Si noti che prima viene attivato l'evento e quindi viene salvata la cartella di lavoro.
Quando si salva una cartella di lavoro di Excel, potrebbero esserci due possibili scenari:
- Lo stai salvando per la prima volta e mostrerà la finestra di dialogo Salva con nome.
- Lo hai già salvato in precedenza e semplicemente salverà e sovrascriverà le modifiche nella versione già salvata.
Ora diamo un'occhiata ad alcuni esempi in cui è possibile utilizzare l'evento BeforeSave.
Supponiamo di avere una nuova cartella di lavoro che stai salvando per la prima volta e di voler ricordare all'utente di salvarla nell'unità K, quindi puoi utilizzare il codice seguente:
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) If SaveAsUI Then MsgBox "Salva questo file nell'unità K" End Sub
Nel codice precedente, se il file non è mai stato salvato, SaveAsUI è True e visualizza la finestra di dialogo Salva con nome. Il codice precedente visualizzerà il messaggio prima che venga visualizzata la finestra di dialogo Salva con nome.
Un altro esempio potrebbe essere quello di aggiornare la data e l'ora in cui il file viene salvato in una cella specifica.
Il codice seguente inserirà la data e l'ora nella cella A1 di Sheet1 ogni volta che il file viene salvato.
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) Worksheets("Sheet1").Range("A1") = Format(Now, "dd-mmm-yyyy hh:mm:ss") End Sub
Si noti che questo codice viene eseguito non appena l'utente salva la cartella di lavoro. Se la cartella di lavoro viene salvata per la prima volta, mostrerà una finestra di dialogo Salva con nome. Ma il codice è già stato eseguito quando viene visualizzata la finestra di dialogo Salva con nome. A questo punto, se decidessi di cancellare e non salvare la cartella di lavoro, la data e l'ora sarebbero già state inserite nella cella.
Cartella di lavoro prima della chiusura dell'evento
L'evento Before Close si verifica subito prima della chiusura della cartella di lavoro.
Il codice seguente protegge tutti i fogli di lavoro prima che la cartella di lavoro venga chiusa.
Private Sub Workbook_BeforeClose(Cancel As Boolean) Dim sh As Worksheet For Each sh In ThisWorkbook.Worksheets sh.Protect Next sh End Sub
Ricorda che il codice dell'evento viene attivato non appena chiudi la cartella di lavoro.
Una cosa importante da sapere su questo evento è che non importa se la cartella di lavoro è effettivamente chiusa o meno.
Nel caso in cui la cartella di lavoro non sia stata salvata e ti venga mostrato il messaggio che chiede se salvare o meno la cartella di lavoro e fai clic su Annulla, la cartella di lavoro non verrà salvata.Tuttavia, a quel punto il codice dell'evento sarebbe già stato eseguito.
Cartella di lavoro prima dell'evento di stampa
Quando si impartisce il comando di stampa (o il comando Anteprima di stampa), viene attivato l'evento Prima della stampa.
Il codice seguente ricalcolerebbe tutti i fogli di lavoro prima che la cartella di lavoro venga stampata.
Private Sub Workbook_BeforePrint(Cancel As Boolean) Per ogni ws in Worksheets ws.Calculate Next ws End Sub
Quando l'utente sta stampando la cartella di lavoro, l'evento viene generato indipendentemente dal fatto che stia stampando l'intera cartella di lavoro o solo una parte di essa.
Un altro esempio di seguito è il codice che aggiungerà la data e l'ora al piè di pagina quando viene stampata la cartella di lavoro.
Private Sub Workbook_BeforePrint(Cancel As Boolean) Dim ws As Worksheet For Each ws In ThisWorkbook.Worksheets ws.PageSetup.LeftFooter = "Printed On - " & Format(Now, "dd-mmm-yyyy hh:mm") Next ws End Sub
Eventi a livello di foglio di lavoro (spiegati con esempi)
Gli eventi del foglio di lavoro si verificano in base ai trigger nel foglio di lavoro.
Di seguito sono riportati gli eventi più comunemente utilizzati in un foglio di lavoro.
Nome dell'evento | Cosa fa scattare l'evento |
Attivare | Quando il foglio di lavoro è attivato |
Prima dell'eliminazione | Prima che il foglio di lavoro venga eliminato |
Prima di DoubleClick | Prima di fare doppio clic sul foglio di lavoro |
Prima di RightClick | Prima di fare clic con il pulsante destro del mouse sul foglio di lavoro |
Calcolare | Prima che il foglio di lavoro venga calcolato o ricalcolato |
Modificare | Quando le celle nel foglio di lavoro vengono modificate |
Disattivare | Quando il foglio di lavoro è disattivato |
Aggiornamento tabella pivot | Quando la tabella pivot nel foglio di lavoro viene aggiornata |
SelezioneModifica | Quando la selezione sul foglio di lavoro viene modificata |
Nota che questo non è un elenco completo. Puoi trovare l'elenco completo qui.
Ricordare che il codice per l'evento Foglio di lavoro è memorizzato nella finestra del codice oggetto del foglio di lavoro (in quella in cui si desidera che l'evento venga attivato). Possono esserci più fogli di lavoro in una cartella di lavoro e il tuo codice verrebbe attivato solo quando l'evento si verifica nel foglio di lavoro in cui è inserito.
Ora diamo un'occhiata ad alcuni utili eventi del foglio di lavoro e vediamo come possono essere utilizzati nel tuo lavoro quotidiano.
Foglio di lavoro Attiva evento
Questo evento viene generato quando si attiva un foglio di lavoro.
Il codice seguente rimuove la protezione di un foglio non appena viene attivato.
Private Sub Worksheet_Activate() ActiveSheet.Unprotect End Sub
Puoi anche usare questo evento per assicurarti che una cella specifica o un intervallo di celle (o un intervallo denominato) sia selezionato non appena attivi il foglio di lavoro. Il codice seguente selezionerà la cella D1 non appena attivi il foglio.
Private Sub Worksheet_Activate() ActiveSheet.Range("D1").Seleziona End Sub
Evento di modifica del foglio di lavoro
Un evento di modifica viene generato ogni volta che si apporta una modifica nel foglio di lavoro.
Beh… non sempre.
Ci sono alcune modifiche che attivano l'evento e altre no. Di seguito è riportato un elenco di alcune modifiche che non attiveranno l'evento:
- Quando modifichi la formattazione della cella (dimensione del carattere, colore, bordo, ecc.).
- Quando unisci le celle. Ciò è sorprendente poiché a volte l'unione di celle rimuove anche il contenuto da tutte le celle tranne quella in alto a sinistra.
- Quando aggiungi, elimini o modifichi un commento di cella.
- Quando ordini un intervallo di celle.
- Quando usi la ricerca obiettivo.
Le seguenti modifiche attiverebbero l'evento (anche se potresti pensare che non dovrebbe):
- Copiare e incollare la formattazione attiverebbe l'evento.
- La cancellazione della formattazione attiverebbe l'evento.
- L'esecuzione di un controllo ortografico attiverebbe l'evento.
Di seguito è riportato un codice che mostrerebbe una finestra di messaggio con l'indirizzo della cella che è stata modificata.
Private Sub Worksheet_Change (ByVal Target As Range) MsgBox "Hai appena cambiato " & Target.Address End Sub
Sebbene questa sia una macro inutile, mostra come utilizzare l'argomento Target per scoprire quali celle sono state modificate.
Ora vediamo un paio di esempi più utili.
Supponiamo che tu abbia un intervallo di celle (diciamo A1: D10) e vuoi mostrare un prompt e chiedere all'utente se voleva davvero cambiare una cella in questo intervallo o meno, puoi usare il codice seguente.
Mostra un prompt con due pulsanti: Sì e No. Se l'utente seleziona "Sì", la modifica viene eseguita, altrimenti viene annullata.
Private Sub Worksheet_Change(ByVal Target As Range) If Target.Row <= 10 And Target.Column <= 4 Then Ans = MsgBox("Stai apportando una modifica alle celle in A1: D10. Sei sicuro di volerlo?", vbYesNo) End If If Ans = vbNo Then Application.EnableEvents = False Application.Undo Application.EnableEvents = True End If End Sub
Nel codice sopra, controlliamo se la cella Target si trova nelle prime 4 colonne e nelle prime 10 righe. In tal caso, viene visualizzata la finestra di messaggio. Inoltre, se l'utente ha selezionato No nella finestra del messaggio, la modifica viene annullata (dal comando Application.Undo).
Nota che ho usato Application.EnableEvents = False prima della riga Application.Undo. E poi l'ho invertito usando Application.EnableEvent = True nella riga successiva.
Ciò è necessario poiché quando si verifica l'annullamento, attiva anche l'evento di modifica. Se non imposto EnableEvent su False, continuerà ad attivare l'evento di modifica.
È inoltre possibile monitorare le modifiche a un intervallo denominato utilizzando l'evento di modifica. Ad esempio, se si dispone di un intervallo denominato denominato "DataRange" e si desidera visualizzare un prompt nel caso in cui l'utente apporti una modifica in tale intervallo denominato, è possibile utilizzare il codice seguente:
Private Sub Worksheet_Change(ByVal Target As Range) Dim DRange As Range Set DRange = Range("DataRange") If Not Intersect(Target, DRange) Is Nothing Then MsgBox "Hai appena apportato una modifica all'intervallo di dati" End If End Sub
Il codice sopra controlla se la cella/l'intervallo in cui sono state apportate le modifiche ha celle comuni all'intervallo di dati. Se lo fa, mostra la finestra di messaggio.
Evento di modifica della selezione della cartella di lavoro
L'evento di modifica della selezione viene attivato ogni volta che si verifica una modifica della selezione nel foglio di lavoro.
Il codice seguente ricalcolerebbe il foglio non appena si modifica la selezione.
Private Sub Worksheet_SelectionChange (ByVal Target As Range) Application.Calculate End Sub
Un altro esempio di questo evento è quando si desidera evidenziare la riga e la colonna attive della cella selezionata.
Qualcosa come mostrato di seguito:
Il seguente codice può farlo:
Private Sub Worksheet_SelectionChange(ByVal Target As Range) Cells.Interior.ColorIndex = xlNone With ActiveCell .EntireRow.Interior.Color = RGB(248, 203, 173) .EntireColumn.Interior.Color = RGB(180, 198, 231) End With Fine sotto
Il codice rimuove prima il colore di sfondo da tutte le celle e quindi applica quello menzionato nel codice alla riga e alla colonna attive.
E questo è il problema con questo codice. Che rimuove il colore da tutte le cellule.
Se vuoi evidenziare la riga/colonna attiva mantenendo intatto il colore in altre celle, usa la tecnica mostrata in questo tutorial.
Evento DoubleClick della cartella di lavoro
Questo è uno dei miei eventi preferiti del foglio di lavoro e vedrai molti tutorial in cui l'ho usato (come questo o questo).
Questo evento viene attivato quando fai doppio clic su una cella.
Lascia che ti mostri quanto è fantastico.
Con il codice seguente, puoi fare doppio clic su una cella e applicherà un colore di sfondo, cambierà il colore del carattere e renderà il testo nella cella in grassetto;
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Cancel = True With Target .Interior.Color = vbBlue .Font.Color = vbWhite .Font.Bold = True End With End Sub
Questo può essere utile quando si scorre un elenco di celle e si desidera evidenziare alcune di quelle selezionate. Mentre puoi usare il tasto F4 per ripetere l'ultimo passaggio, sarebbe in grado di applicare solo un tipo di formattazione. Con questo evento di doppio clic, puoi applicarli tutti e tre con un semplice doppio clic.
Nota che nel codice sopra, ho creato il valore di Cancel = True.
Questo viene fatto in modo che l'azione predefinita del doppio clic sia disabilitata, ovvero entrare nella modalità di modifica. Con Cancel = True, Excel non ti porterà in modalità Modifica quando fai doppio clic sulla cella.
Ecco un altro esempio.
Se disponi di un elenco di attività in Excel, puoi utilizzare l'evento doppio clic per applicare il formato barrato per contrassegnare l'attività come completata.
Qualcosa come mostrato di seguito:
Ecco il codice che lo farà:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Cancel = True CurrFormat = Target.Font.Strikethrough If CurrFormat Then Target.Font.Strikethrough = False Else Target.Font.Strikethrough = True End If End Sub
Nota che in questo codice ho fatto doppio clic come evento di commutazione. Quando fai doppio clic su una cella, controlla se il formato barrato è già stato applicato. Se lo è stato, il doppio clic rimuove il formato barrato e, in caso contrario, viene applicato il formato barrato.
Evento OnTime VBA di Excel
Gli eventi che abbiamo visto finora in questo articolo sono stati associati a uno degli oggetti di Excel, che si tratti della cartella di lavoro, del foglio di lavoro, del foglio grafico o dei moduli utente, ecc.
L'evento OnTime è diverso dagli altri eventi in quanto può essere memorizzato nel normale modulo VBA (mentre gli altri dovevano essere inseriti nella finestra del codice di oggetti come ThisWorkbook o Worksheets o UserForms).
All'interno del normale modulo VBA, viene utilizzato come metodo dell'oggetto applicazione.
Il motivo per cui questo è considerato un evento è che può essere attivato in base all'ora specificata. Ad esempio, se voglio che il foglio venga ricalcolato ogni 5 minuti, posso utilizzare l'evento OnTime.
Oppure, se voglio mostrare un messaggio/promemoria in un momento specifico della giornata, posso utilizzare l'evento OnTime.
Di seguito è riportato un codice che mostrerà un messaggio alle 14:00 ogni giorno.
Sub MessageTime() Application.OnTime TimeValue("14:00:00"), "ShowMessage" End Sub Sub ShowMessage() MsgBox "It's Lunch Time" End Sub
Ricorda che devi inserire questo codice nel normale modulo VBA,
Inoltre, mentre l'evento OnTime viene attivato all'ora specificata, è necessario eseguire la macro manualmente in qualsiasi momento. Una volta eseguita la macro, aspetterà fino alle 14:00 e quindi chiamerà la macro "ShowMessage".
La macro ShowMessage visualizzerà quindi il messaggio.
L'evento OnTime accetta quattro argomenti:
Applicazione.OnTime(PrimaOra, Procedura, UltimeOra, Programma)
- Prima Ora: L'ora in cui si desidera eseguire la procedura.
- Procedura: Il nome della procedura da eseguire.
- Ultimo Ora (Facoltativo): Nel caso in cui sia in esecuzione un altro codice e il codice specificato non può essere eseguito all'ora specificata, è possibile specificare l'ultima ora per la quale deve attendere. Ad esempio, potrebbe essere EarlyTime + 45 (il che significa che attenderà 45 secondi per il completamento dell'altra procedura). Se anche dopo 45 secondi la procedura non può essere eseguita, viene abbandonata. Se non lo specifichi, Excel attenderà l'esecuzione del codice, quindi lo eseguirà.
- Programma (opzionale): Se impostato su True, pianifica una nuova procedura temporale. Se False annulla la procedura precedentemente impostata. Per impostazione predefinita, questo è True.
Nell'esempio sopra, abbiamo usato solo i primi due argomenti.
Diamo un'occhiata a un altro esempio.
Il codice seguente aggiornerebbe il foglio di lavoro ogni 5 min.
Dim NextRefresh as Date Sub RefreshSheet() ThisWorkbook.Worksheets("Sheet1").Calculate NextRefresh = Now + TimeValue("00:05:00") Application.OnTime NextRefresh, "RefreshSheet" End Sub StopRefresh() On Error Riprendi Avanti Application.OnTime NextRefresh, "RefreshSheet", , False End Sub
Il codice sopra aggiornerebbe il foglio di lavoro ogni 5 minuti.
Utilizza la funzione Now per determinare l'ora corrente e quindi aggiunge 5 minuti all'ora corrente.
L'evento OnTime continuerà a essere eseguito finché non lo interrompi. Se chiudi la cartella di lavoro e l'applicazione Excel è ancora in esecuzione (altre cartelle di lavoro sono aperte), la cartella di lavoro in cui è in esecuzione l'evento OnTime si riaprirà.
Questo viene gestito meglio arrestando in modo specifico l'evento OnTime.
Nel codice sopra, ho il codice StopRefresh, ma devi eseguirlo per fermare l'evento OnTime. Puoi farlo manualmente, assegnarlo a un pulsante e farlo premendo il pulsante o chiamandolo dall'evento Chiusura cartella di lavoro.
Private Sub Workbook_BeforeClose(Cancel As Boolean) Call StopRefresh End Sub
Il codice dell'evento "BeforeClose" sopra va nella finestra del codice ThisWorkbook.
Evento OnKey VBA di Excel
Quando lavori con Excel, continua a monitorare le sequenze di tasti che usi. Questo ci consente di utilizzare le sequenze di tasti come trigger per un evento.
Con l'evento OnKey, puoi specificare una sequenza di tasti (o una combinazione di tasti) e il codice che deve essere eseguito quando viene utilizzato quel tasto. Quando vengono premuti questi tasti, eseguirà il codice per esso.
Proprio come l'evento OnTime, devi avere un modo per annullare l'evento OnKey. Inoltre, quando si imposta l'evento OnKey per una sequenza di tasti specifica, diventa disponibile in tutte le cartelle di lavoro aperte.
Prima di mostrarti un esempio dell'utilizzo dell'evento OnKey, permettimi di condividere i codici chiave disponibili in VBA.
CHIAVE | CODICE |
Backspace | {BACKSPACE} o {BS} |
Rompere | {ROMPERE} |
Blocco maiuscole | {BLOCCO MAIUSCOLE} |
Elimina | {CANCELLA} o {CANCELLA} |
Freccia in giù | {FUORI USO} |
Fine | {FINE} |
accedere | ~ |
Invio (sulla tastiera numerica) | {ACCEDERE} |
Fuga | {ESC} o {ESC} |
Casa | {CASA} |
Ins | {INSERIRE} |
Freccia sinistra | {SINISTRA} |
BlocNum | {BLOC NUM} |
Pagina giù | {PGDN} |
Pagina su | {PGUP} |
Freccia destra | {GIUSTO} |
Blocco scorrimento | {BLOCCO SCORR.} |
tab | {TAB} |
Freccia su | {SU} |
da F1 a F15 | Da {F1} a {F15} |
Quando è necessario utilizzare un evento onkey, è necessario utilizzare il relativo codice.
La tabella sopra ha i codici per le singole battute.
Puoi anche combinarli con i seguenti codici:
- Spostare: + (Segno più)
- Controllo: ^ (accento circonflesso)
- Alt: % (Percentuale)
Ad esempio, per Alt F4, è necessario utilizzare il codice: "%{F4}” - dove % è per il tasto ALT e {F4} è per il tasto F4.
Ora diamo un'occhiata a un esempio (ricorda che il codice per gli eventi OnKey è inserito nel normale modulo VBA).
Quando premi il tasto PageUp o PageDown, salta 29 righe sopra/sotto la cella attiva (almeno è quello che sta facendo sul mio laptop).
Se vuoi che salti solo 5 righe alla volta, puoi utilizzare il codice seguente:
Sub PageUpDownKeys() Application.OnKey "{PgUp}", "PageUpMod" Application.OnKey "{PgDn}", "PageDownMod" End Sub Sub PageUpMod() On Error Riprendi Next ActiveCell.Offset(-5, 0).Activate End Sub Sub PageDownMod() On Error Riprendi Next ActiveCell.Offset(5, 0).Activate End Sub
Quando esegui la prima parte del codice, verranno eseguiti gli eventi OnKey. Una volta eseguito, l'uso dei tasti PagSu e PagGiù fa sì che il cursore salti solo 5 righe alla volta.
Nota che abbiamo usato "On Error Resume Next" per assicurarci che gli errori vengano ignorati. Questi errori possono verificarsi quando premi il tasto PagSu anche quando sei nella parte superiore del foglio di lavoro. Poiché non ci sono più righe da saltare, il codice mostrerebbe un errore. Ma dal momento che abbiamo usato "On Error Resume Next", verrà ignorato.
Per assicurarti che questi eventi OnKey siano disponibili, devi eseguire la prima parte del codice. Nel caso in cui desideri che questo sia disponibile non appena apri la cartella di lavoro, puoi inserirlo nella finestra del codice ThisWorkbook.
Private Sub Workbook_Open() Application.OnKey "{PgUp}", "PageUpMod" Application.OnKey "{PgDn}", "PageDownMod" End Sub
Il codice sottostante riporterà le chiavi alla loro normale funzionalità.
Sub Cancel_PageUpDownKeysMod() Application.OnKey "{PgUp}" Application.OnKey "{PgDn}" End Sub
Quando non specifichi il secondo argomento nel metodo OnKey, restituirà la sequenza di tasti alla sua normale funzionalità.
Nel caso in cui si desideri annullare la funzionalità di una sequenza di tasti, in modo che Excel non faccia nulla quando viene utilizzata quella sequenza di tasti, è necessario utilizzare una stringa vuota come secondo argomento.
Nel codice seguente, Excel non farebbe nulla quando usiamo i tasti PageUp o PageDown.
Sub Ignore_PageUpDownKeys() Application.OnKey "{PgUp}", "" Application.OnKey "{PgDn}", "" End Sub
Disabilitare gli eventi in VBA
A volte potrebbe essere necessario disabilitare gli eventi per far funzionare correttamente il codice.
Ad esempio, supponiamo di avere un intervallo (A1: D10) e di voler mostrare un messaggio ogni volta che una cella viene modificata in questo intervallo. Quindi mostro una finestra di messaggio e chiedo all'utente se è sicuro di voler apportare la modifica. Se la risposta è Sì, la modifica viene apportata e se la risposta è No, VBA la annullerà.
Puoi usare il seguente codice:
Private Sub Worksheet_Change(ByVal Target As Range) If Target.Row <= 10 And Target.Column <= 4 Then Ans = MsgBox("Stai apportando una modifica alle celle in A1: D10. Sei sicuro di volerlo?", vbYesNo) End If If Ans = vbNo Then Application.Undo End If End Sub
Il problema con questo codice è che quando l'utente seleziona No nella finestra del messaggio, l'azione viene invertita (come ho usato Application.Undo).
Quando si verifica l'annullamento e il valore viene riportato a quello originale, l'evento di modifica VBA viene nuovamente attivato e all'utente viene nuovamente mostrata la stessa finestra di messaggio.
Ciò significa che puoi continuare a fare clic su NO nella finestra del messaggio e continuerà a essere visualizzato. Questo accade perché in questo caso sei bloccato nel ciclo infinito.
Per evitare tali casi, è necessario disabilitare gli eventi in modo che l'evento di modifica (o qualsiasi altro evento) non venga attivato.
Il seguente codice funzionerebbe bene in questo caso:
Private Sub Worksheet_Change(ByVal Target As Range) If Target.Row <= 10 And Target.Column <= 4 Then Ans = MsgBox("Stai apportando una modifica alle celle in A1: D10. Sei sicuro di volerlo?", vbYesNo) End If If Ans = vbNo Then Application.EnableEvents = False Application.Undo Application.EnableEvents = True End If End Sub
Nel codice sopra, proprio sopra la riga Application.Undo, abbiamo usato - Application.EnableEvents = False.
L'impostazione di EnableEvents su False non attiverebbe alcun evento (nella cartella di lavoro corrente o aperta).
Una volta completata l'operazione di annullamento, possiamo riportare la proprietà EnableEvents a True.
Tieni presente che la disattivazione degli eventi influisce su tutte le cartelle di lavoro attualmente aperte (o aperte mentre EnableEvents è impostato su False). Ad esempio, come parte del codice, se apri una nuova cartella di lavoro, l'evento Workbook Open non funzionerà.
Impatto degli eventi Annulla stack
Lascia che ti dica prima che cos'è uno stack di annullamento.
Quando lavori in Excel, continua a monitorare le tue azioni. Quando commetti un errore, puoi sempre utilizzare Ctrl + Z per tornare al passaggio precedente (ad esempio, annullare l'azione corrente).
Se premi Control + Z due volte, tornerai indietro di due passaggi. Questi passaggi che hai eseguito vengono memorizzati come parte dello stack di annullamento.
Qualsiasi evento che modifica il foglio di lavoro distrugge questo stack di annullamento.Ciò significa che se ho fatto 5 cose prima di attivare un evento, non sarò in grado di utilizzare Control + Z per tornare ai passaggi precedenti. L'attivazione dell'evento ha distrutto quello stack per me.
Nel codice seguente, utilizzo VBA per inserire il timestamp nella cella A1 ogni volta che si verifica una modifica nel foglio di lavoro.
Private Sub Worksheet_Change(ByVal Target As Range) Application.EnableEvents = False Range("A1").Value = Format(Now, "dd-mmm-yyyy hh:mm:ss") Application.EnableEvents = True End Sub
Poiché sto apportando una modifica al foglio di lavoro, ciò distruggerà lo stack di annullamento.
Inoltre, tieni presente che questo non è limitato solo agli eventi.
Se si dispone di un codice memorizzato nel normale modulo VBA e si apporta una modifica nel foglio di lavoro, si distruggerebbe anche lo stack di annullamento in Excel.
Ad esempio, il codice seguente immette semplicemente il testo "Ciao" nella cella A1, ma anche l'esecuzione distruggerebbe lo stack di annullamento.
Sub TypeHello() Range("A1").Value = "Hello" End Sub
Potrebbero piacerti anche i seguenti tutorial VBA di Excel:
- Lavorare con celle e intervalli in Excel VBA.
- Lavorare con i fogli di lavoro in Excel VBA.
- Lavorare con le cartelle di lavoro in Excel VBA.
- Cicli VBA di Excel: la guida definitiva.
- Utilizzo dell'istruzione IF Then Else in Excel VBA.
- Per il ciclo successivo in Excel.
- Creazione di funzioni definite dall'utente in Excel VBA.
- Come creare e utilizzare componenti aggiuntivi in Excel.
- Crea e riutilizza le macro salvandole nella cartella di lavoro delle macro personali.