Eventi VBA di Excel

Gli eventi si verificano continuamente quando un utente apre una cartella di lavoro di Excel e inizia a eseguire varie azioni come l'immissione di dati nelle celle o lo spostamento tra i fogli

All'interno dell'editor di Visual Basic (ALT+F11), sono già impostate sottoroutine che possono essere attivate quando l'utente fa qualcosa, ad es. immissione di dati in una cella. La subroutine non fornisce alcun codice di azione, solo un'istruzione "Sub" e un'istruzione "End Sub" senza alcun codice tra di loro. Sono effettivamente dormienti, quindi non succede nulla finché non inserisci un codice.

Ecco un esempio basato sull'evento "Cambia" in un foglio di lavoro:

In qualità di programmatore VBA, puoi aggiungere del codice per far accadere determinate cose quando l'utente esegue un'azione specifica. Questo ti dà la possibilità di controllare l'utente e di impedire che intraprenda azioni che non vuoi che facciano e che potrebbero danneggiare la tua cartella di lavoro. Ad esempio, potresti desiderare che salvino la propria copia individuale della cartella di lavoro con un altro nome, in modo che non influiscano sull'originale, che potrebbe essere utilizzato da un numero di utenti.

Se chiudono la cartella di lavoro, verrà automaticamente richiesto di salvare le modifiche. Tuttavia, la cartella di lavoro ha un evento "Prima di chiudere" ed è possibile inserire il codice per impedire che la cartella di lavoro venga chiusa e venga attivato un evento "Salva". Puoi quindi aggiungere un pulsante al foglio di lavoro stesso e inserire la tua routine "Salva" su di esso. Puoi anche disabilitare la routine "Salva" utilizzando l'evento "Prima di salvare"

La comprensione di come funzionano gli eventi è assolutamente essenziale per un programmatore VBA.

Tipi di eventi

cartella di lavoro Eventi - questi eventi vengono attivati ​​in base a ciò che l'utente fa con la cartella di lavoro stessa. Includono azioni dell'utente come l'apertura della cartella di lavoro, la chiusura della cartella di lavoro, il salvataggio della cartella di lavoro, l'aggiunta o l'eliminazione di un foglio

Foglio di lavoro Eventi - questi eventi vengono attivati ​​da un utente che esegue azioni su un foglio di lavoro specifico. Ogni foglio di lavoro all'interno della cartella di lavoro ha un modulo di codice individuale, che contiene vari eventi specifici per quel foglio di lavoro (non per tutti i fogli di lavoro). Questi includono azioni dell'utente come modificare il contenuto di una cella, fare doppio clic su una cella o fare clic con il pulsante destro del mouse su una cella.

Eventi di controllo Active X - I controlli Active X possono essere aggiunti a un foglio di lavoro utilizzando l'icona "Inserisci" nella scheda "Sviluppatore" nella barra multifunzione di Excel. Si tratta spesso di pulsanti per consentire all'utente di eseguire varie azioni sotto il controllo del codice, ma possono anche essere oggetti come menu a discesa. L'utilizzo dei controlli Active X rispetto ai controlli Form nel foglio di lavoro offre un ampio margine di programmabilità. I controlli Active X offrono molta più flessibilità dal punto di vista della programmazione rispetto all'utilizzo dei controlli del modulo in un foglio di lavoro.

Ad esempio, potresti avere due controlli a discesa nel foglio di lavoro. Vuoi che l'elenco disponibile nel secondo menu a discesa sia basato su ciò che l'utente ha scelto nel primo menu a discesa. Utilizzando l'evento "Cambia" nel primo menu a discesa, puoi creare codice per leggere ciò che l'utente ha selezionato e quindi aggiornare il secondo menu a discesa. Puoi anche disattivare il secondo menu a discesa finché l'utente non ha effettuato una selezione nel primo menu a discesa

Eventi Form utente - È possibile inserire e progettare un modulo dall'aspetto professionale da utilizzare come pop-up. Tutti i controlli che inserisci nel modulo sono controlli Active X e hanno gli stessi eventi dei controlli Active X che potresti inserire in un foglio di lavoro

Eventi del grafico - Questi eventi sono correlati solo a un foglio grafico e non a un grafico che appare come parte di un foglio di lavoro. Questi eventi includono il ridimensionamento del grafico o la selezione del grafico.

