visual basic for application
DESCRIPTION
Dispense di M. Bogattowww.istitutoolivetti.itTRANSCRIPT
Visual Basic for Application
Dispense di M. Bogatto
www.istitutoolivetti.it
Ambiente di sviluppo VBA
L’ambiente di sviluppo di Visual Basic For Application è facilmente accessibile dalmenù "Strumenti"; "Macro"; "Visual Basic Editor". Qui avremo modo di progettare esviluppare programmi in Visual Basic per soddisfare le nostre esigenze, in virtù delfatto che gli strumenti sono perfettamente integrati con Microsoft Excel.
I progetti realizzabili con VBA possono essere di tre tipi:
Progetto di documento Progetto di modello Progetto di componente aggiuntivo dell’applicazione
Nei "Progetti di documento" tutti i componenti del progetto sono legati alla cartella dilavoro utilizzata al momento, e non andranno ad intaccare ne l’applicazione Excel, ne isuoi modelli generali; quindi il codice rimarrà confinato nel file aperto. Nel momento incui 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 adisposizione il progetto da noi creato.
Nei "Progetti di modello" invece il codice generato è associato al modello generale diMicrosoft Excel, quindi aprendo una nuova cartella Excel o qualsiasi cartella esistenteavremo 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 strumentio da una voce di menù. Anche questa tipologia di progetto non è legata solamente aldocumento corrente ma direttamente all’applicazione Excel.
Nello specifico noi tratteremo solamente i "Progetti di documento".
La piattaforma di sviluppo
ACCEDERE ALL’EDITOR DI VBA
Lezione 1: L'ambiente di sviluppo VBA
1
L’editor visual Basic offre numerosi strumenti avanzati di sviluppo e programmazione:Finestra di progetto: mostra l’elenco gerarchico dei progetti aperti e di tutti i moduli dicodice e finestre di interfaccia appartenenti ad un determinato progetto.
Microsoft Excel oggetti: contiene il codice legato ai fogli ed alla cartella di lavoro.
Lezione 1: L'ambiente di sviluppo VBA
2
Il generatore di Macro
Excel permette la registrazione di macro, cioè la registrazione delle azioni eseguitesull’interfaccia di Microsoft Excel, per poi essere ripetute quando ve ne fosse lanecessità.
Le applicazioni Office offrono un modo molto semplice per creare macro grazie al"Registratore di macro". Quando viene richiamata la registrazione, vengono ripetute lestesse azioni compiute durante la registrazione.
In questo modo le istruzioni vengono tradotte in codice Visual Basic e salvate in unmodulo di codice interno al progetto della cartella di lavoro Excel corrente.
Il codice registrato sottoforma di macro non sarà perfettamente adeguato alleesigenze di progettazione, ma spesso sarà una utile base di partenza per la scritturadei programmi del nostro progetto, che in seguito verrà spostato e/o modificato grazieall’editor 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 esempionella casella Nome macro assegniamo il nome "INTESTAZIONE" e clicchiamo"OK".
Lezione 1: L'ambiente di sviluppo VBA
3
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 l’utilizzo 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 nellacasella Scelta rapida da tastiera. È possibile utilizzare CTRL+ lettera, per lettereminuscole oppure CTRL+MAIUSC+ lettera, per lettere maiuscole, dove lettera è una letteraqualsiasi 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, iltasto 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 ilquale indica che è iniziata la registrazione.
4. impostare l’intestazione della pagina dal menu “File” “Imposta pagina”
si apre la finestra da cui, selezionandola scheda “intestazione/piè di pagina” , ciccando “personalizza intestazione” èpossibile inserire i dati desiderati.
Lezione 1: L'ambiente di sviluppo VBA
4
A questo punto abbiamo creato una Macroistruzione, visibile selezionando"Macro…" dalla voce "Macro" del menù "Strumenti".
5. Selezioniamo la Macro e clicchiamo "Modifica". Entreremo nell’Editor di VisualBasic dove potremo notare il nuovo modulo generico contenente il codice difunzionamento delle macro: "INTESTAZIONE ".
6. Torniamo al foglio Excel, apriamo il registratore di macro e scriviamo unnumero 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 l’editor di VBA e selezionando il modulo. In esso compaiono le tremacro registrate.
Il modulo di codice è il luogo dove viene scritto il codice Visual Basic. Esistonotre tipi di moduli di codice: generici, di classe e di userform. Il modulo di codiceora compilato è generico.
9. Associamo le macro appena create a due pulsanti di comando.
Lezione 1: L'ambiente di sviluppo VBA
5
Inseriamo la barra degli strumenti "Moduli" dal menù "Visualizza", "barra degli
strumenti".
Clicchiamo l’icona relativa al pulsante e tracciamo un pulsante sul foglio dilavoro. A questo punto si aprirà la finestra di dialogo "Assegna Macro",selezioniamo "scrivi_B2" e digitiamo "OK". Creiamo un nuovo pulsante sul foglioe ripetiamo lo stesso procedimento per assegnare la macro”cancella_B2".
Per modificare la scritta all’interno dei pulsanti ciccare con il tasto destro delmouse e selezionare “modifica testo”
Per eseguire le macro è sufficiente ciccare sui rispettivi pulsanti.
Lezione 1: L'ambiente di sviluppo VBA
6
ANALISI DELLE MACROSub scrivi_B2()'' scrivi_B2 Macro' scrive un numero nella cella B2'
' Range("B2").Select ActiveCell.FormulaR1C1 = "9"
End Sub
La prima riga contiene l’intestazione della procedura, cioè dell’insieme diistruzioni che noi forniamo al computer al fine di ottenere il risultato desiderato.La parola “Sub” è una parola chiave indispensabile, così come l’ultima rigaindica 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 dalcomputer.
Riga 7: seleziona la cella B2:
Selezione di celle con i riferimenti assolutiSintassi: Range(CoordinateDiCella).Select
CoordinateDiCella: Argomento di tipo String ( una stringa viene racchiusa tra due doppi apici)EsempiIstruzione RisultatoRange("A1").Select Viene selezionata la cella A1Range("C4").Select Viene selezionata la cella C4Range("B2:D6").Select Viene selezionato l’intervallo di celle da B2 a D6
Riga 8: viene assegnato un valore alla cella selezionataInserimento di testo, numeri e formule in una cella (macro registrabile)
Sintassi: ActiveCell.FormulaR1C1 = TestoTesto: Specifica il testo da inserire nella cellaGli esempi seguenti ipotizzano che all’avvio della registrazione (o dell’esecuzione della macro) siaselezionata la cella D6.EsempiIstruzione RisultatoActiveCell.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”L’unica riga che differisce dalla precedente macro è la seguente:Selection.ClearContents
Lezione 1: L'ambiente di sviluppo VBA
7
E cancella il contenuto della cella B2
Cancellare l’area selezionata nel foglio di lavoro (macro registrabile)Sintassi: Selection.Clear Cancella Tutto (contenuti, formato,note)Selection.ClearFormats Cancella solo i FormatiSelection.ClearContents Cancella il contenuto dell’area selezionataSelection.ClearComments Cancella le Note (commenti)
Definizione di “riferimento assoluto” nelle formuleIn una formula è l’indirizzo esatto di una cella, indipendentemente dalla posizionedella cella contenente la formula. Un riferimento assoluto ha la forma $A$1, $B$1 ecosì via. Alcuni riferimenti di cella sono misti. Un riferimento di riga assoluto ha laforma A$1, B$1 e così via. Un riferimento di colonna assoluto ha la forma $A1, $B1 ecosì via. Diversamente da riferimenti relativi, i riferimenti assoluti non si adattanoautomaticamente quando si copiano delle formule su righe e colonne.
Sub copia()' copia nella cella A1 il contenuto della calla A3' indirizzamenti assoluti
Range("A1").Value = Range("A3").Value
End Sub
Definizione di “riferimento relativo” nelle formuleE’ un riferimento di cella, utilizzato in una formula, che cambia quando la formulaviene copiata inun’altra cella o intervallo. Dopo che la formula viene copiata e incollata, il riferimentorelativo nellanuova formula cambia per fare riferimento a una cella differente distante dallaformula lo stessonumero di righe e colonne che distanziano il riferimento relativo originale dallaformula originale.Se ad esempio la cella A3 contiene la formula =A1+A2 e si copia la cella A3 nellacella B3, laformula nella cella B3 diventa =B1+B2.
"=R[-1]C*2" è un esempio di riferimento relativo. Si intende la riga precedente [-1] a quella attiva e la stessa colonna.
Affinché le nostre applicazioni funzionino è necessario inserire il codice Basic, cioè leistruzioni che indicano al computer quali comandi eseguire ed in che ordine. Il codiceviene inserito nelle finestre "Modulo di codice" all'interno dell'Editor di "Visual Basic".Per creare un nuovo modulo di codice, aprire un nuovo documento Excel ed entrarenell'Editor VBA. Quindi scegliere la voce "Modulo" dal menù "Inserisci".
Lezione 1: L'ambiente di sviluppo VBA
8
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/2N-1 N N+1
N*2 ad esempio se nella cella d6 inserisco il valore 4 otterrò:
23 4 5
8
Lezione 1: L'ambiente di sviluppo VBA
9
INPUT / OUTPUT
Apriamo ora un nuovo foglio excel. Creiamo un nuovo modulo di codice dell’editor diVBA 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 messaggioLa riga di codice segue la seguente sintassi:
MsgBox parola chiave. È il comando per far comparire la finestra dimessaggio
“Ciao mondo” è il prompt: testo che compare all’interno della finestra vbInformation fa comparire l’icona di informazione all’interno della finestra
esistono altre icone e altri pulasanti, la scelta compare in una finestra atendina che si apre dopo aver digitato la virgola successiva al prompt.Per scegliere l’icona desiderata è sufficiente selezionarla con un clickdel mouse e premere la barra spaziatrice.
“Ciao” testo che appare sulla barra del titolo
Lezione 2: Input/Output
10
Per poter eseguire un input è necessario stabilire dove memorizzare i dati digitatidall’utente. Si deve perciò dichiarare una variabile destinata a contenere il datodigitato dall’utente
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 dicomando:aprire la barra moduli (tasto destro sulla barra dei comandi, e poi spuntare la casellacorrispondente a moduli).
Oppure, se invece vogliamo avere a disposizione questa nuova macro in una barradegli 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 personaleClicchiamo col tasto destro sul sole che ride e scegliamo Modifica icona pulsante
dall’editor di pulsanti possiamo crearel’immagine desiderata
Trasciniamo la nuova barra degli strumenti dove preferiamo
Lezione 2: Input/Output
11
Ora la nuova macro sarà disponibile in tutte le cartelle.
Lezione 2: Input/Output
12
LE VARIABILI
I dati utilizzati dai moduli di codice durante l'esecuzione dei programmi vengonomemorizzati all'interno delle "Costanti" e delle "Variabili". Le variabili rappresentanodati il cui valore cambia durante l'esecuzione del programma, le costanti invececontengono sempre lo stesso valore predefinito durante tutta l'elaborazione.La sintassi di variabili e costanti è la seguente:
Dim NomeVariabile as TipovariabileConst 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. Questeparole riservate sono facilmente riconoscibili poiché l’editor di VBA le scrive inblu.
Le variabili utilizzate non sono tutte uguali, possono essere numeri interi, numeridecimali, stringhe di caratteri, date ecc... Valori diversi hanno bisogno di untrattamento diverso. Per questo motivo in Visual Basic esistono tipi di dati differentiche possono essere dichiarati in modo esplicito.
Tipo Descrizione
Byte Accetta numeri da 0 a 255
Integer Accetta numeri da -32768 a 32767
Long Accetta numeri da -2 147 483 648 a 2 147 483 647
SingleAccetta numeri da -3,402823E38 a -1,401298E-45 per valori negativi Da1,401298E-45 a 3,402823E38 per valori positivi
DoubleAccetta numeri da -1,79769313486232E308 a -4,94065645841247E-324per valori negativi Da 4,94065645841247E-324 a 1,79769313486232E308per valori positivi
Boolean Accetta solo 2 valori "True" o "False" (Vero o Falso)
String Accetta da 0 a 65 000 caratteri
Date Date dal 1 gennaio 100 al 31 dicembre 9999
Per indicare con chiarezza che tipo di dato stiamo usando dobbiamo dichiarare levariabili.
Anche se non è necessario, è buona norma dichiarare sempre variabili e costantiall'interno del codice, questo aiuta a ridurre gli errori di scrittura del codice. Quandoviene inserita la parola chiave "Option Explicit" in cima al modulo di codice, Visualbasic, in caso di mancata dichiarazione di una variabile, darà una segnalazione dierrore.
Lezione 3: Le variabili
13
Esercizio:Ricevere in input le misure della base e dell’altezza di un rettangolo e calcolare l’area.Analisi:per calcolare l’area di un rettangolo si utilizza la formula: Area=base * altezza.Devo :
richiedere all’utente di digitare la misura della base ( mediante inputbox) richiedere all’utente di digitare la misura dell’altezza eseguire il calcolo assegnando il risultato alla variabile Area visualizzare il risultato (mediante message box)
Se desidero visualizzare i risultati su foglio elettronico posso assegnare le variabili allecelle desiderate:
Sub Area() ' dichiarazione delle variabili locali alla procedura (subroutine)Dim base As Integer Dim altezza As IntegerDim 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 cellesottostanti le intestazioniRange("B11").Value = altezza Range("B14").Value = "AREA" ‘ intestazione e assegnazione dell’areaRange("B15").Value = area 'adatta la dimensione delle colonne a e b al contenutoColumns("A:B").Select Selection.Columns.AutoFitEnd Sub
Start
base
altezza
Area=base*altezza
Area
Stop
I
I
O
La macro conterrà il seguente codice:
Sub Area() ' dichiarazione delle variabili locali alla procedura (subroutine)Dim base As Integer
Dim altezza As IntegerDim 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'areaarea = base * altezza
'output dei risultati MsgBox "perimetro=" & perimetro & " area=" & area
End Sub
Lezione 3: Le variabili
14
COLORARE LE CELLE
E possibile migliorare l’interfaccia colorando le celle interessate. Anche questo puòessere fatto mediante codice VBA. Un esempio per colorare celle è dato dallaseguente 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 Valore Descrizione
vbBlack 0x0 Nero
vbRed 0xFF Rosso
vbGreen 0xFF00 Verde
vbYellow 0xFFFF Giallo
vbBlue 0xFF0000 Blu
vbMagenta 0xFF00FF Fucsia
vbCyan 0xFFFF00 Azzurro
vbWhite 0xFFFFFF Bianco
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 cifreesadecimali. 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) chesi intende utilizzare nella composizione del nuovo colore. Tale quantità è espressa daun valore compreso tra 0 e 255
Lezione 4: Colorare le celle
15
Esempio: colorare la cella C7 di violaSub coloriRGB()Dim rosso As IntegerDim verde As IntegerDim blu As Integerrosso = 225 verde = 20 blu = 97 Range("C7").Interior.Color = RGB(rosso, verde, blu)End Sub
Provare a generare nuovi colori
Con i colori generati migliorare l’interfaccia relativa al problema dell’area
Esercizio:
Creare una macro che permetta di calcolare il perimetro di un triangolo scaleno i cuilati sono dati in input.Colorare le celle dell’intestazione tutte dello stesso colore per ciò che riguarda i latiTutti i valori dei lati con un altro coloreI risultati con un terzo colore.
Lezione 4: Colorare le celle
16
Operatori MatematiciLe operazioni che si possono eseguire in Visual Basic sono le seguenti
Operatore Funzione Utilizzo
+ Somma Risultato = X + Y
- Sottrazione Risultato = X - Y
* Moltiplicazione Risultato = X * Y
/ Divide e restituisce un numero a virgola mobile Risultato = X / Y
\ Divide e restituisce un numero intero Risultato = X \ Y
Mod Divide e restituisce solo il restoRisultato = X Mod YIl resto è un intero
^ Eleva a potenza Risultato = X ^ Y
Dove X e Y sono variabili o costanti di tipo numerico. Risultato deve sempre essereuna 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 triangoloequilatero il secondo per il calcolo e la visualizzazione del perimetro del triangolo il terzo per il calcolo e la visualizzazione dell’area del triangolo
2. realizzare un foglio elettronico contenente un pulsante che permetta di riceverein input gli importi di tre prodotti acquistati al supermercato , calcoli l’importototale e li visualizzi tutti i dati ordinatamente in un foglio excel:
3. modificare il precedente progetto aggiungendo un pulsante che richieda lapercentuale di sconto e visualizzi il prezzo scontato
Lezione 5: Operatori matematici
17
Le Routine
Con la creazione di routine è possibile dividere il codice in blocchi separati. Questopermette 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, inquanto un modulo può contenere più routine contemporaneamente.
Finora abbiamo scritto tutte routine del primo tipo, cioè sub.
Esiste un metodo che permette a colpo d’occhio di determinare il tipo di una routine .Innanzitutto, di fronte ad un problema decido quali passi devo compiere per giungerealla 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 valoridell’area e del perimetro in modo gradevole.
La prima parte di analisi determina le mie aspettative: come sarà il foglio excel?
La seconda fase dell’analisi riassume le operazioni che intendo eseguire: Preparare le intestazioni (BASE, ALTEZZA, PERIMETRO,AREA) Richiedere all’utente la misura della base Calcolare la misura dell’altezza Calcolare la misura del perimetro Calcolare la misura dell’area Visualizzare i valori calcolati
Lezione 6: Le routine
18
Tutte queste operazioni individuate possono essere eseguite a mano, utilizzandoanche le formule di excel, oppure posso chiedere al computer di eseguirle al click delpulsante ESEGUI.
Per sfruttare pienamente il computer posso chiedermi se alcune delle operazionipreviste sono già state utilizzate in precedenza.Osservo che tutte le operazioni descritte sono già state eseguite in precedentiproblemi, ( Più precisamente nell’esercizio precedente) non è necessario ripeterel’analisi e la codifica di tali operazioni, ma solo controllare che siano state scrittecorrettamente e riutilizzarle opportunamente. A differenza dell’esercizio precedentenon servono tre pulsanti, ma solo uno da cui richiamo la procedura esegui.La subroutine esegui associata a questo pulsante richiamerà le procedure scritteprecedentemente.
NOTA: l’ordine con cui sono state scritte le sub e l’ordine di richiamo non deve essereobbligatoriamente lo stesso.Alcune variabili sono dichiarate all’interno delle subroutine, la variabile “base” èdichiarata sopra le routine. Ciò dipende dalla VISIBILITA’ delle stesse.
Lezione 6: Le routine
19
VISIBILITA’La visibilità di una variabile, o di una costante, definisce la sua disponibilità all'internodel progetto. Puoi dichiarare variabili e costanti a tre livelli:
Livello locale: vanno dichiarate all'interno della routine e sono disponibili soloall'interno di essa.
Ad esempio altezza, area e perimetro sono variabili locali alle routine. Non sonointeressata a conoscerne i valori in altre parti del programma.
Livello di modulo: Vanno dichiarate in testa alla finestra di modulo di codice esono viste da tutte le routine contenute all'interno del modulo di codice;
è il caso della variabile base che posso dichiarare, oltre che con la parolachiave dim anche cn la parola chiave Private
Livello pubblico: Vanno dichiarate in testa alla finestra di modulo di codice esono viste da tutte le routine e da tutti i moduli di codice appartenenti alprogetto. Sono dichiarate Pubblic
Esercizio:individua i livelli di visibilità delle variabili nel seguente codice:
Public risultato1 As IntegerPublic risultato2 As IntegerPublic sottraendo As IntegerPrivate operatore As IntegerSub somma()
Dim Addendo As Integeroperatore = 5
Addendo = 5 risultato1 = Addendo + operatore MsgBox "Il risultato della somma è: " & risultato1, _ vbInformation, "Somma"End SubSub sottrazione() Dim sottraento As Integer sottraento = 2 risultato2 = operatore - sottraento MsgBox "Il risultato della sottrazione è: " & risultato2, _ vbInformation, "Sottrazione"
End Sub
VARIABILE LIVELLO LOCALE LIVELLO DI MODULO LIVELLO PUBBLICOrisultato1risultato2sottraendooperatoreAddendosottraento
Lezione 6: Le routine
20
Prova ora a completare l’esercizio 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 coloraRange("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 SingleDim 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
Lezione 6: Le routine
21
Sub esegui()
'richiama nell'ordine desiderato le sub precedentemente scritte Call Prepara_Intestazioni Call Input_DatiCall 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 diistruzioni per il calcolo di un algoritmo. La soluzione dell’algoritmo non vienedirettamente 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 Basicciccando su “?”
Aprire il volumeDocumentazione di Microsoft Visual Basic ,poi il volume Riferimenti al linguaggio di Visual Basiced infine Funzioni.Le funzioni sono raccolte in ordinealfabetico. La funzione Sqr sarà nel quintovolume
Lezione 6: Le routine
22
Scelta la funzione desiderata si apriràuna finestra esplicativa della funzionestessa.
È possibile scrivere autonomamente delle funzioni, il cui valore restituito può essere assegnato ad unavariabile. La stessa funzione può essere richiamata ( cioè utilizzata) più volte, ogni volta che necessita.
Calcolare la misura del perimetroDa sviluppare come esercizio
Calcolare la misura dell’area 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 inputBaseCall S_perimetro
Call S_altezza Call S_area Call visualizza Call coloraCelle Call AdattaCelleEnd Sub
Per migliorare l’aspetto grafico posso richiamare le procedure per colorare lecelle 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 nelrichiamo della stessa:
Dichiarazione di una funzione
Public Function identificativo della funzione (elenco dei parametri formali) As tipodel dato restituitoAs esempio:Public Function F_area() As Single
Lezione 6: Le routine
23
F_area = base * altezzaEnd FunctionIl 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 AdattaCelleEnd SubSia i parametri formali che attuali possono essere 0 o più.Se non ci sono parametri le parentesi restano vuote.
Lezione 6: Le routine
24
I costrutti di programmazione: La selezione
A volte occorre prendere delle decisioni: se una condizione è verificata allora sieseguono alcune operazioni, altrimenti se ne eseguono delle altre .Il flow chart che rappresenta l’istruzione 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 condizionenon verificata;
If "condizione" then "istruzione"Else "istruzione"End if
condizione
Istruzione daeseguire seFALSO
Istruzione daeseguire se VERO
F V
Lezione 7: I costrutti di programmazione - If Then Else
25
Esempio:verificare che il numero inserito dall’utente sia un valore positivo.
Questo problema si presenta ogni volta che un utente inserisce dei valori cherappresentano quantità o dimensioni obbligatoriamente positive, come ad esempio lamisura di un lato di una figura, la somma depositata in banca o il voto di un compitoin classe.
Scrivere il seguente codice ed associarlo ad un pulsanteOption ExplicitDim VariabileInputSub 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 SubVerificarne la correttezza digitando, in tre prove diverse, un numero positivo, unonegativo e infine uno 0.
Esempio:verificare se un valore digitato è un carattere o un numero
E’ sempre utile, quando si chiede all’utente di inserire un numero, verificare che ladigitazione sia corretta.Scrivere il seguente codice ed associarlo ad un pulsanteOption ExplicitDim 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 SubNella routine è usata l’istruzione: "IsNumeric" che definisce se il valore memorizzatonella variabile "VariabileInput" è numerico o stringa.
Lezione 7: I costrutti di programmazione - If Then Else
26
Per impostare la condizione si usano operatori di confronto:
Operatore Funzione
< Minore
<= Minore o Uguale
> Maggiore
>= Maggiore o Uguale
<> Diverso (utilizzabile anche con le stringhe)
ESERCIZI:
1. Richiedere all’utente due numeri e visualizzare il minore.
2. Un commerciante di frutta ha la possibilità di vendere solo il 60% della merce a prezzointero prima che questa diventi avariata, oppure può scegliere di applicare uno sconto suvendite di stock di 5 kg, sapendo che in tal modo riuscirà a vendere completamente lamerce. Ricevendo in input la quantità totale di merce, il prezzo al kg della merce, lapercentuale 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 deidati mediante inputbox.
Lezione 7: I costrutti di programmazione - If Then Else
27
Le useform
Utilizzando le Userform, è possibile costruire finestre personalizzate per visualizzare dati, o richiedereall’utente la digitazione di valori
In sostanza le finestre di dialogo permettono al programma di interagire con l’utente in modo più“sofisticato” e forniscono uno strumento versatile per svolgere le normali funzioni di Input e Output.L’oggetto Userform è una finestra di dialogo vuota e contiene una barra del titolo e un pulsante dichiusura, aggiungendo controlli a un oggetto di tipo Userform è possibile personalizzare l’aspetto e lafunzionalità della finestra di dialogo.
Per inserire in un file di Excel una Userform, entriamo nell’editor del VBA clicchiamo su inserisci nellabarra de menu e scegliamo la voce useform
Oppure clicchiamo sull’icona inserisci Useform
e ci comparirà una schermata come la seguente
Lezione 8: I form
28
Possiamo notare che nella finestra di destra ci è comparsa una Form vuota e un box (Casella deglistrumenti) che ci permette di inserire i vari controlli all’interno della nostra Userform.La Userform ora è creata, possiamo modificarla a piacere, basta posizionarsi in un angolo (inferioredestro) e trascinare il mouse tenendo premuto il tasto sinistro e rilasciarlo quando abbiamo raggiunto ledimensioni desiderate.
Come prima cosa personalizziamo la useform:
Cambiamo il titolo:
nella finestra delle proprietà seleziono caption e modifico il contenutoscrivendo primo form
modifico anche la proprietà Back Color:
cliccando su essa si apre una finestra con due schede: Tavolozza eSistema.
Se scelgo Tavolozza, cliccando su un colore a mio piacimento, modifico ilcolore di sfondo della Userform.
All’interno della Userform posso inserire degli strumenti.
Scelgo un pulsante che posiziono nell’angolo in basso a destra dellafinestra.
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 MePrivate Sub cmdFine_Click() Unload MeEnd Sub
I metodi hide e show
Hide : Nasconde la finestra di dialogo (la Userform) senza liberare la memoria associata all’oggetto, inquesto 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 effettuatoil caricamento
La Form appena creata è presente, ma deve essere veicolata per poter renderla visibile, un sistema perottenere questo è il seguente: dal menù file seguiamo questo percorso Inserisci > Modulo
Nel “Modulo1” digitiamo il seguente codice
Sub Mostra()Userform1.ShowEnd sub
Associamo ora la macro ad un pulsante sul foglio di lavoro e premendo sul pulsante comparirà a video laUserform.
Lezione 8: I form
29
Esercizio Calcolatrice
Creare la seguente userform contenente due caselle di testo , una label e cinque commandbuttom
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
L’aspetto 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 IfEnd Sub
Private Sub cmdFine_Click() Unload MeEnd Sub
Private Sub CmdMeno_Click()lblris.Caption = Val(txtN1.Text) - Val(txtN2.Text)
End SubPrivate 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 SubPer definire le routine di evento riguardanti la cartella Excel attiva esiste un modulo di codice predefinitodenominato "ThisWorkbook", visibile in finestra di progetto.
Inserire la routine seguente nel modulo di codice "ThisWorkBook" .
Private Sub Workbook_Open() Frmcalcolatrice.showEnd Sub
La routine attiva la UserForm "Frmcalcolatrice" quando viene aperto il documento Excel.
Lezione 8: I form
30
Le useform
Proviamo ora a migliorare l’aspetto delle form utilizzate.È possibile operare sia sullo sfondo che sui singoli strumenti agendo sulle proprietà degli strumentistessi.Selezioniamo la form appena creata in modo che la finestra delle proprietà indichi in modo esplicitoche si tratta del form interessato
Cliccare su name e modificare il nome del form in FrmIndovinaNumeroDa 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 l’oggetto è un formIndovinaNumero mi ricorda che in questo form voglio creare un gioco che mi permetta, con unnumero 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 alform modifico la caption
Lezione 9: I form parte II
31
Posso ora migliorare lo sfondo colorandolo, agendo sulla proprietà BackColor.click sulla freccia a destra di BackColor.Click su tavolozzaScelta del colore
Posso anche scegliere un immagine di sfondo agendo sulla proprietà Picture:
Click su
Scelta di un file immagine (ad esempioJPEG) selezionando opportunamente ilpercorso.
Lezione 9: I form parte II
32
I CICLI
Ripetizione di azioni con i cicli
Nei programmi spesso è necessario svolgere molte volte una determinata azione, Icomandi 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 (odecrementando) una variabile specifica, finche l'indice non raggiunge il valore indicatodall'attributo "To".
Esempio:Sub CicloFor() For i = 1 To 10
MsgBox "Il valore incremento è " & i, _vbInformation, "Ciclo For"
NextEnd Sub
Per contare all’indietro basta sostituire la riga"For i = 1 To 10"con"For i = 10 To 1 step -1"
For i= inizio to fine
Istruzioni del ciclo
i
For i = inizio to fine IstruzioniNext
Lezione 10: I costrutti di programmazione - Il ciclo For
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 IntegerDim zonamia As Variant
Randomize
Set zonamia = Range("A1:C10")
NumCelle = zonamia.CountFor 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 successivachiamata alla funzione Rnd utilizza il numero casuale precedente come base per il numero successivo nellasequenza.
Prima di richiamare Rnd, utilizzare l'istruzione Randomize senza argomento per inizializzare il generatoredi 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)
Setfissa 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 everbosa, da qui deriva la possibilità di applicare anche a un oggetto Range la proprietà Count e gli indicinumerici.
Lezione 10: I costrutti di programmazione - Il ciclo For
34
Esercizio1: scrivere una procedura, associata ad un pulsante, che scriva i numeri da 20 a 50nell’intervallo “A10:E15” , colori lo sfondo delle celle di verde e utilizzi il carattere"Lucida Handwriting"
per cambiare lo stile dei caratteri usare l’oggetto font e le relative proprietà:Bold se settato a true il carattere è in grassetto
(Range("A1:A5").Font.Bold = True)Color imposta il colore principale del carattereColorIndex Il colore viene specificato come valore di indice nella tavolozza di colori corrente
(Range("A1").Font.ColorIndex = 3)FontStyle imposta lo stile del carattere
(Range("A1").Font.FontStyle = "Bold Italic" )Italic imposta a corsivo lo stile del carattere
(Range("A1:A5").Font.Italic = True)Name imposta il nome dell'oggetto.
Nel caso del font assegnando il nome di un carattere assume quel carattere(Range(“A1”).Font.Name=”Arial”)
Shadow il carattere è ombreggiato assegnandogli il valore trueSize imposta la dimensione del carattere.Strikethrough Ha valore True se il carattere è barratoSubscript Ha valore True se il carattere è formattato a pedice
Questo esempio formatta come pedice il secondo carattere della cella A1.
Range("A1").Characters(2, 1).Font.Subscript = True
Superscript Ha valore True se il carattere è formattato ad apiceUnderline imposta il tipo di sottolineatura applicato al carattere
Può essere una delle seguenti costanti
(Range(“A1”).Font. Underline = xlUnderlineStyleSingle )
xlUnderlineStyleNonexlUnderlineStyleSingle
xlUnderlineStyleDouble
xlUnderlineStyleSingleAccounting
xlUnderlineStyleDoubleAccounting
Esercizio 2Scrivere una procedura che conti, nell’intervallo “C12:D18” quante volte compare unvalore dato in input
Esercizio3Scrivere una procedura che permetta l’input di 15 valori e li memorizzi in altrettantecelle adiacenti nella colonna C, e visualizzi la somma di tali valori nella cellasuccessiva.
Lezione 10: I costrutti di programmazione - Il ciclo For
35
Ciclo con controllo in testa
Il ciclo "Do… loop" continua ad eseguire il codice fino a quando non è soddisfatta unacondizione. Se non viene specificata una condizione d’interruzione, o se la condizionenon è impostata in modo non corretto, il ciclo continua all’infinito.
Ripeti finchè la condizione non risulta vera (cicla per vero).
Sub CicloDo() i = 1 Do While i < 10 MsgBox "Il valore incremento è " & i, _
vbInformation, "Ciclo While" i = i + 1 LoopEnd Sub
condizione si
Istruzioni delciclo
no
i<10 si
no
“Il valoreincremento è “ i
i=i+1
Lezione 11: I costrutti di programmazione - I cicli Do Loop e While
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
LoopEnd 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
LoopEnd Sub
E inoltre il controllo può essere effettuato prima dello istruzioni del ciclo (controllo intesta) o dopo di esse (controllo in coda).
Controllo in testa:
While condizione[istruzioni]
Wend
Esegue una serie di istruzioni finché la valutazione di una determinata condizione dà come risultatoTrue.
i<10 si
no
“Il valoreincremento è “ i
i=i+1
Lezione 11: I costrutti di programmazione - I cicli Do Loop e While
37
La sintassi dell'istruzione While...Wend è composta dalle seguenti parti:
Parte Descrizione
condizione Obbligatoria. Espressione numerica o espressione stringa che può dare comerisultato True o False. Se condizione è Null, viene considerata False.
istruzioni Facoltativa. Una o più istruzioni eseguite finché la condizione è True.
osservazioni
Se condizione è True, verranno eseguite tutte le istruzioni fino all’istruzione Wend. Il controllotornerà 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'istruzionesuccessiva all'istruzione Wend.
I cicli While...Wend possono essere nidificati a qualsiasi livello. Ciascuna istruzione Wendcorrisponderà all’istruzione While più recente.
Oppure:
Do [{While | Until} condizione][istruzioni]
[istruzioni]
Loop
Controllo in coda:
Do[istruzioni]
[istruzioni]
Loop [{While | Until} condizione]
i>10si
no
“Il valoreincremento è “ i
i=i+1
Lezione 11: I costrutti di programmazione - I cicli Do Loop e While
38
La sintassi dell’istruzione Do... Loop è composta dalle seguenti parti:
Parte Descrizione
condizione Facoltativa. Espressione numerica o espressione stringa che può dare comerisultato True o False. Se condizione è Null, viene considerata come False.
istruzioni Una o più istruzioni ripetute finché la valutazione di condizione è True.
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 allivello di nidificazione immediatamente superiore al ciclo appena terminato.
Esercizi:
1) Realizzare un form contenente un pulsate che permetta di ripetere, fino a chel’utente sceglie di terminare il programma, l’inserimento di un numero ed ilcalcolo del quadrato e del cubo. Visualizzare gli output mediante MsgBox.Nota : per chiedere all’utente se desidera continuare l’applicazione o terminarlausare nella casella di MessageBox, come buttom l’opzione vbYesNo e percontrollare se la risposta è positiva controllare che sia uguale a vbYes.
2) Richiamare una macro che permetta di inserire una serie di valori e calcolareseparatamente la somma dei positivi e dei negativi. Visualizzare infine talisomme sul foglio excel che ospita il pulsante.
3) Inserire un insieme di valori a piacimento dell’utente e visualizzare quanti sonostati inseriti.
4) Sommare i primi numeri naturali fino ad ottenere un mumero maggiore ouguale di un valore prefissato e comunicare quanti valori è stato necessariosommare.
Lezione 11: I costrutti di programmazione - I cicli Do Loop e While
39