Paolo Guccini

"Impossibile" non è mai la risposta giusta

Macro per Excel
come gestire i valori e le modiche apportate dall'utente
ai valori delle celle
con Worksheet_Change()

Descrizione

Viene descritto come creare una macro che viene automaticamente eseguita ogni volta che l'utente di Excel modifica una cella.
Diventa cosi' possibile controllare i valori inseriti, le celle sulle quali può operare e quali operazioni consentire.

Procedimento

Sono disponibili due modi

  • Da Excel
    • Da Excel, sulla linguetta del foglio, fare clic con il tasto esterno del mouse per aprire il menu contestuale
    • fare clic sulla voce 'visualizza codice'
  • Dalla finestra Microsoft Visual Basic, Application Edition
    • Accedere al riquadro 'Progetto -VBA Project' (se non fosse visibile, attivarlo mediante il menu Visualizza, Gestione progetti) oppure con i tasti Ctrl+R
    • individuare il foglio desiderato nell'elenco
    • fare un doppio clic sul nome del foglio per aprire un riquadro in cui sarà possibile digitare la macro; tale riquadro avra' nome composto dal nome cartella e nome del foglio;
      per esempio Cartel1 - Foglio1 (codice)

Ora si deve creare la dichiarazione della macro

  • nella parte superiore del riquadro 'Progetto -VBA Project' è presente una lista a discesa contenente, inizialmente, il valore 'Generale': selezionare la voce 'worksheet'
  • alla destra è visibile un altro elenco a discesa il cui contenuto sarà stato aggiornato avendo agito sulla casella precedente
  • nella lista di destra, selezionare la voce Change: ciò causerà l'inserimento automatico di una nuova funzione nel riquadro; al suo interno andrà scritto il codice della macro.

Come scrivere la macro

Quando l'utente modifica una cella, viene eseguita la macro.
Essa riceve un parametro di nome 'Target' (il nome è convenzional, quindi modificabile a piacimento) che pemette di conoscere il valore e l'indirizzo della cella (o delle celle) modificate; Per esempio, la seguente funzione verifica se la cella modificata è all'interno dell'intervallo A1:A5

  • Se è al di fuori lo seguala con una MsgBox che visualizza il nuovo valore della cella (Target.Value) e il suo indirizzo (Target.Address)
  • Se è all'interno dell'intervallo, provvede a trasformare il valore in maiuscolo e a visualizzare il nuovo valore della cella e il suo indirizzo

Nota importante

Excel esegue automaticamente la funzione Worksheet_Change() ogni volta che viene modificato il foglio a cui essa appartiene. In programmazione ricade nella gestione degli eventi.
Nell'esempio, l'istruzione Target.Value = UCase(Target.Value) modifica il valore della cella convertendone il contenuto in maiuscolo.
Cio corrisponde ad un'ulteriore modifica che Excel gestirà esattamente come fosse stata fatta dall'utente, quindi eseguirà nuovamente la funzione Worksheet_Change() causando un ciclo che viene ripetuto 50 "solo" volte (grazie ad un sistema di controllo che Excel VBA 7.0 effettua, altrimenti il ciclo diverrebbe infinito, bloccando di fatto Excel e la macro che continuerebbe a eseguire se stessa).
Inoltre, tale modifica di valore che avviene all'interno della funzione, può attivare altre funzioni che sono state previste per gestire eventi di modifica del foglio.
Per evitare indesiderate chiamate ad altre funzioni (gestori di eventi), si utilizzare l'istruzione
Application.EnableEvents = False
Ovviamente, al termine della funzione Worksheet_Change() sarà indispensabile riattivare la gestione degli eventi mediante l'istruzione
Application.EnableEvents = True
Altrimenti, non essendo attiva la gestione degli eventi, neppure Worksheet_Change() verrà piu eseguita.