Eventi applicativi - Questi usano l'oggetto Application in VBA. Gli esempi consentirebbero di attivare il codice quando viene premuto un determinato tasto o quando viene raggiunto un certo tempo. Potresti programmare una situazione in cui la cartella di lavoro viene lasciata aperta 24 ore su 24, 7 giorni su 7 e importa i dati da una fonte esterna durante la notte a un'ora predeterminata.

Pericoli derivanti dall'utilizzo del codice negli eventi

Quando scrivi codice per fare qualcosa quando l'utente esegue una determinata azione, devi tenere presente che il tuo codice potrebbe attivare altri eventi, che potrebbero mettere il tuo codice in un ciclo continuo.

Ad esempio, supponiamo di utilizzare l'evento "Modifica" su un foglio di lavoro in modo che quando l'utente inserisce un valore in una cella, un calcolo basato su quella cella viene inserito nella cella immediatamente a destra di essa.

Il problema qui è che l'inserimento del valore calcolato nella cella attiva un altro evento "Cambia", che a sua volta attiva un altro evento "Cambia", e così via fino a quando il codice non ha esaurito le colonne da utilizzare e genera un messaggio di errore.

Devi riflettere attentamente quando scrivi il codice per l'evento per assicurarti che altri eventi non vengano attivati ​​inavvertitamente

Disattiva eventi

È possibile utilizzare il codice per disabilitare gli eventi per aggirare questo problema. Quello che dovrai fare è incorporare il codice per disabilitare gli eventi mentre il tuo codice evento è in esecuzione e quindi riattivare gli eventi alla fine del codice. Ecco un esempio di come farlo:

1234 Sub DisabilitaEventi()Application.EnableEvents = FalseApplication.EnableEvents = TrueFine sottotitolo

Tieni presente che questo disabilita tutti gli eventi direttamente nell'applicazione Excel, quindi ciò influenzerebbe anche altre funzioni all'interno di Excel. Se lo usi per qualsiasi motivo, assicurati che gli eventi vengano riattivati ​​in seguito.

Importanza dei parametri negli eventi

Gli eventi di solito hanno parametri che puoi usare per saperne di più su cosa sta facendo l'utente e sulla posizione della cella in cui si trova.

Ad esempio, l'evento di modifica del foglio di lavoro ha il seguente aspetto:

1 Private Sub Worksheet_Change (ByVal Target As Range)

Utilizzando l'oggetto range, puoi scoprire le coordinate di riga/colonna della cella in cui si trova effettivamente l'utente.

1234 Private Sub Worksheet_Change (ByVal Target As Range)MsgBox Target.ColumnMsgBox Target.RowFine sottotitolo

Se vuoi che il tuo codice funzioni solo su una determinata colonna o numero di riga, aggiungi una condizione che esce dalla subroutine se la colonna non è quella richiesta.

123 Private Sub Worksheet_Change (ByVal Target As Range)Se Target.Column 2 Quindi esci da SubFine sottotitolo

Questo aggira il problema del tuo codice che attiva più eventi, poiché funzionerà solo se l'utente ha modificato una cella nella colonna 2 (colonna B)

Esempi di eventi della cartella di lavoro (non esaustivi)

Gli eventi della cartella di lavoro si trovano sotto l'oggetto "ThisWorkbook" in VBE Project Explorer. Dovrai selezionare "Cartella di lavoro" nel primo menu a discesa nella finestra del codice, quindi il secondo menu a discesa ti mostrerà tutti gli eventi disponibili

Evento aperto cartella di lavoro

Questo evento viene generato ogni volta che la cartella di lavoro viene aperta da un utente. Potresti usarlo per inviare un messaggio di benvenuto a un utente catturando il suo nome utente

123 Cartella di lavoro secondaria privata_Apri()MsgBox "Benvenuto " & Application.UserNameFine sottotitolo

Puoi anche controllare il loro nome utente rispetto a un elenco tenuto su un foglio nascosto per vedere se sono autorizzati ad accedere alla cartella di lavoro. Se non sono utenti autorizzati, puoi visualizzare un messaggio e chiudere la cartella di lavoro in modo che non possano utilizzarla.

Evento nuovo foglio cartella di lavoro

Questo evento viene attivato quando un utente aggiunge un nuovo foglio alla cartella di lavoro

Puoi usare questo codice solo per consentire a te stesso di aggiungere un nuovo foglio, piuttosto che avere utenti diversi che aggiungono tutti fogli e creano confusione nella cartella di lavoro

