Esecuzione automatica di procedure

Transcript

Esecuzione automatica di procedure
Uso di Excel
Esecuzione automatica di procedure
Prof. Ettore Limoli
Registrazione di MACRO
Per automatizzare alcune azioni ripetitive in Excel è possibile attivare la registrazione di MACRO. Inserendo
il comando SVILUPPO – REGISTRA MACRO si attiva la seguente finestra di dialogo
Questa ci consente di assegnare un nome alla macro, la cartella di destinazione e una breve descrizione che
potrà servirci da promemoria.
Premendo [OK] si avvia il registratore di MACRO che trasformerà ogni nostra azione in una procedura VBA.
Tramite il comando SVILUPPO – INTERROMPI REGISTRAZIONE si fermerà la registrazione.
Supponiamo che la nostra azione sia stata la selezione di un certo intervallo di celle (Range) e la sua
cancellazione. In VBA troveremo scritta la seguente procedura:
Sub Pulisci()
'
' Pulisci Macro
'
Range("B6:C25").Select
Selection.ClearContents
Range("F3").Select
End Sub
L’azione da noi compiuta è stata:



la selezione dell’intervallo (Range) di celle “B6:C25”;
la cancellazione del Range selezionato;
il posizionamento del cursore sulla cella “F3” per renderla attiva.
È possibile modificare questa procedura aggiungendo nuove azioni scritte direttamente.
1
Ad esempio, aggiungiamo la cancellazione della cella [D3]. Il comando può essere molto semplice:
[D3] = “”
Al contenuto della cella [D3] è assegnata una stringa vuota “”.
Esecuzione delle procedure
Per eseguire le procedure occorre usare il comando SVILUPPO – MACRO che apre la finestra di dialogo
Questa ci consente di selezionare la macro desiderata e mandarla in esecuzione tramite il pulsante
[ Esegui ].
In figura sono presenti i nomi delle procedure che illustreremo nel capitolo seguente.
Un progetto di esempio
Ci proponiamo di realizzare delle procedure che ci consentano di immettere e calcolare i valori di un
polinomio tramite l’algoritmo di Ruffini-Horner.
Su questo sito è possibile consultare una apposita lezione online che illustra l’algoritmo: Calcolo dei valori di
un polinomio. [ Vedi ]
Il foglio viene preparato in questo modo:
Le procedure di calcolo vengono poste, ad esempio, nel “Modulo 1” generato in VBA tramite il comando
dell’editor INSERISCI - MODULO o creato automaticamente attivando la registrazione di una macro.
2
Le procedure sono:
Sub Pulisci()
'
' Pulisci Macro
'
[D3] = ""
Range("B6:C25").Select
Selection.ClearContents
Range("F3").Select
End Sub
Sub Coefficienti()
'
' Coefficienti Macro
'
Dim N As Integer, i As Integer
Dim c As String
Pulisci
N = [B3]
For i = 0 To N
c = "B" + Format(i + 6)
Range(c).Select
ActiveCell.Value = "x^" + Format(N - i) + " = "
Next i
‘assegna a c il nome della cella
‘seleziona la cella
‘assegna alla cella l’etichetta da visualizzare
Range("C6").Select
‘pone il cursore sulla cella [C6]
End Sub
Sub Calcola()
'
' Legge i coefficienti e calcola il valore del polinomio
'
Dim N As Integer, i As Integer
Dim c As String
Dim A() As Double
Dim x As Double
Dim P As Double
‘dimensiona genericamente l’array dei coefficienti
N = [B3]
ReDim A(N) As Double
‘legge il valore di N dalla cella [B3]
‘ Ridimensiona l’array dei coefficienti
For i = 0 To N
c = "C" + Format(i + 6)
‘crea la striga contenente l’indirizzo del Range
3
Range(c).Select
A(i) = ActiveCell.Value
Next i
‘seleziona il Range
‘Assegna il valore all’elemento i dell’array
'Algoritmo di Ruffini-Horner
x = [C3]
P = A(0)
For i = 1 To N
P = P * x + A(i)
Next i
[D3] = P
Range("F3").Select
‘ legge il valore di x
‘ inizializza P
‘ algoritmo di Horner
‘ assegna il valore di P alla cella [D3]
‘ sposta il cursore per non disturbare la visione del foglio
End Sub
La procedura Coefficienti(), dopo aver pulito l’intervallo di celle prefissato, assunto come valore di N (grado
del polinomio) il contenuto della cella [B3], inserisce le etichette che faranno da guida per l’inserimento dei
coefficienti del polinomio. La funzione VBA Format() converte un numero in stringa senza introdurre spazi.
In figura è mostrato come si presenta il foglio dopo l’esecuzione delle procedure e dopo aver introdotto i
coefficienti del polinomio 𝑃(𝑥) = 2 𝑥 3 + 𝑥 2 − 2 𝑥 − 1. La cella [C3] contiene il valore di x = 1,5 e la cella
[D3] il valore del polinomio P = P(1,5).
Il calcolo viene svolto dalla procedura Calcola() che, dopo aver letto i valori delle celle di imput dei
coefficienti, averli memorizzati nell’array A(), tramite l’algoritmo di Ruffini-Horner, calcola il valore di P e
pone il risultato direttamente nella cella [D3] del foglio.
Come rendere automatica l’esecuzione di una procedura
Normalmente, come già visto, si manda in esecuzione una procedura tramite il comando MACRO. Si
potrebbe associare la macro ad un pulsante posto sul foglio ma è più rapido associare la macro ad un
evento.
Se si cambia il contenuto della cella [B3], dove è inserito il valore di N (grado del polinomio), verrà eseguita
la procedura Coefficienti(). Se si cambia il contenuto della cella [C3], contenente il valore di x, viene
eseguita la procedura Calcola(). La modifica di una qualsiasi altra cella del foglio non provocherà alcun
effetto.
4
A tal scopo, inseriamo in Foglio1 del nostro WorkSheet, la seguente procedura.
Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, Range("B3:C3")) Is Nothing Then Exit Sub
Application.EnableEvents = False
If Target.Address = Range("B3").Address Then Coefficienti
If Target.Address = Range("C3").Address Then Calcola
Application.EnableEvents = True
End Sub
Il modulo su cui inserire si sceglie da VBA tramite il selettore riportato in figura.
I nomi (Foglio1… Modulo1…) sono indicativi e sono quelli di default ma possono essere modificati
liberamente.
Questa procedura, così inserita (Private), è visibile solo all’interno del Foglio1 del nostro WorkSheet. Essa
serve a intercettare un qualsiasi cambiamento nel Range (intervallo) target passato in valore (ByVal) alla
procedura.
La prima istruzione è:
If Intersect(Target, Range("B3:C3")) Is Nothing Then Exit Sub
Se l’intersezione (Intersect) tra il Range Target e il Range “B3:C3” (contenente i valori di N e di x) è vuota
(Is Nothing) allora si lascia la procedura (Exit Sub).
In altre parole, la procedura viene eseguita solo dopo una modifica delle celle [B3] o [C3]. La modifica di
una qualsiasi altra cella non comporta l’esecuzione della procedura.
L’istruzione
Application.EnableEvents = False
inibisce l’intercettazione degli eventi. Serve ad evitare che altre modifiche richiamino la stessa procedura
creando una nidificazione di eventi.
Le istruzioni seguenti confrontano gli indirizzi delle celle modificate ed eseguono la routine appropriata.
If Target.Address = Range("B3").Address Then Coefficienti
If Target.Address = Range("C3").Address Then Calcola
5
Si è evitata la nidificazione degli IF per rendere più chiaro il listato della procedura.
Prima di uscire dalla routine si riabilita l’intercettazione di eventi con:
Application.EnableEvents = True
Non sono stati introdotti molti altri controlli per non complicare la lettura del listato. Così, non c’è alcun
controllo degli input (valori negativi o decimali di N…) che restano a carico dell’utente.
Il nostro vuole essere solo un esempio semplice ed efficace su come usare l’intercettazione di eventi al fine
di far eseguire proprie procedure.
Consiglio finale
Il registratore di macro è un ottimo strumento per conoscere la sintassi corretta da usare per interagire con
gli svariati oggetti del foglio elettronico: conoscerne i nomi e le varie istanze. La guida in linea per gli
sviluppatori diventa sempre più scarna, al succedersi di nuove versioni, e sempre meno dettagliata ed
efficace.
Excel contiene così tanti oggetti che conoscerli tutti diventerebbe cosa ardua anche per una memoria come
quella di Pico della Mirandola. Una guida risulta quindi indispensabile.
Prof. Ettore Limoli
6