Visual Basic For Application
Visual Basic For Application
Ambiente di sviluppo VBA Lambiente di sviluppo di Visual Basic For Application facilmente accessibile dal men "Strumenti"; "Macro"; "Visual Basic Editor". Qui avremo modo di progettare e sviluppare programmi in Visual Basic per soddisfare le nostre esigenze, in virt del fatto che gli strumenti sono perfettamente integrati con Microsoft Excel. I progetti realizzabili con VBA possono essere di tre tipi:
Nei "Progetti di documento" tutti i componenti del progetto sono legati alla cartella di lavoro utilizzata al momento, e non andranno ad intaccare ne lapplicazione Excel, ne i suoi modelli generali; quindi il codice rimarr confinato nel file aperto. Nel momento in cui il file cambier posizione il nostro progetto si sposter con esso. Di conseguenza, quando chiuderemo la nostra cartella e ne apriremo una nuova non avremo a disposizione il progetto da noi creato. Nei "Progetti di modello" invece il codice generato associato al modello generale di Microsoft Excel, quindi aprendo una nuova cartella Excel o qualsiasi cartella esistente avremo sempre a disposizione il nostro progetto VBA. I componenti aggiuntivi sono strumenti per ampliare le funzionalit di Microsoft Excel, come, ad esempio, un comando personalizzato richiamabile dalla barra degli strumenti o da una voce di men. Anche questa tipologia di progetto non legata solamente al documento corrente ma direttamente allapplicazione Excel. Nello specifico noi tratteremo solamente i "Progetti di documento".
Leditor visual Basic offre numerosi strumenti avanzati di sviluppo e programmazione: Finestra di progetto: mostra lelenco gerarchico dei progetti aperti e di tutti i moduli di codice e finestre di interfaccia appartenenti ad un determinato progetto.
Microsoft Excel oggetti: contiene il codice legato ai fogli ed alla cartella di lavoro.
Il generatore di Macro Excel permette la registrazione di macro, cio la registrazione delle azioni eseguite sullinterfaccia di Microsoft Excel, per poi essere ripetute quando ve ne fosse la necessit. Le applicazioni Office offrono un modo molto semplice per creare macro grazie al "Registratore di macro". Quando viene richiamata la registrazione, vengono ripetute le stesse azioni compiute durante la registrazione. In questo modo le istruzioni vengono tradotte in codice Visual Basic e salvate in un modulo di codice interno al progetto della cartella di lavoro Excel corrente. Il codice registrato sottoforma di macro non sar perfettamente adeguato alle esigenze di progettazione, ma spesso sar una utile base di partenza per la scrittura dei programmi del nostro progetto, che in seguito verr spostato e/o modificato grazie alleditor di Visual Basic. Vediamo una semplice dimostrazione: 1. Apriamo un nuovo documento di Microsoft Excel. Dalla voce "Macro" del men "Strumenti" selezioniamo "Registra nuova macro".
2. Sulla finestra "Registra macro" Immettere un nome per la macro ad esempio nella casella Nome macro assegniamo il nome "INTESTAZIONE" e clicchiamo "OK".
Specificare una lettera quale primo carattere del nome della macro. Per i caratteri successivi al primo possibile utilizzare lettere, numeri o caratteri di sottolineatura. Non consentito lutilizzo di spazi. possibile separare le parole utilizzando un carattere di sottolineatura. Per eseguire la macro mediante la pressione di un tasto di scelta rapida, immettere una lettera nella casella Scelta rapida da tastiera. possibile utilizzare CTRL+ lettera, per lettere minuscole oppure CTRL+MAIUSC+ lettera, per lettere maiuscole, dove lettera una lettera qualsiasi della tastiera. Non consentito utilizzare un numero o un carattere speciale, quale @ o #, come lettera del tasto di scelta rapida. Quando la cartella di lavoro che contiene la macro aperta, il tasto di scelta rapida avr la precedenza sui tasti di scelta rapida predefiniti di Microsoft Excel. Nella casella Memorizza macro in selezionare la posizione in cui si desidera memorizzare la macro. Per aggiungere una descrizione alla macro, digitarla nella casella Descrizione. Scegliere OK.
3. A questo punto apparir sul foglio un pulsante con un quadrattino blu il quale indica che iniziata la registrazione. 4. impostare lintestazione della pagina dal menu File Imposta pagina
si apre la finestra da cui, selezionando la scheda intestazione/pi di pagina , ciccando personalizza intestazione possibile inserire i dati desiderati.
A questo punto abbiamo creato una Macroistruzione, visibile selezionando "Macro" dalla voce "Macro" del men "Strumenti". 5. Selezioniamo la Macro e clicchiamo "Modifica". Entreremo nellEditor di Visual Basic dove potremo notare il nuovo modulo generico contenente il codice di funzionamento delle macro: "INTESTAZIONE ".
6. Torniamo al foglio Excel, apriamo il registratore di macro e scriviamo un numero nella cella B2; 7. in modo analogo registriamo una macro che cancelli la cella B2. 8. verifico che le macro siano state scritte in modo analogo al precedente oppure aprendo leditor di VBA e selezionando il modulo. In esso compaiono le tre macro registrate. Il modulo di codice il luogo dove viene scritto il codice Visual Basic. Esistono tre tipi di moduli di codice: generici, di classe e di userform. Il modulo di codice ora compilato generico.
9. Associamo
le
macro
appena
create
due
pulsanti
di
comando.
strumenti".
Clicchiamo licona relativa al pulsante e tracciamo un pulsante sul foglio di lavoro. A questo punto si aprir la finestra di dialogo "Assegna Macro", selezioniamo "scrivi_B2" e digitiamo "OK". Creiamo un nuovo pulsante sul foglio e ripetiamo lo stesso procedimento per assegnare la macrocancella_B2". Per modificare la scritta allinterno dei pulsanti ciccare con il tasto destro del mouse e selezionare modifica testo Per eseguire le macro sufficiente ciccare sui rispettivi pulsanti.
ANALISI DELLE MACRO Sub scrivi_B2() ' ' scrivi_B2 Macro ' scrive un numero nella cella B2 ' ' Range("B2").Select ActiveCell.FormulaR1C1 = "9" End Sub La prima riga contiene lintestazione della procedura, cio dellinsieme di istruzioni che noi forniamo al computer al fine di ottenere il risultato desiderato. La parola Sub una parola chiave indispensabile, cos come lultima riga indica la fine delle istruzioni. Le righe successive, precedute da in apice, costituiscono commenti, sono cio righe utili alla lettura del codice da parte del programmatore ma ignorate dal computer. Riga 7: seleziona la cella B2: Selezione di celle con i riferimenti assoluti Sintassi: Range(CoordinateDiCella).Select CoordinateDiCella: Argomento di tipo String ( una stringa viene racchiusa tra due doppi apici) Esempi Istruzione Risultato Range("A1").Select Viene selezionata la cella A1 Range("C4").Select Viene selezionata la cella C4 Range("B2:D6").Select Viene selezionato lintervallo di celle da B2 a D6 Riga 8: viene assegnato un valore alla cella selezionata Inserimento di testo, numeri e formule in una cella (macro registrabile) Sintassi: ActiveCell.FormulaR1C1 = Testo Testo: Specifica il testo da inserire nella cella Gli esempi seguenti ipotizzano che allavvio della registrazione (o dellesecuzione della macro) sia selezionata la cella D6. Esempi Istruzione Risultato ActiveCell.FormulaR1C1 = "a" Viene inserito il testo a nella cella corrente (D6) ActiveCell.FormulaR1C1 = "4" Viene inserito il valore 4 nella cella corrente (D6) ActiveCell.FormulaR1C1 = "=R[-1]C*2" Viene inserita la formula =D5*2 nella cella corrente (conseguentemente nella cella appare il risultato della formula). Si noti che la formula nella macro espressa nella forma dei riferimenti relativi R1C1
Analizziamo ora la macro cancella_B2 Lunica riga che differisce dalla precedente macro la seguente: Selection.ClearContents
ESERCIZI Riferimento assoluto Scrivere una subroutine che permetta di assegnare alle celle A1, B1,C1 il proprio nome, cognome, classe frequentata. Riferimento relativo Scrivere una subroutine che permetta di creare la seguente tabella, avendo inserito il numero centrale N nella cella D6 N/2 N N+1 N*2 ad esempio se nella cella d6 inserisco il valore 4 otterr: 2 3 4 5 8 N-1
Lezione 2: Input/Output
INPUT / OUTPUT
Apriamo ora un nuovo foglio excel. Creiamo un nuovo modulo di codice delleditor di VBA e scriviamo il seguente codice. Sub Saluti() ' La riga successiva visualizza un messaggio MsgBox "Ciao Mondo", vbInformation, "Ciao" End Sub Eseguiamo il codice dalla finestra MACRO cliccando su Esegui
Compare una finestra di messaggio La riga di codice segue la seguente sintassi: MsgBox parola chiave. il comando per far comparire la finestra di messaggio Ciao mondo il prompt: testo che compare allinterno della finestra vbInformation fa comparire licona di informazione allinterno della finestra esistono altre icone e altri pulasanti, la scelta compare in una finestra a tendina che si apre dopo aver digitato la virgola successiva al prompt. Per scegliere licona desiderata sufficiente selezionarla con un click del mouse e premere la barra spaziatrice. Ciao testo che appare sulla barra del titolo
10
Lezione 2: Input/Output
Per poter eseguire un input necessario stabilire dove memorizzare i dati digitati dallutente. Si deve perci dichiarare una variabile destinata a contenere il dato digitato dallutente Scrivere ed eseguire la seguente subroutine Sub salutoMe() dichiarazione della variabile Dim nome As String input del nome nome = InputBox(come ti chiami?, presentazioni) preparazione della stringa da visualizzare nella finestra di messaggio Dim messaggio As String messaggio = ciao & nome & concatena due stringhe. MsgBox messaggio, vbExclamation, SALUTI End Sub Per eseguire una macro, possiamo ad esempio associarla ad un pulsante di comando: aprire la barra moduli (tasto destro sulla barra dei comandi, e poi spuntare la casella corrispondente a moduli). Oppure, se invece vogliamo avere a disposizione questa nuova macro in una barra degli strumenti, utilizzabile in tutte le cartelle, possiamo procedere cos: Visualizza\Barra degli strumenti\personalizza: Scegliamo nuova e poi digitiamo il nome personale, OK, selezioniamo la linguetta comandi, evidenziamo macro e trasciniamo il pulsante personalizzato nella barra personale, CHIUDI, Premiamo il nuovo pulsante (sole che ride) Associamo il nome della macro Evidenzia, della cartella personale Clicchiamo col tasto destro sul sole che ride e scegliamo Modifica icona pulsante
dalleditor di pulsanti possiamo creare limmagine desiderata Trasciniamo la nuova barra degli strumenti dove preferiamo
11
Lezione 2: Input/Output
12
Lezione 3: Le variabili
LE VARIABILI
I dati utilizzati dai moduli di codice durante l'esecuzione dei programmi vengono memorizzati all'interno delle "Costanti" e delle "Variabili". Le variabili rappresentano dati il cui valore cambia durante l'esecuzione del programma, le costanti invece contengono sempre lo stesso valore predefinito durante tutta l'elaborazione. La sintassi di variabili e costanti la seguente: Dim NomeVariabile as Tipovariabile Const NomeVariabile as TipoCostante = ValoreCostante Il nome di una variabile non pu: Superare i 255 caratteri. Contenere punti o operatori matematici. Non deve essere una parola riservata di Visual Basic, cio quelle parole che servono per impartire le istruzioni al programma; come ad esempio: Loop, Function, Sub, End, Do, Integer, Case, If, For, Else, Then, Select. Queste parole riservate sono facilmente riconoscibili poich leditor di VBA le scrive in blu. Le variabili utilizzate non sono tutte uguali, possono essere numeri interi, numeri decimali, stringhe di caratteri, date ecc... Valori diversi hanno bisogno di un trattamento diverso. Per questo motivo in Visual Basic esistono tipi di dati differenti che possono essere dichiarati in modo esplicito. Tipo Byte Long Single Accetta numeri da 0 a 255 Accetta numeri da -2 147 483 648 a 2 147 483 647 Accetta numeri da -3,402823E38 a -1,401298E-45 per valori negativi Da 1,401298E-45 a 3,402823E38 per valori positivi Descrizione
Accetta numeri da -1,79769313486232E308 a -4,94065645841247E-324 Double per valori negativi Da 4,94065645841247E-324 a 1,79769313486232E308 per valori positivi Boolean Accetta solo 2 valori "True" o "False" (Vero o Falso) String Date Accetta da 0 a 65 000 caratteri Date dal 1 gennaio 100 al 31 dicembre 9999
Per indicare con chiarezza che tipo di dato stiamo usando dobbiamo dichiarare le variabili. Anche se non necessario, buona norma dichiarare sempre variabili e costanti all'interno del codice, questo aiuta a ridurre gli errori di scrittura del codice. Quando viene inserita la parola chiave "Option Explicit" in cima al modulo di codice, Visual basic, in caso di mancata dichiarazione di una variabile, dar una segnalazione di errore.
13
Lezione 3: Le variabili
Esercizio: Ricevere in input le misure della base e dellaltezza di un rettangolo e calcolare larea. Analisi: per calcolare larea di un rettangolo si utilizza la formula: Area=base * altezza. Devo : richiedere allutente di digitare la misura della base ( mediante inputbox) richiedere allutente di digitare la misura dellaltezza eseguire il calcolo assegnando il risultato alla variabile Area visualizzare il risultato (mediante message box)
Start
I
La macro conterr il seguente codice: Sub Area() ' dichiarazione delle variabili locali alla procedura (subroutine) Dim base As Integer Dim altezza As Integer Dim area As Integer
I
'input della base e dell'altezza base = InputBox("digita la base del rettangolo") altezza = InputBox("digita l'altezza del rettangolo") 'calcolo dell'area area = base * altezza 'output dei risultati MsgBox "perimetro=" & perimetro & " area=" & area End Sub
Se desidero visualizzare i risultati su foglio elettronico posso assegnare le variabili alle celle desiderate: Sub Area() ' dichiarazione delle variabili locali alla procedura (subroutine) Dim base As Integer Dim altezza As Integer Dim area As Integer 'input della base e dell'altezza base = InputBox("digita la base del rettangolo") altezza = InputBox("digita l'altezza del rettangolo") 'calcolo dell'area area = base * altezza 'output su foglio di lavoro Range("A10").Value = "BASE" Intestazione delle celle base Range("B10").Value = "ALTEZZA" e altezza Range("A11").Value = base Assegnazione delle variabili nelle sottostanti le intestazioni Range("B11").Value = altezza Range("B14").Value = "AREA" intestazione e assegnazione dellarea Range("B15").Value = area 'adatta la dimensione delle colonne a e b al contenuto Columns("A:B").Select Selection.Columns.AutoFit End Sub
celle
14
COLORARE LE CELLE
E possibile migliorare linterfaccia colorando le celle interessate. Anche questo pu essere fatto mediante codice VBA. Un esempio per colorare celle dato dalla seguente procedura: Sub colori() Dim rosso As Integer Dim verde As Long verde = vbGreen Range("B2").Interior.Color = verde rosso = vbRed Range("A1").Interior.Color = rosso End Sub vbRed e vbGreen sono due costanti di Visual Basic. Altre costanti sono: Costante vbBlack vbRed vbGreen vbYellow vbBlue Valore 0x0 0xFF 0xFF00 0xFFFF 0xFF0000 Nero Rosso Verde Giallo Blu Fucsia Azzurro Bianco Descrizione
I valori delle costanti sono forniti in sistema esadecimale. Ad eccezione del nero e del rosso si pu notare che sono costituiti da 4 o 6 cifre esadecimali. Per questo motivo per assegnare i colori verde, giallo, blu, fucsia, azzurro, bianco, a variabili, devo utilizzare variabili di tipo long. E possibile generare altri colori utilizzando la notazione RGB. In tale notazione sufficiente esprimere la quantit di colore ( rosso, verde, blu) che si intende utilizzare nella composizione del nuovo colore. Tale quantit espressa da un valore compreso tra 0 e 255
15
16
Operatori Matematici Le operazioni che si possono eseguire in Visual Basic sono le seguenti Operatore + * / \ Mod ^ Somma Sottrazione Moltiplicazione Divide e restituisce un numero intero Divide e restituisce solo il resto Eleva a potenza Funzione Utilizzo Risultato = X + Y Risultato = X - Y Risultato = X * Y Risultato = X \ Y Risultato = X Mod Y Il resto un intero Risultato = X ^ Y
Dove X e Y sono variabili o costanti di tipo numerico. Risultato deve sempre essere una variable di tipo numerico. Nota: il divisore non deve mai essere uno 0 (zero) Esercizi: 1. realizzare un foglio excel nel quale compaiano tre pulsanti: il primo per la lettura e visualizzazione dei valori del lato di un triangolo equilatero il secondo per il calcolo e la visualizzazione del perimetro del triangolo il terzo per il calcolo e la visualizzazione dellarea del triangolo 2. realizzare un foglio elettronico contenente un pulsante che permetta di ricevere in input gli importi di tre prodotti acquistati al supermercato , calcoli limporto totale e li visualizzi tutti i dati ordinatamente in un foglio excel:
3. modificare il precedente progetto aggiungendo un pulsante che richieda la percentuale di sconto e visualizzi il prezzo scontato
17
Lezione 6: Le routine
Le Routine Con la creazione di routine possibile dividere il codice in blocchi separati. Questo permette di rendere il programma pi leggibile ed individuare facilmente gli errori. Utilizzare i moduli permette anche di rendere comune parti di codice a pi programmi. In Visual Basic esistono due tipi di routine. Routine Sub: svolgono azioni ma non restituiscono un valore. Routine Function: svolgono azioni e restituiscono un valore.
NB: un modulo di codice non coincide necessariamente con una routine, in quanto un modulo pu contenere pi routine contemporaneamente.
Finora abbiamo scritto tutte routine del primo tipo, cio sub. Esiste un metodo che permette a colpo docchio di determinare il tipo di una routine . Innanzitutto, di fronte ad un problema decido quali passi devo compiere per giungere alla soluzione Esempio: realizzare un foglio excel che, mediante una macro richiamata da un pulsante, permetta di ricevere in input i dati di un triangolo equilatero e visualizzi i valori dellarea e del perimetro in modo gradevole. La prima parte di analisi determina le mie aspettative: come sar il foglio excel?
La seconda fase dellanalisi riassume le operazioni che intendo eseguire: Preparare le intestazioni (BASE, ALTEZZA, PERIMETRO,AREA) Richiedere allutente la misura della base Calcolare la misura dellaltezza Calcolare la misura del perimetro Calcolare la misura dellarea Visualizzare i valori calcolati
18
Lezione 6: Le routine
Tutte queste operazioni individuate possono essere eseguite a mano, utilizzando anche le formule di excel, oppure posso chiedere al computer di eseguirle al click del pulsante ESEGUI. Per sfruttare pienamente il computer posso chiedermi se alcune delle operazioni previste sono gi state utilizzate in precedenza. Osservo che tutte le operazioni descritte sono gi state eseguite in precedenti problemi, ( Pi precisamente nellesercizio precedente) non necessario ripetere lanalisi e la codifica di tali operazioni, ma solo controllare che siano state scritte correttamente e riutilizzarle opportunamente. A differenza dellesercizio precedente non servono tre pulsanti, ma solo uno da cui richiamo la procedura esegui. La subroutine esegui associata a questo pulsante richiamer le procedure scritte precedentemente.
NOTA: lordine con cui sono state scritte le sub e lordine di richiamo non deve essere obbligatoriamente lo stesso. Alcune variabili sono dichiarate allinterno delle subroutine, la variabile base dichiarata sopra le routine. Ci dipende dalla VISIBILITA delle stesse.
19
Lezione 6: Le routine
VISIBILITA La visibilit di una variabile, o di una costante, definisce la sua disponibilit all'interno del progetto. Puoi dichiarare variabili e costanti a tre livelli:
Livello locale: vanno dichiarate all'interno della routine e sono disponibili solo all'interno di essa. Ad esempio altezza, area e perimetro sono variabili locali alle routine. Non sono interessata a conoscerne i valori in altre parti del programma.
Livello di modulo: Vanno dichiarate in testa alla finestra di modulo di codice e sono viste da tutte le routine contenute all'interno del modulo di codice; il caso della variabile base che posso dichiarare, oltre che con la parola chiave dim anche cn la parola chiave Private
Livello pubblico: Vanno dichiarate in testa alla finestra di modulo di codice e sono viste da tutte le routine e da tutti i moduli di codice appartenenti al progetto. Sono dichiarate Pubblic
Esercizio: individua i livelli di visibilit delle variabili nel seguente codice: Public risultato1 As Integer Public risultato2 As Integer Public sottraendo As Integer Private operatore As Integer Sub somma() Dim Addendo As Integer operatore = 5 Addendo = 5 risultato1 = Addendo + operatore MsgBox "Il risultato della somma : " & risultato1, _ vbInformation, "Somma" End Sub Sub sottrazione() Dim sottraento As Integer sottraento = 2 risultato2 = operatore - sottraento MsgBox "Il risultato della sottrazione : " & risultato2, _ vbInformation, "Sottrazione" End Sub VARIABILE risultato1 risultato2 sottraendo operatore Addendo sottraento LIVELLO LOCALE LIVELLO DI MODULO LIVELLO PUBBLICO
20
Lezione 6: Le routine
Prova ora a completare lesercizio precedente e a mandarlo in esecuzione. Il codice sar simile al seguente: Dim base As Integer Sub Prepara_Intestazioni() ' scrive le etichette delle celle e le colora Range("B5").Value = "BASE" Range("B5").Interior.Color = vbYellow Range("B7").Value = "ALTEZZA" Range("B7").Interior.Color = vbYellow Range("E5").Value = "PERIMETRO" Range("E5").Interior.Color = vbGreen Range("E7").Value = "AREA" Range("E7").Interior.Color = vbGreen Columns("B:E").Select Selection.Columns.AutoFit End Sub Sub Input_Dati() 'chiede all'utente la misura dei lati e la scrive nella cella C5 base = InputBox("digita la base del triangolo") Range("C5").Value = base End Sub Sub Area() Dim altezza As Single Dim Area As Double 'calcola la misura dell'altezza e la visualizza, altezza = Sqr((base ^ 2) - (base / 2) ^ 2) Range("c7") = altezza 'la misura dell'area Area = base * altezza 'visualizza la misura dell'area Range("F7") = Area End Sub Sub Perimetro() Dim Perimetro As Integer 'calcola la misura del perimetro e lo visualizza Perimetro = base * 3 Range("f5") = Perimetro End Sub
21
Lezione 6: Le routine
Sub esegui() 'richiama nell'ordine desiderato le sub precedentemente scritte Call Prepara_Intestazioni Call Input_Dati Call Perimetro Call Area End Sub _______________ Per il calcolo dell altezza stata utilizzata la seguente formula: base2 (base/2)2 La radice quadrata viene calcolata dalla funzione Sqr. Una funzione simile a una routine sub ma restituisce un valore, cio un insieme di istruzioni per il calcolo di un algoritmo. La soluzione dellalgoritmo non viene direttamente visualizzata ma pu venire assegnata a una variabile (altezza = Sqr((base ^ 2) - (base / 2) ^ 2). VBA propone gi un insieme di funzioni direttamente usufruibili. Ad esempio le funzioni matematiche Abs, Atn, Cos, Exp, Fix, Int, Log, Rnd, Sgn, Sin, Tan Per conoscere le funzioni disponibili aprire la guida in linea di Microsoft Visual Basic ciccando su ?
22
Lezione 6: Le routine
Scelta la funzione desiderata si aprir una finestra esplicativa della funzione stessa.
possibile scrivere autonomamente delle funzioni, il cui valore restituito pu essere assegnato ad una variabile. La stessa funzione pu essere richiamata ( cio utilizzata) pi volte, ogni volta che necessita. Calcolare la misura del perimetro Da sviluppare come esercizio Calcolare la misura dellarea Da sviluppare come esercizio Visualizzare i valori calcolati Da sviluppare come esercizio Il problema ora risolto. Posso richiamare le procedure scritte nella procedura associata al pulsante Esegui e mandare in esecuzione. Sub esegui() Call intestazione Call inputBase Call S_perimetro Call S_altezza Call S_area Call visualizza Call coloraCelle Call AdattaCelle End Sub Per migliorare laspetto grafico posso richiamare le procedure per colorare le celle o per adattare le dimensioni delle colonne. Routine Function: svolgono azioni e restituiscono un valore Alcune delle routine sviluppate calcolano un solo valore ( S_area, S_perimetro, S_altezza, inputBase) Queste possono essere pi correttamente dichiarate funzioni. Il problema cambia sia nella sintassi della dichiarazione della subroutine che nel richiamo della stessa: Dichiarazione di una funzione Public Function identificativo della funzione (elenco dei parametri formali) As tipo del dato restituito As esempio: Public Function F_area() As Single
23
Lezione 6: Le routine
F_area = base * altezza End Function Il richiamo di una funzione segue la seguente sintassi: variabile destinazione = identificativo funzione(elenco parametri attuali) Sub esegui_con_funzioni() Call intestazione base = F_inputBase() perimetro = F_perimetro() altezza = F_altezza() area = F_area() Call visualizza Call coloraCelle Call AdattaCelle End Sub Sia i parametri formali che attuali possono essere 0 o pi. Se non ci sono parametri le parentesi restano vuote.
24
A volte occorre prendere delle decisioni: se una condizione verificata allora si eseguono alcune operazioni, altrimenti se ne eseguono delle altre . Il flow chart che rappresenta listruzione condizionale rappresentata da un rombo:
In Visual Basic : Se non ci sono istruzioni da eseguire quando la condizione non verificata: If "condizione" then "istruzione" End if Se ci sono istruzioni sia con condizione verificata sia con condizione non verificata; If "condizione" then "istruzione" Else "istruzione" End if
25
Esempio: verificare che il numero inserito dallutente sia un valore positivo. Questo problema si presenta ogni volta che un utente inserisce dei valori che rappresentano quantit o dimensioni obbligatoriamente positive, come ad esempio la misura di un lato di una figura, la somma depositata in banca o il voto di un compito in classe. Scrivere il seguente codice ed associarlo ad un pulsante Option Explicit Dim VariabileInput Sub positivo() VariabileInput = _ InputBox("immettere un numero ") 'inizio dell' istruzione condizionale If (VariabileInput > 0) Then MsgBox "la variabile un numero positivo. il suo valore accettabile", vbInformation, "valutazione 1" Else MsgBox "la variabile un numero negativo o pari a zero; il suo valore non accettabile", _ vbInformation, "valutazione 2" End If 'fine dell' istruzione condizionale End Sub Verificarne la correttezza digitando, in tre prove diverse, un numero positivo, uno negativo e infine uno 0. Esempio: verificare se un valore digitato un carattere o un numero E sempre utile, quando si chiede allutente di inserire un numero, verificare che la digitazione sia corretta. Scrivere il seguente codice ed associarlo ad un pulsante Option Explicit Dim VariabileInput Sub valuta() VariabileInput = _ InputBox("immettere un numero o una stringa di caratteri") 'inizio dell' istruzione condizionale If IsNumeric(VariabileInput) Then MsgBox "la variabile un numero", vbInformation, "condizione Vera" Else MsgBox "la variabile un carattere o una stringa di caratteri", _ vbInformation, "condizione Falsa" End If 'fine dell' istruzione condizionale End Sub Nella routine usata listruzione: "IsNumeric" che definisce se il valore memorizzato nella variabile "VariabileInput" numerico o stringa.
26
ESERCIZI: 1. Richiedere allutente due numeri e visualizzare il minore. 2. Un commerciante di frutta ha la possibilit di vendere solo il 60% della merce a prezzo intero prima che questa diventi avariata, oppure pu scegliere di applicare uno sconto su vendite di stock di 5 kg, sapendo che in tal modo riuscir a vendere completamente la merce. Ricevendo in input la quantit totale di merce, il prezzo al kg della merce, la percentuale di sconto applicata, quale delle due formule di vendita pi conveniente? Per motivare la scelta si crei un prospetto in excel mediante macro. Si eseguano gli input dei dati mediante inputbox.
27
Lezione 8: I form
Le useform
Utilizzando le Userform, possibile costruire finestre personalizzate per visualizzare dati, o richiedere allutente la digitazione di valori In sostanza le finestre di dialogo permettono al programma di interagire con lutente in modo pi sofisticato e forniscono uno strumento versatile per svolgere le normali funzioni di Input e Output. Loggetto Userform una finestra di dialogo vuota e contiene una barra del titolo e un pulsante di chiusura, aggiungendo controlli a un oggetto di tipo Userform possibile personalizzare laspetto e la funzionalit della finestra di dialogo. Per inserire in un file di Excel una Userform, entriamo nelleditor del VBA clicchiamo su inserisci nella barra de menu e scegliamo la voce useform
28
Lezione 8: I form
Possiamo notare che nella finestra di strumenti) che ci permette di La Userform ora creata, possiamo destro) e trascinare il mouse tenendo dimensioni desiderate.
destra ci comparsa una Form vuota e un box (Casella degli inserire i vari controlli allinterno della nostra Userform. modificarla a piacere, basta posizionarsi in un angolo (inferiore premuto il tasto sinistro e rilasciarlo quando abbiamo raggiunto le
Come prima cosa personalizziamo la useform: Cambiamo il titolo: nella finestra delle propriet scrivendo primo form seleziono caption e modifico il contenuto
modifico anche la propriet Back Color: cliccando su essa si apre una finestra con due schede: Tavolozza Sistema. e
Se scelgo Tavolozza, cliccando su un colore a mio piacimento, modifico il colore di sfondo della Userform. Allinterno della Userform posso inserire degli strumenti. Scelgo un pulsante che posiziono nellangolo in basso a destra della finestra. Modifico le propriet Name in CmdFine e caption in Fine. Con un doppio clic sul pulsante apro la finestra di codice in cui scrivo: Unload Me Private Sub cmdFine_Click() Unload Me End Sub I metodi hide e show Hide : Nasconde la finestra di dialogo (la Userform) senza liberare la memoria associata alloggetto, in questo modo vengono mantenuti i valori nei vari controlli contenuti in essa
Show : Rende visibile la finestra sullo schermo, se la finestra non caricata in memoria, viene effettuato il caricamento La Form appena creata presente, ma deve essere veicolata per poter renderla visibile, un sistema per ottenere questo il seguente: dal men file seguiamo questo percorso Inserisci > Modulo Nel Modulo1 digitiamo il seguente codice
Associamo ora la macro ad un pulsante sul foglio di lavoro e premendo sul pulsante comparir a video la Userform.
29
Lezione 8: I form
Esercizio
Calcolatrice
, una label
e cinque command
Modificare la propriet name della useform chiamandolo Frmcalcolatrice Modificare la caption con calcolatrice Svuotare le caselle di testo e la label cancellando il contenuto della propriet text. Modificare la Name delle caselle di testo rispettivamente in TxtN1 e TxtN2 e della label in LblRis Colorare lo sfondo di blris di bianco Modificare le caption dei command ognuno con un diverso operatore aritmetico (+ - * /) Modificare i name delle caselle di testo rispettivamente in CmdPiu, CmdMeno, CmdPer, CmdDiviso Laspetto del form dovrebbe essere questo: Scrivere i seguenti codici Private Sub CmdDiviso_Click() If Val(txtN2.Text) <> 0 Then lblris.Caption = Val(txtN1.Text) / Val(txtN2.Text) Else r = MsgBox("divisione per 0", vbCritical, "errore") End If End Sub Private Sub cmdFine_Click() Unload Me End Sub Private Sub CmdMeno_Click() lblris.Caption = Val(txtN1.Text) - Val(txtN2.Text) End Sub Private Sub CmdPer_Click() lblris.Caption = Val(txtN1.Text) * Val(txtN2.Text) End Sub Private Sub CmdPiu_Click() lblris.Caption = Val(txtN1.Text) + Val(txtN2.Text) End Sub Per definire le routine di evento riguardanti la cartella Excel attiva esiste un modulo di codice predefinito denominato "ThisWorkbook", visibile in finestra di progetto. Inserire la routine seguente nel modulo di codice "ThisWorkBook" . Private Sub Workbook_Open() Frmcalcolatrice.show End Sub La routine attiva la UserForm "Frmcalcolatrice" quando viene aperto il documento Excel.
30
Cliccare su name e modificare il nome del form in FrmIndovinaNumero Da ora in poi ogni volta che si desidera riferirsi a questo form lo si far indicando FrmIndovinaNumero. Il nome scelto non casuale : Frm indica che loggetto un form IndovinaNumero mi ricorda che in questo form voglio creare un gioco che mi permetta, con un numero limitato di tentativi (ad esempio 5), di indovinare un numero. Dopo aver modificato il nome non noto nessun cambiamento del form. Per cambiare il titolo al form modifico la caption
31
Posso ora migliorare lo sfondo colorandolo, agendo sulla propriet BackColor. click sulla freccia a destra di BackColor. Click su tavolozza Scelta del colore
Posso anche scegliere un immagine di sfondo agendo sulla propriet Picture: Click su Scelta di un file immagine (ad esempio JPEG) selezionando opportunamente il percorso.
32
Nei programmi spesso necessario svolgere molte volte una determinata azione, I comandi descritti in questa sezione eseguono ripetutamente le stesse istruzioni, finch non si verifica una determinata condizione. Ciclo per un numero di volte predefinito Il ciclo "For.. Next" esegue ripetutamente un blocco di codice incrementando (o decrementando) una variabile specifica, finche l'indice non raggiunge il valore indicato dall'attributo "To".
Esempio: Sub CicloFor() For i = 1 To 10 MsgBox "Il valore incremento " & i, _ vbInformation, "Ciclo For" Next End Sub Per contare allindietro basta sostituire la riga "For i = 1 To 10" con "For i = 10 To 1 step -1"
33
Giochiamo con i colori: Scrivere il seguente codice ed associarlo ad un pulsante. Option Explicit Sub arcobaleno() Dim rosso As Integer Dim verde As Integer Dim blu As Integer Dim NumCelle As Integer Dim i As Integer Dim zonamia As Variant Randomize Set zonamia = Range("A1:C10") NumCelle = zonamia.Count For i = 1 To NumCelle rosso = Int((255 * Rnd) + 1) verde = Int((255 * Rnd) + 1) blu = Int((255 * Rnd) + 1) zonamia(i).Interior.Color = RGB(rosso, verde, blu) Next End Sub Rnd[(numero)] La funzione Rnd restituisce un valore minore di 1 ma maggiore o uguale a zero. Il valore di numero determina il modo in cui Rnd genera un numero casuale. Per ogni base iniziale specificata, viene generata la stessa sequenza di numeri, in quanto ogni successiva chiamata alla funzione Rnd utilizza il numero casuale precedente come base per il numero successivo nella sequenza. Prima di richiamare Rnd, utilizzare l'istruzione Randomize senza argomento per inizializzare il generatore di numeri casuali con una base connessa al timer del sistema. Per generare interi casuali in un dato intervallo, utilizzare la seguente formula: Int((limitesup - limiteinf + 1) * Rnd + limiteinf) Set fissa un oggetto in una variabile di tipo Object o di tipo Variant. L'istruzione Set pu essere, usata per non dover ripetere la denominazione di oggetti, specie se lunga e verbosa, da qui deriva la possibilit di applicare anche a un oggetto Range la propriet Count e gli indici numerici.
34
Esercizio 2 Scrivere una procedura che conti, nellintervallo C12:D18 quante volte compare un valore dato in input Esercizio3 Scrivere una procedura che permetta linput di 15 valori e li memorizzi in altrettante celle adiacenti nella colonna C, e visualizzi la somma di tali valori nella cella successiva.
35
condizione
no
Sub CicloDo() i = 1 Do While i < 10 MsgBox "Il valore incremento " & i, _ vbInformation, "Ciclo While" i = i + 1 Loop End Sub
i<10
si Il valore incremento i
no
i=i+1
36
Esistono due tipologie di ciclo "Do": Ripeti mentre la condizione risulta falsa (cicla per falso - until). Sub CicloDo() i = 1 Do Until i > 10 MsgBox "Il valore incremento " & i, _ vbInformation, "Ciclo Do Loop Until" i = i + 1 Loop End Sub
Ripeti mentre la condizione risulta vera (cicla per vero - while). Sub CicloDo() i = 1 Do While i < 10 MsgBox "Il valore incremento " & i, _ vbInformation, "Ciclo For" i = i + 1 Loop End Sub
E inoltre il controllo pu essere effettuato prima dello istruzioni del ciclo (controllo in testa) o dopo di esse (controllo in coda). Controllo in testa:
i<10
si Il valore incremento i
no
i=i+1
Esegue una serie di istruzioni finch la valutazione di una determinata condizione d come risultato True.
37
La sintassi dell'istruzione While...Wend composta dalle seguenti parti: Parte condizione istruzioni Descrizione Obbligatoria. Espressione numerica o espressione stringa che pu dare come risultato True o False. Se condizione Null, viene considerata False. Facoltativa. Una o pi istruzioni eseguite finch la condizione True.
osservazioni Se condizione True, verranno eseguite tutte le istruzioni fino allistruzione Wend. Il controllo torner quindi all'istruzione While e condizione verr analizzata nuovamente. Se condizione ancora True, il processo verr ripetuto. Se non True, l'esecuzione riprender con l'istruzione successiva all'istruzione Wend. I cicli While...Wend possono essere nidificati a qualsiasi livello. Ciascuna istruzione Wend corrisponder allistruzione While pi recente. Oppure: Do [{While | Until} condizione] [istruzioni] [istruzioni] Loop
Controllo in coda:
i=i+1
Il valore incremento i si i>10
no
38
Osservazioni Come metodo per uscire dall'istruzione Do...Loop. viene utilizzata la valutazione di una condizione. Quando le istruzioni Do...Loop sono nidificate, il controllo viene trasferito al ciclo che si trova al livello di nidificazione immediatamente superiore al ciclo appena terminato.
Esercizi: 1) Realizzare un form contenente un pulsate che permetta di ripetere, fino a che lutente sceglie di terminare il programma, linserimento di un numero ed il calcolo del quadrato e del cubo. Visualizzare gli output mediante MsgBox. Nota : per chiedere allutente se desidera continuare lapplicazione o terminarla usare nella casella di MessageBox, come buttom lopzione vbYesNo e per controllare se la risposta positiva controllare che sia uguale a vbYes. 2) Richiamare una macro che permetta di inserire una serie di valori e calcolare separatamente la somma dei positivi e dei negativi. Visualizzare infine tali somme sul foglio excel che ospita il pulsante. 3) Inserire un insieme di valori a piacimento dellutente e visualizzare quanti sono stati inseriti. 4) Sommare i primi numeri naturali fino ad ottenere un mumero maggiore o uguale di un valore prefissato e comunicare quanti valori stato necessario sommare.
39