1234567 Cartella di lavoro secondaria privata_NewSheet (ByVal Sh come oggetto)Application.DisplayAlerts = FalseSe Application.UserName "Richard" ThenSh.EliminaFinisci seApplication.DisplayAlerts = TrueFine sottotitolo

Tieni presente che è necessario disattivare gli avvisi poiché verrà visualizzato un avviso utente quando il foglio viene eliminato che consente all'utente di aggirare il codice. Assicurati di riattivare gli avvisi in seguito!

Stanco di cercare esempi di codice VBA? Prova AutoMacro!

Cartella di lavoro prima di salvare l'evento

Questo evento viene attivato quando l'utente fa clic sull'icona "Salva", ma prima che il "Salva" abbia effettivamente luogo

Come descritto in precedenza, potresti voler impedire agli utenti di salvare le modifiche nella cartella di lavoro originale e costringerli a creare una nuova versione utilizzando un pulsante nel foglio di lavoro. Tutto ciò che devi fare è modificare il parametro "Annulla" su True e la cartella di lavoro non potrà mai essere salvata con il metodo convenzionale.

123 Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)Annulla = VeroFine sottotitolo

Cartella di lavoro prima della chiusura dell'evento

È possibile utilizzare questo evento per impedire agli utenti di chiudere la cartella di lavoro e forzarli nuovamente a uscire tramite un pulsante del foglio di lavoro. Ancora una volta, imposti il ​​parametro "Annulla" su "Vero". La X rossa nell'angolo in alto a destra della finestra di Excel non funziona più.

123 Cartella di lavoro secondaria privata_BeforeClose (Annulla come booleano)Annulla = VeroFine sottotitolo

Esempi di eventi del foglio di lavoro (non esaustivo)

Gli eventi del foglio di lavoro si trovano sotto l'oggetto nome foglio specifico in VBE Project Explorer. Dovrai selezionare "Foglio di lavoro" nel primo menu a discesa nella finestra del codice e quindi il secondo menu a discesa ti mostrerà tutti gli eventi disponibili

Evento di modifica del foglio di lavoro

Questo evento viene attivato quando un utente apporta una modifica a un foglio di lavoro, ad esempio inserendo un nuovo valore in una cella

È possibile utilizzare questo evento per inserire un valore o un commento aggiuntivo accanto alla cella modificata, ma come discusso in precedenza, non si desidera avviare un ciclo di eventi.

12345 Private Sub Worksheet_Change (ByVal Target As Range)Se Target.Column 2 Quindi esci da SubActiveSheet.Cells(Target.Row, Target.Column + 1). Valore = _ActiveSheet.Cells(Target.Row, Target.Column). Valore * 1.1Fine sottotitolo

In questo esempio, il codice funzionerà solo se il valore viene immesso nella colonna B (colonna 2). Se questo è vero, aggiungerà il 10% al numero e lo posizionerà nella successiva cella disponibile

Foglio di lavoro prima dell'evento doppio clic

Questo evento scatterà il codice se un utente fa doppio clic su una cella. Questo può essere estremamente utile per rapporti finanziari come un bilancio o un conto profitti e perdite in cui è probabile che i numeri vengano contestati dai gestori, specialmente se la linea di fondo è negativa!

Puoi usarlo per fornire una funzione di approfondimento, in modo che quando il manager sfida un determinato numero, tutto ciò che deve fare è fare doppio clic sul numero e la suddivisione appare come parte del rapporto.

Questo è molto impressionante dal punto di vista di un utente e li salva chiedendo costantemente "perché questo numero è così alto?"

Dovresti scrivere il codice per scoprire l'intestazione / i criteri per il numero (usando le proprietà dell'oggetto di destinazione) e quindi filtrare i dati tabulari e quindi copiarli nel report.

Programmazione VBA | Il generatore di codice funziona per te!

Foglio di lavoro Attiva evento

Questo evento si verifica quando l'utente si sposta da un foglio all'altro. Si applica al nuovo foglio in cui l'utente si sta spostando.

Potrebbe essere utilizzato per garantire che il nuovo foglio sia completamente calcolato prima che l'utente inizi a fare qualcosa su di esso. Può anche essere utilizzato per ricalcolare solo quel particolare foglio senza ricalcolare l'intera cartella di lavoro. Se la cartella di lavoro è grande e contiene una formula complicata, il ricalcolo di un foglio consente di risparmiare molto tempo

123 Foglio di lavoro secondario privato_Activate()ActiveSheet.CalculateFine sottotitolo

