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