Sfruttare gli Eventi per posizionare le istruzioni.   (24/04/03 - modificato 25/10/2010)

Davo per scontato che tutti i pellegrini che usano il vba, avessero sufficientemente chiaro che cos'è un evento e come sfruttarlo, ma dalle numerose richieste che mi giungono, mi pare utile cercare di fare un pò più di chiarezza, se ci riesco.

Premesso che coloro che si avvicinano al vba, o sono dei mostri e gli basta leggere un esempio per capire sia vba sia implicazioni o farebbero meglio a decidere di munirsi di guide e/o di libri specifici sull'argomento "Excel e il suo VBA" o similari (vedi anche la sezione Libri & links" in questo sito). Qualche cosina però lo si può leggere anche su questo sito, in questa sottosezione "VBA: informazioni generali" contenuta nella pagina "Articoli VBA".

Consiglio sinceramente ai neofiti di prendere visione degli articoli di questa sottosezione, gli articoli non sono "pesanti" ma servono a dare un'idea ed un aiuto iniziale.

Intanto il mondo di Excel è diviso in due parti che convivono insieme: il mondo dei fogli di lavoro e il mondo del VBA; in entrambi i mondi esistono "Oggetti" e/o "Insiemi di Oggetti" che possiamo usare, sfruttare, adoperare; sono "Oggetti" lo stesso Excel (Application), la stessa cartella di lavoro (il file .xls), i fogli, le celle, gli "Shapes" (o Forme, compresi quelli presenti nella Casella dei "Moduli"), ed entrando nel mondo del VBA, tutti gli "Oggetti" detti anche "Controlli  ActiveX" o più semplicemente "Controlli", inseribili a partire dalle UserForm, fino ai "Controlli ActiveX" presenti nella "Casella degli Strumenti", (che troviamo sia nell'Editor del VisualBasic sia sul foglio di lavoro), e molti altri "Controlli ActiveX" costruiti da progettisti esterni e inseribili a piacere.

In comune molti di questi "Oggetti" hanno delle "Proprietà" e tutti possiedono degli "EVENTI" :

Cosa è un EVENTO ?:

Per "EVENTO" si intende un "AZIONE" che si può compiere su o con un "Oggetto" per ATTIVARE,  lanciare, delle istruzioni associate all'EVENTO dell'"Oggetto" stesso. L'EVENTO si può verificare per nostra azione diretta (come la pressione su un pulsante (es.: evento Click di un CommandButton_Click)), o in conseguenza di azioni indirette che compiamo noi sul foglio o sulla cartella di lavoro (come la selezione di un foglio di lavoro (es.: evento Worksheet_Activate)).oppure l'EVENTO Worksheet_SelectionChange che si verifica quando selezioniamo una qualsiasi cella di un foglio di lavoro, o ancora l'EVENTO "Worksheet_Change" che si verifica ogni volta che modifichiamo il contenuto di una cella. Gli EVENTI non sono uguali per tutti gli Oggetti; ogni Oggetto possiede eventi propri, non necessariamente simili ad altri Oggetti. (leggete l'articolo "Editor di Visual Basic" per visualizzare immagini su come si presenta la parte contenente gli EVENTI di un Oggetto)

Se per esempio, abbiamo realizzato una istruzione (una macro, appunto) e desideriamo che questa macro venga lanciata tutte le volte che una cella di un determinato foglio subisce un cambiamento, sfrutteremo l'evento Worksheet_Change di quel foglio per lanciare la macro, così: (MiaMacro è il nome di una macro da lanciare)

  • Private Sub Worksheet_Change(ByVal Target As Range) 
    MiaMacro
    End Sub

Se invece il cambiamento del valore di una cella non avviene perchè abbiamo manualmente scritto nella cella, ma per effetto di una formula contenuta in quella o altra cella, Excel non si accorge del cambiamento e non attiva l'evento Change, e non agisce quindi lanciando una determinata macro; in questo caso dobbiamo sfruttare un ulteriore evento della Cartella di lavoro (il WorkBook), cioè l'evento "SheetCalculate" che si verifica dopo che è stato ricalcolato un qualsiasi foglio di lavoro; quindi useremo anche questo EVENTO, così:

  • Private Sub Workbook_SheetCalculate(ByVal Sh As Object)
    Application.CalculateFull
    End Sub