Eventi di controllo Active X (non esaustivo)

Come discusso in precedenza, puoi aggiungere i controlli Active X direttamente su un foglio di lavoro. Questi possono essere pulsanti di comando, menu a discesa e caselle di riepilogo

Gli eventi Active X si trovano sotto l'oggetto nome foglio specifico (dove è stato aggiunto il controllo) in Esplora progetti VBE. Dovrai selezionare il nome del controllo Active X nel primo menu a discesa nella finestra del codice e poi il secondo menu a discesa ti mostrerà tutti gli eventi disponibili

Pulsante di comando Fare clic su Evento

Quando hai inserito un pulsante di comando su un foglio di calcolo, vorrai che esegua un'azione. Puoi farlo inserendo il codice sull'evento Click.

Puoi facilmente inserire un messaggio "Sei sicuro?" su questo in modo che venga effettuato un controllo prima dell'esecuzione del codice

12345 Sub CommandButton privato1_Click ()Pulsante DimRet come varianteButtonRet = MsgBox("Sei sicuro di volerlo fare?", vbQuestion Or vbYesNo)Se ButtonRet = vbNo, quindi esci da SubFine sottotitolo

Evento di modifica a discesa (casella combinata)

Un elenco a discesa Active X ha un evento di modifica, in modo che se un utente seleziona un particolare elemento dall'elenco a discesa, è possibile acquisire la propria scelta utilizzando questo evento e quindi scrivere il codice per adattare di conseguenza altre parti del foglio o della cartella di lavoro.

123 Sub ComboBox1_Change privato ()MsgBox "Hai selezionato " & ComboBox1.TextFine sottotitolo

Programmazione VBA | Il generatore di codice funziona per te!

Casella di controllo (casella di controllo) Fare clic su Evento

È possibile aggiungere un segno di spunta o una casella di controllo a un foglio di lavoro in modo da fornire scelte di opzioni per l'utente. Puoi utilizzare l'evento click su di esso per vedere se l'utente ha modificato qualcosa al riguardo. I valori restituiti sono True o False a seconda che sia stato selezionato o meno.

123 CheckBox secondario privato1_Click ()MsgBox CheckBox1.ValueFine sottotitolo

Eventi UserForm (non esaustivi)

Excel ti offre la possibilità di progettare i tuoi moduli. Questi possono essere molto utili da utilizzare come pop-up per raccogliere informazioni o per fornire scelte multiple all'utente. Usano i controlli Active X come descritto in precedenza e hanno esattamente gli stessi eventi, sebbene gli eventi dipendano molto dal tipo di controllo.

Ecco un esempio di un semplice modulo:

Quando viene visualizzato, ecco come appare sullo schermo

Utilizzerai gli eventi nel modulo per eseguire operazioni come inserire un nome di società predefinito quando il modulo viene aperto, per verificare che l'input del nome della società corrisponda a quello già presente nel foglio di calcolo e non sia stato scritto in modo errato e per aggiungere codice al clic eventi sui pulsanti 'OK' e 'Annulla'

Il codice e gli eventi dietro il modulo possono essere visualizzati facendo doppio clic in qualsiasi punto del modulo

Il primo menu a discesa consente di accedere a tutti i controlli del modulo. Il secondo menu a discesa darà accesso agli eventi

Evento di attivazione modulo utente

Questo evento viene attivato quando il modulo viene attivato, normalmente quando viene visualizzato. Questo evento può essere utilizzato per impostare i valori predefiniti, ad es. un nome di società predefinito nella casella di testo del nome della società

123 Modulo utente secondario privato_Activate()TextBox1.Text = "Nome della mia azienda"Fine sottotitolo

Programmazione VBA | Il generatore di codice funziona per te!

Modifica evento

La maggior parte dei controlli sul modulo ha un evento di modifica, ma in questo esempio, la casella di testo del nome della società può utilizzare l'evento per porre una restrizione sulla lunghezza del nome della società da inserire

123456 Sub TextBox1_Change privato ()Se Len (TextBox1.Text) > 20 AlloraMsgBox "Il nome è limitato a 20 caratteri", vbCriticalTextBox1.Text = ""Finisci seFine sottotitolo

Fare clic su Evento

Puoi utilizzare questo evento per eseguire un'azione dall'utente facendo clic sui controlli nel modulo o anche sul modulo stesso

In questo modulo è presente un pulsante "OK" e, dopo aver raccolto il nome di un'azienda, vorremmo inserirlo in una cella del foglio di calcolo per riferimento futuro

1234 Sub CommandButton privato1_Click ()ActiveSheet.Range("A1"). Valore = TextBox1.TextIo.NascondiFine sottotitolo

Questo codice agisce quando l'utente fa clic sul pulsante "OK". Mette il valore nella casella di input del nome della società nella cella A1 sul foglio attivo e quindi nasconde il modulo in modo che il controllo dell'utente venga restituito al foglio di lavoro.

Eventi del grafico

Gli eventi del grafico funzionano solo su grafici che si trovano su un foglio grafico separato e non su un grafico incorporato in un foglio di lavoro standard

Gli eventi del grafico sono in qualche modo limitati e non possono essere utilizzati in un foglio di lavoro in cui potresti avere più grafici. Inoltre, gli utenti non vogliono necessariamente passare da un foglio di lavoro contenente numeri a un foglio grafico: qui non c'è un impatto visivo immediato

L'evento più utile sarebbe scoprire il componente di un grafico su cui un utente ha cliccato, ad es. un segmento in un grafico a torta o una barra in un grafico a barre, ma questo non è un evento disponibile nell'intervallo standard di eventi.

Questo problema può essere risolto utilizzando un modulo di classe per aggiungere un evento "Mouse Down" che restituirà i dettagli del componente del grafico su cui l'utente ha fatto clic. Viene utilizzato su un grafico all'interno di un foglio di lavoro.

Ciò comporta una codifica molto complicata, ma i risultati sono spettacolari. È possibile creare drill down, ad es. l'utente fa clic su un segmento del grafico a torta e immediatamente quel grafico viene nascosto e al suo posto viene visualizzato un secondo grafico che mostra un grafico a torta di dettaglio per il segmento originale, oppure è possibile produrre i dati tabulari che supportano quel segmento del grafico a torta.

Eventi applicativi

È possibile utilizzare l'oggetto Application in VBA per attivare il codice in base a un particolare evento

Programmazione VBA | Il generatore di codice funziona per te!

Applicazione.OnTime

Ciò può consentire di attivare una parte di codice a intervalli regolari finché la cartella di lavoro viene caricata in Excel. Potresti voler salvare automaticamente la cartella di lavoro in una cartella diversa ogni 10 minuti o lasciare il foglio di lavoro in esecuzione durante la notte in modo da importare i dati più recenti da una fonte esterna.

In questo esempio, viene inserita una sottoroutine in un modulo. Visualizza una finestra di messaggio ogni 5 minuti, anche se questa potrebbe essere facilmente un'altra procedura codificata. Allo stesso tempo, reimposta il timer sull'ora corrente più altri 5 minuti.

Ogni volta che viene eseguito, il timer si reimposta per eseguire la stessa sottoroutine in altri 5 minuti.

1234 Sub TestOnTime()MsgBox "Test in tempo"Application.OnTime (Now() + TimeValue("00:05:00")), "TestOnTime"Fine sottotitolo

Applicazione.OnKey

Questa funzione consente di progettare i propri tasti di scelta rapida. Puoi fare in modo che qualsiasi combinazione di tasti chiami una sottoroutine della tua creazione.

In questo esempio la lettera "a" viene reindirizzata in modo che invece di inserire una "a" in una cella, verrà visualizzata una finestra di messaggio. Questo codice deve essere inserito in un modulo inserito.

123456 Sub TestKeyPress()Application.OnKey "a", "TestKeyPress"Fine sottotitoloSub TestKeyPress()MsgBox "Hai premuto 'a'"Fine sottotitolo

Esegui prima di tutto la sottoroutine "TestKeyPress". Devi eseguirlo solo una volta. Dice a Excel che ogni volta che viene premuta la lettera "a" chiamerà la sottoroutine "TestKeyPress". La sottoroutine "TestKeyPress" visualizza solo una finestra di messaggio per dirti che hai premuto il tasto "a". Potrebbe ovviamente caricare un modulo o fare ogni sorta di altre cose.

Puoi utilizzare qualsiasi combinazione di tasti che puoi utilizzare con la funzione "SendKeys"

Per annullare questa funzionalità, esegui l'istruzione "OnKey" senza il parametro "Procedura".

123 Sub CancelOnKey()Applicazione.OnKey "a"Fine sottotitolo

Tutto ora è tornato alla normalità.

wave wave wave wave wave