questo EVENTO lancia la relativa istruzione Application.CalculateFull  e permette ad Excel di "accorgersi" che in un foglio è avvenuto una cambiamento per un ricalcolo da formule e permette quindi di "attivare" l'EVENTO Worksheet_Change che lancerà la macro richiesta. Chiaro?? spero di si.

Se desiderate visualizzare un breve tutorial sul come usare un evento, cliccate qui : Video_Tutorial_Evento_Change

L'oggetto Workbook (Cartella di lavoro) per esempio possiede l'evento Open, che altri oggetti non hanno, e che, indipendentemente dalla nostra volontà, si verifica tutte le volte che in Excel apriamo una cartella di lavoro. Potremo per esempio sfruttare questo evento inserendo istruzioni vba, per far apparire un messaggio di saluto, o lanciare una macro, far aprire una UserForm, ecc., tutte le volte che apriremo la cartella (o file .xls che dir si voglia). Come? ma semplicemente inserendo l'istruzione, tramite l'editor di visual basic, nell'apposita (modulo del workbook) pagina. (vedere, su questa sezione, "Editor di Visual Basic", dove ci sono foto che illustrano le spiegazioni.)

L'oggetto WorkSheet (Foglio di lavoro) non possiede l'evento Open, ma l'evento Activate, che NON si verifica quando si apre la cartella di lavoro ma SOLO quando si attiva un Foglio, selezionandolo, oppure l'evento Change che si verifica ogni volta che modifichiamo il contenuto di una cella, o ancora l'evento Calculate, che si verifica tutte le volte che cambia il valore di una cella contenente una formula (quindi il "cambiamento" avviene Non per nostra azione ma come risultato della formula stessa), ed altri eventi.

E' necessario quindi che ogni pellegrino, si documenti sul significato di ogni evento, per capire come sfruttarlo e con quale sequenza si verifica rispetto ad un'altro evento dello stesso Oggetto. In genere, nella finestrina degli Eventi, gli stessi sono elencati in ordine di sequenza. Rifacendoci al WorkSheet, è evidente che l'evento Deactivate (cioè quando il foglio perde lo stato attivo, per es. perchè si seleziona un'altro foglio) si verifica sempre DOPO che si è verificato l'evento Activate, ed infatti nel menù degli eventi appare dopo. Non è questa la sede per elencare tutti gli Eventi di tutti gli Oggetti. La Guida in linea del visual basic è sufficientemente documentata : basta scrivere nella finestra "Indice" della guida, la parola "Events", e nella finestra 3 "Selezionare un argomento" troverete l'elenco di tutti gli eventi, singoli, o raggruppati per oggetti.

Suggerisco quindi, anzichè scrivere a me per domande generiche sugli eventi, di munirsi della necessaria pazienza e di andare a leggersi la guida, che almeno su questi argomenti è chiara e ben fatta. Questo sotto è l'esempio tratto dalla guida, e che riguarda l'evento Change del WorkSheet

Evento Change

Si verifica quando celle del foglio di lavoro sono modificate dall'utente

Private Sub Worksheet_Change(ByVal Target As Range)

Target   Specifica l'intervallo modificato. Può essere costituito da più di una cella.

Osservazioni

Questo evento non si verifica quando i valori contenuti nelle celle cambiano durante una fase di ricalcolo. Utilizzare l'evento Calcola per intercettare un nuovo calcolo nel foglio.

Esempio

Questo esempio modifica il colore delle celle modificate (le celle Target) su blu.

Private Sub Worksheet_Change(ByVal Target as Range)
    Target.Font.ColorIndex = 5
End Sub

Come vedete, l'esempio è più che chiaro. Basta leggere.....

 

Buon lavoro.


prelevato sul sito http://ennius.interfree.it