excel vba per tutti

61
EXcel VBA X tutti - Obiettivi Excel VBA Per Tutti Indice Introduzione - Obiettivi Lezione 1 - Ambiente di sviluppo La piattaforma di sviluppo Il generatore di Macro Lezione 2 - La sintassi Basic Le Routine La Visibilità Prendere delle decisioni Operatori Logici, Matematici e di Confronto Ripetizione di azioni con i cicli Funzioni di manipolazione delle stringhe Eliminazione degli errori: Il Debug Lezione 3 - Creare l'Interfaccia Utente Oggetti e Proprietà Il codice associato all’Interfaccia utente I Metodi Esempio riepilogativo Lezione 4 - Gli Oggetti di Excel Gli Oggetti Application e WorkBook Gli Oggetti WorkSheet e Range Le Proprietà Cells, OffSet e Union Le Proprietà Columns e Rows Lezione 5 - Esempi Pratici Esempi di automazioni su oggetti Excel 1 Esempi di automazioni su oggetti Excel 2 Esempi sulle interfaccia utente 1 Esempi sulle interfaccia utente 2 Esempi sulle interfaccia utente 3 Cognolato Studio © 2004

Upload: stefanoalfazeta

Post on 30-Nov-2015

1.034 views

Category:

Documents


59 download

DESCRIPTION

Indice:Introduzione - ObiettiviLezione 1 - Ambiente di sviluppoLezione 2 - La sintassi BasicLezione 3 - Creare l'Interfaccia UtenteLezione 4 - Gli Oggetti di ExcelLezione 5 - Esempi Pratici

TRANSCRIPT

Page 1: Excel VBA Per Tutti

EXcel VBA X tutti - Obiettivi

file:///C:/Users/Butter/AppData/Local/Temp/Rar$EX00.901/Corso/indice.html[15/02/2010 00:56:49]

Excel VBA Per Tutti

Indice

Introduzione - Obiettivi

Lezione 1 - Ambiente di sviluppo La piattaforma di sviluppo Il generatore di Macro

Lezione 2 - La sintassi Basic Le Routine La Visibilità Prendere delle decisioni Operatori Logici, Matematici e di Confronto Ripetizione di azioni con i cicli Funzioni di manipolazione delle stringhe Eliminazione degli errori: Il Debug

Lezione 3 - Creare l'Interfaccia Utente Oggetti e Proprietà Il codice associato all’Interfaccia utente I Metodi Esempio riepilogativo

Lezione 4 - Gli Oggetti di Excel Gli Oggetti Application e WorkBook Gli Oggetti WorkSheet e Range Le Proprietà Cells, OffSet e Union Le Proprietà Columns e Rows

Lezione 5 - Esempi Pratici Esempi di automazioni su oggetti Excel 1 Esempi di automazioni su oggetti Excel 2 Esempi sulle interfaccia utente 1 Esempi sulle interfaccia utente 2 Esempi sulle interfaccia utente 3

Cognolato Studio © 2004

Page 2: Excel VBA Per Tutti

EXcel VBA x tutti - Obiettivi

file:///C:/Users/Butter/AppData/Local/Temp/Rar$EX00.901/Corso/Corso/introduzione.html[15/02/2010 00:56:51]

Obiettivi

Visual Basic for Application (VBA) è presente nelle applicazioni Officecome: Word, Excel, Power Point ed Access. La sua funzione è quella direndere programmabili questi applicativi, allo scopo di personalizzarli aseconda delle esigenze specifiche dell'utente. La mia esperienza derivadall'utilizzo quotidiano del PC e dalla scoperta di questa potenzialitàgiorno per giorno, aiutato anche dalla mia professione diprogrammatore.

Molte persone utilizzano correntemente il pacchetto Office,normalmente in uso in molti personal computer, ma ignorano questotipo di funzionalità. Il mio obiettivo è quello di fornire le basi su questotipo di programmazione anche a chi non è un programmatoreprofessionista. La trattazione riguarderà solamente Microsoft Excel lecui prestazioni aumentano notevolmente grazie a VBA, tuttavia non vadimenticato che questo tipo di funzionalità può essere usato anche inWord, Access e Power Point.

Requisito fondamentale per coloro i quali intendessero seguirmi inquesto percorso formativo, è solamente una discreta conoscenza diMicrosoft Excel. Non voglio tediare il lettore con concetti astrusi ecomplicati, ma solamente dare familiarità con l'ambiente di sviluppo eun'infarinatura sui concetti della programmazione VBA, quindi dare achi apprende un minimo di indipendenza nell'iniziare a personalizzare ipropri fogli di lavoro.

Inizierò col descrivere l'ambiente di lavoro in cui andremo ad operare.In seguito spiegherò come creare un'interfaccia utente (finestra dicomandi) e come inserire il codice per farla funzionare. Le ultimesezioni saranno dedicate ad esempi pratici.

Affrontare un nuovo argomento è sempre un passo difficile, ma quandocomincerai a vedere i primi risultati concreti, il mondo di Excel VBA tiaffascinerà!

Buona lettura!

Cognolato Studio © 2004

Page 3: Excel VBA Per Tutti

EXcel VBA x tutti - Ambiente

file:///C:/Users/Butter/AppData/Local/Temp/Rar$EX00.901/Corso/Corso/Ambiente.html[15/02/2010 00:56:51]

Ambiente di sviluppo

L’ambiente di sviluppo di Visual Basic For Application è facilmenteaccessibile dal menù "Strumenti"; "Macro"; "Visual Basic Editor". Quiavremo modo di progettare e sviluppare programmi in Visual Basic, invirtù del fatto che gli strumenti sono perfettamente integrati conMicrosoft Excel.

I progetti realizzabili con VBA possono essere di tre tipi:

Progetto di documentoProgetto di modelloProgetto di componente aggiuntivo dell’applicazione

Nei "Progetti di documento" tutti i componenti del progetto sono legatialla cartella di lavoro utilizzata al momento, e non andranno adintaccare ne l’applicazione Excel, ne i suoi modelli generali; quindi ilcodice rimarrà confinato nel file aperto. Nel momento in cui il filecambierà posizione il nostro progetto si sposterà con esso. Diconseguenza, quando chiuderemo la nostra cartella e ne apriremo unanuova non avremo a disposizione il progetto da noi creato.

Nei "Progetti di modello" invece il codice generato è associato almodello generale di Microsoft Excel, quindi aprendo una nuova cartellaExcel o qualsiasi cartella esistente avremo sempre a disposizione ilnostro progetto VBA.

I componenti aggiuntivi sono strumenti per ampliare le funzionalità diMicrosoft Excel, come, ad esempio, un comando personalizzatorichiamadile dalla barra degli strumenti o da una voce di menù. Anchequesta tipologia di progetto non è legata solamente al documentocorrente ma direttamente all’applicazione Excel.

Cognolato Studio © 2004

Page 4: Excel VBA Per Tutti

EXcel VBA x tutti - Ambiente

file:///C:/Users/Butter/AppData/Local/Temp/Rar$EX00.901/Corso/Corso/Ambiente1.html[15/02/2010 00:56:52]

La piattaforma di sviluppo

L’editor visual Basic offre numerosi strumenti avanzati di sviluppo eprogrammazione:

1. Finestra di progetto: mostra l’elenco gerarchico dei progetti aperti e di tutti imoduli di codice e finestre di interfaccia appartenenti ad un determinatoprogetto. Ad ogni progetto sono associate quattro cartelle a seconda del tipodi modulo che viene sviluppato.

Microsoft Excel oggetti: contiene il codice legato ai fogli ed alla cartelladi lavoro.Form: contiene le interfaccia utente associate al progetto.Moduli: contiene i moduli di codice generici.Moduli di classe: contiene i moduli per la creazione di nuove classi dioggetti.

2. Finestra Userform (interfaccia utente): Questa finestra ci permette di crearefinestre di interfaccia utente personalizzate da applicare ai programmi VBA,simili in tutto e per tutto a quelle proprie di Microsoft Excel.

3. Finestra delle proprietà: mostra l’elenco, alfabetico o per categorie, di tuttele proprietà (altezza, larghezza, colori, font, descrizioni, ecc…) appartenentiad un controllo contenuto in uno "UserForm" o ad uno "UserForm" stesso.

4. Modulo di codice: Luogo dove viene scritto il codice Visual Basic. Esistono tre

Page 5: Excel VBA Per Tutti

EXcel VBA x tutti - Ambiente

file:///C:/Users/Butter/AppData/Local/Temp/Rar$EX00.901/Corso/Corso/Ambiente1.html[15/02/2010 00:56:52]

tipi di moduli di codice: generici, di classe e di userform.

5. Casella degli strumenti: contiene una serie di controlli necessari per costruirel’interfaccia utente. Per spostare i controlli nella "UserForm" basta cliccaresull’oggetto interessato e mantenendo premuto il tasto sinistro trascinarlosulla finestra Userform.

6. Finestra immediata; Finestra Variabili locali; Finestra espressioni di controllo:Finestre usate per il Debug (eliminazione degli errori sintattici e logici) delcodice.

7. Visualizzatore degli oggetti: elenco di tutti gli oggetti, metodi, proprietà edeventi appartenenti ad un controllo o all’applicazione Excel.

Cognolato Studio © 2004

Page 6: Excel VBA Per Tutti

EXcel VBA x tutti - Ambiente

file:///C:/Users/Butter/AppData/Local/Temp/Rar$EX00.901/Corso/Corso/Ambiente2.html[15/02/2010 00:56:52]

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". Il processo è molto simile alla registrazione di musica inuna cassetta. Quando viene richiamata la registrazione, vengono ripetute le stesseazioni 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. Laregistrazione di macro è molto utile perchè permette di vedere l’esatta sintassinecessaria per la gestione degli oggetti Excel. Essa inoltre permette di scriverecodice Visual Basic con maggiore facilità, evitando continue ricerche nella guida inlinea.

Il codice registrato sottoforma di macro non sarà perfettamente adeguato alleesigenze di progettazione, ma spesso sarà una utile base di partenza per lascrittura dei programmi del nostro progetto, che in seguito verrà spostato e/omodificato grazie all’editor di Visual Basic.

Vediamo una semplice dimostrazione:

1. Apriamo un nuovo documento di Microsoft Excel. Dalla voce "Macro" delmenù "Strumenti" selezioniamo "Registra nuova macro".

2. Sulla finestra "Registra macro" assegniamo il nome "MacroScrivi" eclicchiamo "OK".

Page 7: Excel VBA Per Tutti

EXcel VBA x tutti - Ambiente

file:///C:/Users/Butter/AppData/Local/Temp/Rar$EX00.901/Corso/Corso/Ambiente2.html[15/02/2010 00:56:52]

3. A questo punto apparirà sul foglio un pulsante con un quadrattino nero ilquale indica che è iniziata la registrazione. Selezioniamo la casella "B2" dalfoglio Excel e scriviamo "Ciao Mondo", quindi clicchiamo sul quadrattino perterminare la registrazione.

4. Creiamo un’altra macro che chiameremo "MacroCancella" usando lo stessoprocedimento.

5. Durante la registrazione selezioniamo nuovamente la cella "B2" e cancelliamola scritta "Ciao Mondo".

A questo punto abbiamo creato due Macroistruzioni, visibili selezionando"Macro…" dalla voce "Macro" del menù "Strumenti".

6. Selezioniamo una delle due Macro e clicchiamo "Modifica". Entreremonell’Editor di Visual Basic dove potremo notare il nuovo modulo genericocontenente il codice di funzionamento delle macro: "MacroScrivi" e"MacroCancella".

7. Torniamo al foglio Excel, ed associamo le macro appena create a due pulsantidi comando.Inseriamo la barra degli strumenti "Moduli" dal menù "Visualizza", "barradegli strumenti".

Page 8: Excel VBA Per Tutti

EXcel VBA x tutti - Ambiente

file:///C:/Users/Butter/AppData/Local/Temp/Rar$EX00.901/Corso/Corso/Ambiente2.html[15/02/2010 00:56:52]

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 "MacroScrivi" e digitiamo "OK". Creiamo un nuovo pulsante sulfoglio e ripetiamo lo stesso procedimento per assegnare "MacroCancella".

Complimenti, avete creato la vostra prima macro in Excel!

Provate a crearne delle nuove usando lo stesso procedimento e leggete il codiceVisual Basic associato.

Cognolato Studio © 2004

Page 9: Excel VBA Per Tutti

EXcel VBA x tutti - La Sintassi Basic

file:///C:/Users/Butter/AppData/Local/Temp/Rar$EX00.901/Corso/Corso/Sintassi.html[15/02/2010 00:56:53]

La sintassi Basic

Affinché le nostre applicazioni funzionino è necessario inserire il codiceBasic, cioè le istruzioni che indicano al computer quali comandi eseguireed in che ordine. Il codice viene inserito nelle finestre "Modulo dicodice" all'interno dell'Editor di "Visual Basic". Per creare un nuovomodulo di codice, aprire un nuovo documento Excel ed entrarenell'Editor VBA. Quindi scegliere la voce "Modulo" dal menù "Inserisci".

Classificazione dei Dati

I dati utilizzati dai moduli di codice durante l'esecuzione dei programmivengono memorizzati all'interno delle "Costanti" e delle "Variabili". Levariabili rappresentano dati il cui valore cambia durante l'esecuzionedel programma, le costanti invece contengono sempre lo stesso valorepredefinito 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è quelleparole che servono per impartire le istruzioni al programma;come ad esempio: Loop, Function, Sub, End, Do, Integer, Case,If, For, Else, Then, Select.

Le variabili utilizzate non sono tutte uguali, possono essere numeriinteri, numeri decimali, stringhe di caratteri, date ecc... Valori diversihanno bisogno di un trattamento diverso. Per questo motivo in VisualBasic esistono tipi di dati differenti che possono essere dichiarati inmodo esplicito.

Tipo DescrizioneByte Accetta numeri da 0 a 255Integer Accetta numeri da -32768 a 32767Long Accetta numeri da -2147483648 a 2147483647

SingleAccetta numeri da -3,402823E38 a -1,401298E-45 pervalori negativi Da 1,401298E-45 a 3,402823E38 per valoripositivi

Double

Accetta numeri da -1,79769313486232E308 a -4,94065645841247E-324 per valori negativi Da4,94065645841247E-324 a 1,79769313486232E308 pervalori positivi

Boolean Accetta solo 2 valori "True" o "False"String Accetta da 0 a 65000 caratteri

Page 10: Excel VBA Per Tutti

EXcel VBA x tutti - La Sintassi Basic

file:///C:/Users/Butter/AppData/Local/Temp/Rar$EX00.901/Corso/Corso/Sintassi.html[15/02/2010 00:56:53]

Date Date dal 1 gennaio 100 al 31 dicembre 9999

Variant Se contiene solo numeri: come Double. Se contiene anchecaratteri: come String.

Per indicare con chiarezza che tipo di dato stiamo usando dobbiamodichiarare le variabili. Visual Basic assegna le variabili non dichiarate, odichiarate senza specificare il tipo di dato, al tipo Variant.

Anche se non è necessario, è buona norma dichiarare sempre variabilie costanti all'interno del codice, questo aiuta a ridurre gli errori discrittura del codice. Quando viene inserita la parola chiave "OptionExplicit" in cima al modulo di codice, Visual basic, in caso di mancatadichiarazione di una variabile, darà una segnalazione di errore.

Cognolato Studio © 2004

Page 11: Excel VBA Per Tutti

EXcel VBA x tutti - La Sintassi Basic

file:///C:/Users/Butter/AppData/Local/Temp/Rar$EX00.901/Corso/Corso/Sintassi1.html[15/02/2010 00:56:54]

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, in quanto un modulo puòcontenere più routine contemporaneamente.

Apriamo un modulo di codice dall'editor di Visual Basic e creiamo la nostra primaroutine digitando il codice seguente.

Sub PrimaRoutine() ' La riga successiva visualizza un messaggio MsgBox "Ciao Mondo", vbInformation, "Ciao" End Sub

Posizioniamo il cursore all'interno della routine e clicchiamo il tasto avvia:

Soffermiamo la nostra attenzione su due cose:La riga contrassegnata dall'apice iniziale indica una riga di commento equindi verrà ignorata durante l'esecuzione del programma. E' importantescrivere commenti nel listato perchè aiuta a rendere più comprensibili i nostriprogrammi.La riga successiva definisce una finestra di messaggio col comando MsgBox.La sintassi è:

MsgBox "Testo all'interno della finestra", vbInformation, _ "Testo che appare sulla barra del titolo"

"vbInformation" fa apparire l'icona col punto di domanda all'interno dellafinestra. Esistono altre opzioni che vengono fornite dall'elenco automaticodurante la stesura del codice.

Cognolato Studio © 2004

Page 12: Excel VBA Per Tutti

EXcel VBA x tutti - La Sintassi Basic

file:///C:/Users/Butter/AppData/Local/Temp/Rar$EX00.901/Corso/Corso/Sintassi2.html[15/02/2010 00:56:54]

La Visibilità

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 soloall'interno di essa.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.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.

Vediamo un esempio:

' Le seguenti variabili sono visibili in tutto il progetto Public risultato1 As Integer Public risultato2 As Integer Public sottraendo As Integer ' La seguente variabile è visibile a livello di modulo Private operatore As Integer Sub somma() ' La seguente variabile è visibile ' solo all'interno della routine Dim Addendo As Integer operatore = 5 Addendo = 5 risultato1 = Addendo + operatore MsgBox "Il risultato della somma è: " & risultato1, _ vbInformation, "Somma" End Sub Sub sottrazione() ' La seguente variabile è visibile ' solo all'interno della routine Dim sottraento As Integer sottraento = 2 risultato2 = operatore - sottraento MsgBox "Il risultato della sottrazione è: " & risultato2, _ vbInformation, "Sottrazione" End SubPosizionandosi all'interno di una delle routine e premendo il tasto azione noteremo ilrisultato:Soffermiamo la nostra attenzione su alcuni aspetti:

Il carattere "_" alla fine di una riga indica che si desidera continuarel'istruzione alla riga successiva.Il carattere "&" serve per concatenare due stringhe di caratteri.L'assegnazione del valore alla variabile avviene seguendo la sintassi:

NomeVariabileStringa = "Stringa di caratteri" ' una stringa di caratteri va immessa tra doppi apici. NomeVariabileNumerica = numero ' il numero non è immesso tra doppio apice.

L'attributo di visibilità può essere assegnato anche alle “Function” e alle “Sub”.Esempio:

' La procedura seguente è vista solamente a livello di modulo Private Sub visualizza() Dim numero1 As Integer Dim numero2 As Integer Dim numero3 As Integer numero1 = 15 numero2 = 5 numero3 = sottrazione(numero1, numero2) MsgBox "Il risultato della differenza è: " & numero3, _ vbInformation, "differenza" End Sub ' La funzione seguente è vista a livello di progetto Public Function sottrazione(operando1 As Integer, _

Page 13: Excel VBA Per Tutti

EXcel VBA x tutti - La Sintassi Basic

file:///C:/Users/Butter/AppData/Local/Temp/Rar$EX00.901/Corso/Corso/Sintassi2.html[15/02/2010 00:56:54]

operando2 As Integer) As Integer sottrazione = operando1 - operando2 End Function

Cognolato Studio © 2004

Page 14: Excel VBA Per Tutti

EXcel VBA x tutti - La Sintassi Basic

file:///C:/Users/Butter/AppData/Local/Temp/Rar$EX00.901/Corso/Corso/Sintassi3.html[15/02/2010 00:56:55]

Prendere delle decisioni

Una istruzione condizionale è uno speciale comando che permette di valutare una opiù condizioni per eseguire un particolare blocco di istruzioni. Il concetto è: se siverifica la condizione allora esegui questa istruzione.

In Visual Basic le istruzioni condizionali più semplici sono:

If "condizione" then "istruzione" End if If "condizione" then "istruzione" else "istruzione" End if Vediamo un esempio:

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, "valutazione 1" Else MsgBox "la variabile è un carattere o una stringa di caratteri", _ vbInformation, "valutazione 2" End If 'fine dell’ istruzione condizionale End SubSoffermiamo la nostra attenzione su due aspetti:

Nella routine è usata l’istruzione: "IsNumeric" che definisce se il valorememorizzato nella variabile "VariabileInput" è numerico o stringa.L’istruzione "InputBox" apre una finestra contenente una casella di testo, seimmettiamo del testo e clicchiamo "Ok" la funzione restituisce il valoredigitato.

Con l’istruzione ElseIf è possibile valutare più espressioni all’interno dello stessoblocco. Esempio:

Sub ValutaNumero() VariabileInput = InputBox("immettere un numero") If VariabileInput <= 1 Then MsgBox "la variabile è minore o uguale a 1", vbInformation, _ "valutazione 1" ElseIf (VariabileInput > 1) And (VariabileInput <= 5) Then MsgBox "la variabile è maggiore di 1 e minore o uguale a 5", _ vbInformation, "valutazione 2" ElseIf (VariabileInput > 5) And (VariabileInput <= 10) Then MsgBox "la variabile è maggiore di 5 e minore o uguale a 10", _ vbInformation, "valutazione 3" Else MsgBox "la variabile è maggiore di 10", vbInformation, _ "valutazione 4" End If End SubSoffermiamo la nostra attenzione su un aspetto:

Nella routine sono usati degli operatori logici e matematici come: "And", ">","<=". Essi verranno trattati nel prossimo paragrafo.

Una istruzione molto simile a "If ... ElseIf ..." è "Select Case ..." Proviamo amodificare l’esempio precedente:

Sub valutaNumero() VariabileInput = InputBox("immettere un numero")

Page 15: Excel VBA Per Tutti

EXcel VBA x tutti - La Sintassi Basic

file:///C:/Users/Butter/AppData/Local/Temp/Rar$EX00.901/Corso/Corso/Sintassi3.html[15/02/2010 00:56:55]

Select Case VariabileInput Case Is <= 1 MsgBox "la variabile è minore o uguale a 1", vbInformation, _ "valutazione 1" Case 2 To 5 MsgBox "la variabile è maggiore di 1 e minore o uguale a 5", _ vbInformation, "valutazione 2" Case 6 To 10 MsgBox "la variabile è maggiore di 5 e minore o uguale a 10", _ vbInformation, "valutazione 3" Case Else MsgBox "la variabile è maggiore di 10", vbInformation, _ "valutazione 4" End Select End Sub

Cognolato Studio © 2004

Page 16: Excel VBA Per Tutti

EXcel VBA x tutti - La Sintassi Basic

file:///C:/Users/Butter/AppData/Local/Temp/Rar$EX00.901/Corso/Corso/Sintassi4.html[15/02/2010 00:56:55]

Operatori Logici, Matematici e di Confronto

Operatori matematici:

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 resto Risultato = X Mod YIl resto è un intero

^ Eleva a potenza Risultato = X ^ Y

Gli operatori logici gestiscono i valori true e false. Di seguito sono riportati glioperatori logici più comuni:

Operatore Funzione

And If (condizione1) And (condizione2) then...Verificata se entrambe le condizioni sono vere.

Or If (condizione1) Or (condizione2) then...Verificata se almeno una condizione è vera.

Not If Not (condizione1) then...Verificata se “condizione1” è falsa.

Operatori di confronto:

Operatore Funzione< Minore<= Minore o Uguale> Maggiore>= Maggiore o Uguale<> Diverso (utilizzabile anche con le stringhe)

Cognolato Studio © 2004

Page 17: Excel VBA Per Tutti

EXcel VBA x tutti - La Sintassi Basic

file:///C:/Users/Butter/AppData/Local/Temp/Rar$EX00.901/Corso/Corso/Sintassi5.html[15/02/2010 00:56:56]

Ripetizione di azioni con i cicli

Nei programmi spesso è necessario svolgere molte volte una determinata azione,variando solamente alcuni parametri. I comandi descritti in questa sezioneeseguono ripetutamente le stesse istruzioni, finché non si verifica una determinatacondizione.

Il ciclo "For.. Next" esegue ripetutamente un blocco di codice incrementando (odecrementando) una variabile specifica, finche l'indice non raggiunge il valoreindicato dall'attributo "To". Esempio:

Sub CicloFor() For i = 1 To 10 MsgBox "Il valore incremento è " & i, _ vbInformation, "Ciclo For" Next End Sub Ora prova a sostituire la riga

"For i = 1 To 10"

con

"For i = 10 To 1 step -1"

Il ciclo "Do… loop" continua ad eseguire il codice fino a quando non è soddisfattauna condizione. Se non viene specificata una condizione d’interruzione, o se lacondizione non è impostata in modo non corretto, il ciclo continua all’infinito.

Esistono tre tipologie di ciclo "Do":

Ripeti finchè la condizione non risulta falsa (cicla per falso).

Sub CicloDo() i = 1 Do MsgBox "Il valore incremento è " & i, _ vbInformation, "Ciclo For" i = i + 1 Loop Until i > 10 End Sub

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 For" i = i + 1 Loop End Sub

Uscita anticipata dal ciclo:

Sub CicloDo() i = 1 Do MsgBox "Il valore incremento è " & i, _ vbInformation, "Ciclo For" i = i + 1 If i > 10 Then Exit Do Loop End Sub

Page 18: Excel VBA Per Tutti

EXcel VBA x tutti - La Sintassi Basic

file:///C:/Users/Butter/AppData/Local/Temp/Rar$EX00.901/Corso/Corso/Sintassi5.html[15/02/2010 00:56:56]

Cognolato Studio © 2004

Page 19: Excel VBA Per Tutti

EXcel VBA x tutti - La Sintassi Basic

file:///C:/Users/Butter/AppData/Local/Temp/Rar$EX00.901/Corso/Corso/Sintassi6.html[15/02/2010 00:56:56]

Funzioni di manipolazione delle stringhe

La tabella seguente, riassume alcune delle funzioni predefinite di Visual Basic permanipolare le Stringhe.

Funzione Descrizione Esempio Risultato

Len() Determina la lunghezzadi una stringa NomeVar = Len("Stringa") 7

LCase() Converte i caratteri damaiuscoli a minuscoli NomeVar = LCase("Stringa") stringa

UCase() Converte i caratteri daminuscoli a maiuscoli NomeVar = UCase("Stringa") STRINGA

StrReverse() Inverte le stringhe NomeVar =StrReverse("Stringa") agnirtS

Left() Estrae i primi caratteridi una stringa NomeVar = Left("Stringa", 3) Str

Right() Estrae gli ultimicaratteri di una stringa NomeVar = Right("Stringa", 3) nga

Mid() Estrae i caratteri di unastringa NomeVar = Mid("Stringa", 3,4) ring

InStr() Trova una parte distringa su un’altra

NomeVar = InStr("Stringa","n") 5

LTrim() Elimina tutti gli spaziiniziali NomeVar = LTrim(" Stringa ") "Stringa "

RTrim() Elimina tutti gli spazifinali NomeVar = RTrim(" Stringa ") " Stringa"

Trim() Elimina tutti gli spaziiniziali e finali NomeVar = Trim(" Stringa ") "Stringa"

CStr() Converte in una stringa NomeVar = CStr(10) "10"

*CInt() Converte in un numerointero NomeVar = CInt("10") 10

*Ogni tipologia di dato possiede la propria funzione di conversione: CDbl(); CSng();CLng(); Cbool(); CByt(); Cdate().

Cognolato Studio © 2004

Page 20: Excel VBA Per Tutti

EXcel VBA x tutti - La Sintassi Basic

file:///C:/Users/Butter/AppData/Local/Temp/Rar$EX00.901/Corso/Corso/Sintassi7.html[15/02/2010 00:56:57]

Eliminazione degli errori: Il Debug

Una volta sviluppato il codice è possibile usare gli strumenti di Debug di Visual Basic per vederel'esecuzione del codice passo-passo, ed eliminare eventuali errori.

Eseguendo un programma è possibile interrompere l'esecuzione ad una determinata riga e valutare lostato delle variabili. Questo è possibile impostando dei punti di interruzione. Per determinare i punti diinterruzione posizionare il cursore nella riga interessata e selezionare la voce "imposta/rimuovi punto diinterruzione" dal menù "Debug" (oppure premere il tasto "F9").

Quando lanciamo il programma, premendo il comando "Esegui" (o il tasto "F5"), l'esecuzione verràbloccata all'altezza del primo punto di interruzione incontrato. A questo punto rimangono tre alternative:interrompere l'esecuzione, completare l'esecuzione o eseguire il codice riga per riga (premendo il tastoF8).

Page 21: Excel VBA Per Tutti

EXcel VBA x tutti - La Sintassi Basic

file:///C:/Users/Butter/AppData/Local/Temp/Rar$EX00.901/Corso/Corso/Sintassi7.html[15/02/2010 00:56:57]

Visual Basic mette a disposizione alcuni strumenti, per visualizzare i valori che assumono le variabili nelcorso dell'elaborazione. Il più immediato è la casella di descrizione che appare posizionando il cursoresulla riga in esecuzione, essa è simile alla casella di descrizione dei comandi che appare quando mantieniil cursore per qualche istante su un comando.

Visual Basic offre tre finestre nelle quali è possibile monitorare il valore delle variabili nel corsodell'elaborazione.

La finestra "Variabili Locali"La finestra "Espressioni di controllo"La finestra "Immediata"

Tutte e tre sono disponibili dal menù "Visualizza".

La finestra "Variabili Locali" mostra semplicemente i valori di tutte le variabili contenute nella routinecorrente mentre è in esecuzione.

La finestra "Espressioni di controllo" è molto simile alla precedente, ma mostra solamente le variabiliselezionate con doppio Click del mouse e trascinate all'interno della finestra. Inoltre tratta tutte levariabili disponibili nel modulo, e non solo quelle locali.

Page 22: Excel VBA Per Tutti

EXcel VBA x tutti - La Sintassi Basic

file:///C:/Users/Butter/AppData/Local/Temp/Rar$EX00.901/Corso/Corso/Sintassi7.html[15/02/2010 00:56:57]

Per visualizzare le variabili nella "Finestra Immediata" è necessario aggiungere nel listato del programmala riga seguente:

Debug.Print NomeVariabile Nella finestra verrà visualizzato il valore assunto dalla variabile "NomeVariabile", nel punto in cui è statainserita l'istruzione.

Cognolato Studio © 2004

Page 23: Excel VBA Per Tutti

EXcel VBA x tutti - Creare interfacce utente

file:///C:/Users/Butter/AppData/Local/Temp/Rar$EX00.901/Corso/Corso/Finestre.html[15/02/2010 00:56:58]

Creare l'Interfaccia Utente

L’Interfaccia utente rende la nostra applicazione semplice ed intuitiva a chi lautilizza. Le interfacce utente sono formate dalle finestre (Userform) e daglioggetti in esse contenute, come i pulsanti di comando e le caselle di testo.

Vediamo insieme come creare una semplice "Userform".

Apriamo l’Editor di VBA ed inseriamo una nuova finestra scegliendo la voce"Userform" dal menù "Inserisci". Se non è già presente, inseriamo la caselladegli strumenti, selezionando l’omonima voce dal menù "Visualizza". Notiamoche, appena inseriamo una nuova Userform, appare l’icona di riferimento dellafinestra creata nella cartella "Form" della finestra di progetto.

Trasciniamo dalla casella degli strumenti una casella di testo e due pulsanti dicomando nella Userform appena creata, in modo da ottenere il seguenterisultato.

Ora, se non fosse già presente, apriamo la finestra proprietà dal menù"Visualizza". Per ora vi basti sapere che le proprietà sono le caratteristiche

Page 24: Excel VBA Per Tutti

EXcel VBA x tutti - Creare interfacce utente

file:///C:/Users/Butter/AppData/Local/Temp/Rar$EX00.901/Corso/Corso/Finestre.html[15/02/2010 00:56:58]

inerenti alle finestre ed agli oggetti in essa contenute. Quando un oggetto vieneselezionato, nella finestra proprietà compariranno tutte le caratteristicheappartenenti a quel determinato oggetto. La proprietà più importante èsicuramente "Name", che identifica il nome dell’oggetto. Visual Basic definisceun nome di default agli oggetti, come "CommandButton1", tuttavia è utilesostituirlo con un nome che sia facile da ricordare, ed il più possibile inerentealla funzione per cui il comando è stato progettato. Altre proprietà definisconol’aspetto dell’oggetto come: colori, dimensioni, descrizioni e font delledescrizioni.

Proviamo ad abbellire la Userform appena creata. E’ possibile modificaredirettamente le dimensioni degli oggetti trascinando le maniglie poste suicontorni dell’oggetto stesso. Assegniamo i nomi ai nostri oggetti, selezionandoliuno per uno, e modificando la proprietà "Name", dalla Finestra delle proprietà,nel modo seguente.

Assegniamo:"FrmCiao" all’oggetto Userform;"TxtCiao" all’oggetto testo;"CmdCiao" al primo pulsante di comando;"CmdEsci" al secondo pulsante.

Modifichiamo le etichette attribuendo alle proprietà "Caption":"Ciao Mondo" a "FrmCiao";"Invio" a "CmdCiao";"Esci" a "CmdEsci".

Selezioniamo "Esegui" dal menù "Esegui", il risultato sarà il seguente:

Salviamo come Ciao.xls il documento Excel contenente la Finestra appenacreata, questo esempio ci tornerà utile nelle sezioni successive.

Cognolato Studio © 2004

Page 25: Excel VBA Per Tutti

EXcel VBA x tutti - Creare interfacce utente

file:///C:/Users/Butter/AppData/Local/Temp/Rar$EX00.901/Corso/Corso/Finestre1.html[15/02/2010 00:56:58]

Oggetti e Proprietà

Ci soffermeremo sulla descrizione sintetica degli oggetti che appartengono allacasella degli strumenti, e di alcune delle loro caratteristiche principali. Alcuneproprietà sono comuni a molti, o a tutti, gli oggetti della casella degli strumenti, percomodità saranno descritte una sola volta.

Pulsante di comandoCostituisce un fondamentale oggetto di attivazione degli eventi.

Alcune delle principali proprietà:Name: nome di riferimento dell'oggetto.Caption: etichetta con cui l'oggetto viene visualizzato sulle form.Font: caratteristiche del carattere dell'etichetta: tipo, grandezza, corsivograssetto, colori.Height; Width; Top; Left: dimensioni e posizione dell'oggetto.Visibile: indica se l'oggetto è visibile o nascosto (valore booleano: "True" o"False").Enabled: indica se l'oggetto è attivo o non attivo (valore booleano: "True" o"False").

Casella di testoFondamentale oggetto di visualizzazione ed inserimento dei dati.

Proprietà:BackColor: colore di fondo.BorderStyle: indica se la casella avrà un contorno semplice o a rilievo.ForeColor: colore per i caratteri del testo.MultiLine: consente la scrittura del testo su più righe.

EtichettaOggetto di descrizione dei dati.

Page 26: Excel VBA Per Tutti

EXcel VBA x tutti - Creare interfacce utente

file:///C:/Users/Butter/AppData/Local/Temp/Rar$EX00.901/Corso/Corso/Finestre1.html[15/02/2010 00:56:58]

Proprietà:AutoSize: adegua le sue dimensioni a quelle della stringa introdotta.

CorniceCornice di contenimento dei comandi, che vengono raggruppati secondo unastruttura logica.

Casella di ControlloOggetto di scelta tra due alternative ("True" o "False").

Proprietà:Value: determina il valore ("True" o "False").Alignment: consente di disporre la descrizione a sinistra o a destra delcontrollo.

Pulsante di OpzioneOggetto di scelta tra due alternative ("True" o "False"). Le Caselle di controllo ed iPulsanti di Opzione sembrano avere la stessa funzione. Tuttavia se inseriamo ipulsanti di opzione in una cornice, sarà possibile selezionarne uno solo alla volta,mentre le caselle di controllo posso essere selezionate più di una alla volta.

Casella di riepilogoFinestra in cui è possibile rappresentare una lista di dati.

Proprietà:Multiselect può assumere tre valori:

1. Single: evidenzia un termine della lista alla volta.2. Multi: consente più selezioni.3. Extended: consente più selezioni ma i membri devono essere contigui.

ListIndex: restituisce il numero di indice della voce selezionata.

Casella combinataCostituisce una finestra di dati a discesa molto simile alla casella di riepilogo, infattimolte proprietà sono le stesse.

Proprietà:Style può assumere due valori:

1. fmStyleDropDownCombo: permette all'utente di scrivere al suointerno.

2. fmStyleDropDownList: non permette all'utente di scrivere al suointerno.

Page 27: Excel VBA Per Tutti

EXcel VBA x tutti - Creare interfacce utente

file:///C:/Users/Butter/AppData/Local/Temp/Rar$EX00.901/Corso/Corso/Finestre1.html[15/02/2010 00:56:58]

Barra di scorrimentoCostituito da una barra di scorrimento in grado di attivare eventi in funzionedell'avanzamento raggiunto dal suo cursore.

Proprietà:Orientation: a seconda se definita fmOrientationHorizontal oppurefmOrientationVertical determina la posizione Verticale o Orizzontale dellaBarra.Value: restituisce un indice in funzione della posizione del cursore.Max: definisce il valore limite superiore.Min: definisce il valore limite inferiore.

Pulsante di selezioneÈ costituito da una coppia di pulsanti in grado di incrementere o diminuire il valoredel suo indice interno.

InterruttoreSimile al Pulsante di comando ma alterna due stadi "On" e "Off" (True o False).

PagineFinestra formata da schede ognuna delle quali può contenere più oggetti.

ImmagineOggetto in grado di visualizzare delle immagini sulla Userform.

UserformAnche Userform costituisce un oggetto dotato di proprietà. Molte di queste sono giàstate illustrate precedentemente. In aggiunta è stata preposta la seguenteproprietà:

BorderStyle: Modificano l'aspetto dello UserForm. Selezionando il tipo "0" nonviene mostrato alcun contorno, mentre scegliendo "1" viene aggiunto unbordo nero di contorno.

Cognolato Studio © 2004

Page 28: Excel VBA Per Tutti

EXcel VBA x tutti - Creare interfacce utente

file:///C:/Users/Butter/AppData/Local/Temp/Rar$EX00.901/Corso/Corso/Finestre2.html[15/02/2010 00:56:59]

Il codice associato all’Interfaccia utente

Per permettere alle nostre Userform di svolgere le funzioni, per le quali sono statecreate, è necessario associare alle finestre ed agli oggetti in essa contenute il codiceVisual Basic. Ogni finestra Userform è associata ad una finestra di codice.

Torniamo all’esempio FrmCiao creato all’inizio del capitolo. Selezioniamo la voce"Codice" dal menù "Visualizza", oppure clicchiamo l’icona "Visualizza Codice" dalla"Finestra di Progetto", verrà visualizzata la finestra modulo di codice associata a"FrmCiao".

Nella parte superiore del modulo di codice si trovano due caselle combinate; quellaa sinistra contiene tutti gli oggetti disegnati nella Form, mentre quella a destracontiene gli "Eventi" associati agli oggetti.

Gli "Eventi" sono le azioni, effettuate su un determinato oggetto, in grado diinnescare l’esecuzione di una routine associata a quell'oggetto.

Ad esempio:selezioniamo dalla casella di sinistra l’oggetto "CmdCiao", verrà creata una routineprivata identificata dal nome dell’oggetto selezionato e dall’evento "Click()"suddivisi dal simbolo "_" (Underscore). Questo indica che, nel momento in cuipremeremo il pulsante "CmdCiao", verranno eseguite le istruzioni di codice internealla routine di evento associata.

Click non è l’unico evento associato al comando "Pulsante di comando". Ognioggetto obbedisce ad una serie di eventi, tutti selezionabili dalla "Casella Eventi"posta in alto a destra del modulo di codice.

Page 29: Excel VBA Per Tutti

EXcel VBA x tutti - Creare interfacce utente

file:///C:/Users/Butter/AppData/Local/Temp/Rar$EX00.901/Corso/Corso/Finestre2.html[15/02/2010 00:56:59]

Ecco illustrati alcuni eventi, associati agli oggetti che già conosciamo.

Userform

Eventi associati:Activate; Deactivate: attivano o disattivano una procedura all’attodell’apertura o della chiusura della Form.Initialize: imposta una procedura contenente particolari istruzioni da lanciarein via preliminare.

Pulsante di Comando

Eventi associati:Click: la procedura si attiva col Click sul pulsante.DoubleClick: la routine si attiva col doppio Click.GetFocus: la routine si attiva quando l’oggetto è selezionato.MoseUp: la routine si attiva quando il pulsante viene rilasciato.MouseMove: la routine si attiva quando il puntatore del mouse sfioral’oggetto.

Casella di testo

Eventi associati:Change: l’evento consiste nel cambiamento del testo contenuto nella casella.KeyPress: evento connesso all’attivazione di qualsiasi tasto.KeyUp: evento connesso al rilascio di qualsiasi tasto.

Barra di scorrimento

Eventi associati:Scroll: attiva una procedura quando viene modificata la posizione del cursore.

Torniamo al nostro esempio, nel modulo di codice associato a "FrmCiao". All’internodella routine "CmdCiao_Click()" inseriamo:

TxtCiao.Text = "Ciao Mondo"

Creiamo una routine di evento su Click anche per il pulsante "CmdEsci" edinseriamo il codice:

Unload MeSalviamo "FrmCiao" e proviamo ad eseguirla.

Soffermiamo la nostra attenzione su due aspetti:

Le proprietà possono essere modificate non solo attraverso la finestra delleproprietà, ma anche attraverso il codice Basic, mentre il programma è inesecuzione. Notiamo che nel nostro esempio è stata assegnata la stringa"Ciao Mondo" alla proprietà Text dell’oggetto "TxtCiao". In Visual Basic leproprietà sono separate dall’oggetto a cui appartengono tramite un punto.Tutte le caratteristiche legate a un oggetto specifico sono disponibili almomento della stesura del codice, grazie alla casella di descrizione, cheappare dopo avere digitato il nome dell’oggetto ed il punto di separazione.Unload Me è uno speciale comando che chiude la finestra in uso.

Page 30: Excel VBA Per Tutti

EXcel VBA x tutti - Creare interfacce utente

file:///C:/Users/Butter/AppData/Local/Temp/Rar$EX00.901/Corso/Corso/Finestre2.html[15/02/2010 00:56:59]

Cognolato Studio © 2004

Page 31: Excel VBA Per Tutti

EXcel VBA x tutti - Creare interfacce utente

file:///C:/Users/Butter/AppData/Local/Temp/Rar$EX00.901/Corso/Corso/Finestre3.html[15/02/2010 00:57:00]

I metodi

Oltre alle proprietà ogni oggetto possiede delle funzionalità dette "Metodi", checompiono delle specifiche azioni sull'oggetto stesso. Ad esempio il metodo "Show"dell'oggetto UserForm ha la funzione di visualizzare e rendere attiva una finestra.

Proviamo ad associare la finestra "FrmCiao" ad un pulsante posto direttamente sulfoglio Excel, come abbiamo già visto nel capitolo riguardate il generatore di Macro.Utilizzando il Metodo "Show" potremo visualizzare la nostra finestra con unsemplice Click sul pulsante appena creato.

Passiamo dall'Editor VBA al documento di Microsoft Excel attivo. Inseriamo la barradegli strumenti "Moduli" dal menù "Visualizza", "Barra degli strumenti".Selezioniamo l'icona relativa al pulsante e tracciamo un pulsante sul foglio dilavoro. A questo punto si aprirà la finestra di dialogo "Assegna Macro", selezioniamoil pulsante "Nuovo", così facendo abbiamo creato una nuova macro. All'interno dellaroutine digitiamo:

FrmCiao.Show

Chiudiamo l'Editor VBA e proviamo il pulsante.

Ci soffermeremo ora sulla descrizione sintetica di alcuni dei Metodi più usati per glioggetti visti finora.

Userform

Show: visualizza ed attiva una Userform.Hide: Nasconde e disattiva una Userform.

Pulsante di Comando

Move: cambia la posizione di un oggettoSetFocus: seleziona un oggetto e lo rende attivo.

Page 32: Excel VBA Per Tutti

EXcel VBA x tutti - Creare interfacce utente

file:///C:/Users/Butter/AppData/Local/Temp/Rar$EX00.901/Corso/Corso/Finestre3.html[15/02/2010 00:57:00]

Casella di testo

Copy: copia il contenuto della casella di testo.Cut: taglia il contenuto della casella di testo.Paste: incolla il contenuto della casella di testo.

Casella combinata e Casella di riepilogo

AddItem: consente l'aggiunta di un membro in coda alla lista.RemoveItem(n): consente la cancellazione del membro dislocato in posizione"n".Clear: cancella tutti i membri della lista.List: consente la selezione di un membro della lista specifico.

Nota tecnica:Nel corso del capitolo abbiamo sempre parlato di Oggetti in generale, tuttavia è doveroso fare unadistinzione.

Classe di oggetti: una classe è una costruzione logica, ossia il modello teorico dell'oggetto.Esempio: UserForm, TxtBox, CommandButton.Istanza di un oggetto: ossia la realizzazione fisica di un oggetto.Esempio: FrmCiao, CmdCiao, CmdEsci.

Cognolato Studio © 2004

Page 33: Excel VBA Per Tutti

EXcel VBA x tutti - Creare interfacce utente

file:///C:/Users/Butter/AppData/Local/Temp/Rar$EX00.901/Corso/Corso/Finestre4.html[15/02/2010 00:57:00]

Esempio riepilogativo

L'esempio seguente, utilizza alcuni dei controlli descritti nelle sessioni precedenti.Creiamo una nuova UserForm come illustrato in figura e definiamo le proprietà deglioggetti appena creati come riportato in tabella.

Name Caption TabIndexFrmOggetti Prova Oggetti

CboUno 0LstUno 1LstDue 2

CmdAggiungi Aggiungi >> 3CmdRimuovi <<Rimuovi 4CmdCancella Cancella Tutto 5

CmdEsci Esci 6ChkDisabilita Disabilita spostamenti 7

*La proprietà TabIndex è utile per spostare velocemente il cursore da un oggetto ad un altrousando il tasto Tabulatore (Tab). Il numero indica l'ordine di spostamento.

Di seguito sono riportate le routine da inserire nel modulo di codice associato allaUserForm "FrmOggetti".

La Routine è associata alla casella combinata "CboUno". Quando la casella perde laselezione, la stringa di caratteri appena digitati viene inserita nel menù a discesadella casella combinata e nella casella di riepilogo "LstUno".

Private Sub CboUno_Exit(ByVal Cancel As MSForms.ReturnBoolean) CboUno.AddItem CboUno.Text LstUno.AddItem CboUno.Text CboUno.Text = "" End Sub

Page 34: Excel VBA Per Tutti

EXcel VBA x tutti - Creare interfacce utente

file:///C:/Users/Butter/AppData/Local/Temp/Rar$EX00.901/Corso/Corso/Finestre4.html[15/02/2010 00:57:00]

Con un Click del mouse sul pulsante "CmdAggiungi", ogni elemento della casella diriepilogo "LstUno" viene valutato. Se la voce è selezionata, l'elemento passa da"LstUno" a "LstDue".

Private Sub CmdAggiungi_Click() Dim i As Integer For i = 0 To CboUno.ListCount - 1 If LstUno.Selected(i) = True Then LstDue.AddItem LstUno.List(i) LstUno.RemoveItem i LstUno.Selected(i) = False End If Next End Sub Con un Click del mouse sul pulsante "CmdRimuovi", ogni elemento della casella diriepilogo "LstDue" viene valutato. Se la voce è selezionata, l'elemento passa da"LstDue" a "LstUno".

Private Sub CmdRimuovi_Click() Dim i As Integer For i = 0 To LstDue.ListCount - 1 If LstDue.Selected(i) = True Then LstUno.AddItem LstDue.List(i) LstDue.RemoveItem i LstDue.Selected(i) = False End If Next End Sub Con un Click del mouse sul pulsante "CmdCancella", vengono cancellate tutte levoci presenti in "CboUno", "LstUno" e "LstDue".

Private Sub CmdCancella_Click() CboUno.Clear LstUno.Clear LstDue.Clear End Sub Quando viene selezionata la casella di controllo "ChkDisabilita", vengono disabilitatii pulsanti "CmdAggiungi" e "CmdRimuovi".

Private Sub ChkDisabilita_Change() If ChkDisabilita.Value = True Then CmdAggiungi.Enabled = False CmdRimuovi.Enabled = False Else CmdAggiungi.Enabled = True CmdRimuovi.Enabled = True End If End Sub Con un Click del mouse sul pulsante "CmdEsci", viene scarica la finestra.

Private Sub CmdEsci_Click() Unload Me End Sub

Utilizzare la Form è molto semplice; inserisci una stringa di caratteri nella casellacombinata "CboUno" e prova ad usare i comandi che hai appena creato, quindivaluta attentamente il codice Basic associato.

Cognolato Studio © 2004

Page 35: Excel VBA Per Tutti

EXcel VBA x tutti - Gli Oggetti Excel

file:///C:/Users/Butter/AppData/Local/Temp/Rar$EX00.901/Corso/Corso/OggettiExc.html[15/02/2010 00:57:01]

Gli Oggetti Excel

Come le Userform, viste nel capitolo precedente, anche Microsoft Excel è formatoda oggetti che sono contraddistinti da proprietà, metodi ed eventi.

Il capitolo seguente introduce agli oggetti più comuni e utilizzati di Excel VBA. Iconcetti da illustrare sarebbero innumerevoli, tuttavia la trattazione è volutamentestringata, in quanto è tutto ampiamente descritto nella guida in linea di Excel VBA.

Suggerimento:Come è gia stato spiegato nel secondo paragrafo del capitolo riguardantel’ambiente di sviluppo; un metodo molto efficace per comprendere la logica diutilizzo degli oggetti appartenenti ad Excel VBA è creare delle macro e studiarne ilcodice Visual Basic associato. Nel caso si incontrasse un’istruzione, un oggetto ouna proprietà di cui si vuole conoscere le caratteristiche, posizionarsi col cursoresulla parola interessata e premere il tasto "F1". Questo provoca l’apertura dellaguida in linea direttamente sull’elemento cercato.

L'oggetto Application

Rappresenta l'intera applicazione Microsoft Excel. L'oggetto Application contiene:

Impostazioni e opzioni per l'intera applicazione, ad esempio molte delleopzioni della finestra di dialogo Opzioni del menu Strumenti.Metodi che restituiscono oggetti, quali Workbook (Cartella di lavoro),Worksheet (Foglio di lavoro), ActiveCell (Cella attiva), ActiveSheet (Foglioattivo) e così via.

Molte delle proprietà e dei metodi che restituiscono gli oggetti più comunidell'interfaccia utente, quale la cella attiva (proprietà ActiveCell), le cartelle dilavoro (Workbooks), e i fogli di lavoro (Worksheets), possono essere utilizzatisenza il qualificatore di oggetto Application. Invece di scrivere"Application.ActiveCell.Font.Bold = True" sarà ad esempio possibile scrivere"ActiveCell.Font.Bold = True".

L'insieme Workbooks

Workbook rappresenta una cartella di lavoro di Microsoft Excel, ed è un elementodell'insieme Workbooks. L'insieme Workbooks contiene tutti gli oggetti Workbookaperti di Microsoft Excel.

Vediamo alcuni esempi di metodi e proprietà per la restituzione di un oggettoWorkbook.

Questo esempio chiude tutte le cartelle di lavoro aperte.

Workbooks.Close

Questo esempio aggiunge una nuova cartella di lavoro vuota col metodo Add.

Page 36: Excel VBA Per Tutti

EXcel VBA x tutti - Gli Oggetti Excel

file:///C:/Users/Butter/AppData/Local/Temp/Rar$EX00.901/Corso/Corso/OggettiExc.html[15/02/2010 00:57:01]

Workbooks.Add

Questo esempio apre il file Array.xls come cartella di lavoro di sola lettura.

Workbooks.Open FileName:="Array.xls", ReadOnly:=True

Questo esempio attiva la prima cartella di lavoro aperta

Workbooks(1).Activate

Il numero di indice determina l'ordine nel quale le cartelle di lavoro sono stateaperte o create. Workbooks(1) è la cartella di lavoro creata per prima, mentreWorkbooks(Workbooks.Count) è quella creata per ultima. L'attivazione di unacartella di lavoro non ne modifica il numero di indice. Nel calcolo del numero diindice sono comprese tutte le cartelle di lavoro, anche quelle nascoste.

La proprietà Name restituisce il nome della cartella di lavoro. Non è possibileimpostare il nome della cartella di lavoro utilizzando questa proprietà. Per salvarela cartella di lavoro con un nome diverso, utilizzare il metodo SaveAs. Questoesempio attiva il foglio di lavoro Foglio1 della cartella di lavoro Cogn.xls, che deveessere già aperta.

Workbooks("Cogn.xls").Worksheets("Foglio1").Activate

La proprietà ActiveWorkbook restituisce la cartella di lavoro attiva. Questo esempioimposta il nome dell'autore della cartella di lavoro attiva.

ActiveWorkbook.Author = "Mauro Cognolato"

Per definire le routine di evento riguardanti la cartella Excel attiva esiste unmodulo di codice predefinito denominato "ThisWorkbook", visibile in finestra diprogetto. La casella degli oggetti contiene l’oggetto Workbook, mentre la casellaeventi contiene tutti gli eventi associati a Workbook.

Page 37: Excel VBA Per Tutti

EXcel VBA x tutti - Gli Oggetti Excel

file:///C:/Users/Butter/AppData/Local/Temp/Rar$EX00.901/Corso/Corso/OggettiExc.html[15/02/2010 00:57:01]

Esempio, proviamo ad inserire la routine seguente nel modulo di codice"ThisWorkBook" della cartella di lavoro Ciao.xls, utilizzata nel capitolo precedente.

Private Sub Workbook_Open() FrmCiao.show End Sub

La routine attiva la UserForm "FrmCiao" quando viene aperto il documento Excel.

Cognolato Studio © 2004

Page 38: Excel VBA Per Tutti

EXcel VBA x tutti - Gli Oggetti Excel

file:///C:/Users/Butter/AppData/Local/Temp/Rar$EX00.901/Corso/Corso/OggettiExc1.html[15/02/2010 00:57:02]

L'insieme Sheets

Sheets è l’insieme di tutti i fogli della cartella di lavoro specificata o attiva, puòcontenere l'oggetto Chart (grafico) o Worksheet (foglio di lavoro).

L'insieme Sheets risulta utile quando si desidera restituire fogli di un qualsiasi tipo.

Questo esempio stampa tutti i fogli della cartella di lavoro attiva.

Sheets.PrintOut

Questo esempio aggiunge due fogli grafico alla cartella di lavoro attiva, inserendoli dopoil foglio 2 della cartella di lavoro.

Sheets.Add type:=xlChart, count:=2, after:=Sheets(2)

Per restituire un singolo oggetto Chart o Worksheet la modalità di utilizzo èSheets(index), dove index è il nome o il numero di indice del foglio.

Questo esempio attiva Foglio1.

Sheets("Foglio1").Activate

Per specificare più di un foglio, utilizzare Sheets(array). Questo esempio sposta i fogliSheet4 e Sheet5 all'inizio della cartella di lavoro.

Sheets(Array("Sheet4", "Sheet5")).Move before:=Sheets(1)

L'insieme Worksheets

L’insieme Worksheets è un insieme di tutti gli oggetti Worksheet nella cartella di lavorospecificata o attiva. Ciascun oggetto Worksheet rappresenta un foglio di lavoro.

Questo esempio sposta tutti i fogli di lavoro alla fine della cartella di lavoro.

Worksheets.Move After:=Sheets(Sheets.Count)

Questo esempio aggiunge due nuovi fogli di lavoro prima del foglio di lavoro 1 dellacartella di lavoro attiva.

Worksheets.Add Count:=2, Before:=Sheets(1)

Per restituire un singolo oggetto Worksheet, utilizzare Worksheets(index), dove index è ilnome o il numero di indice del foglio di lavoro.

Il numero di indice determina la posizione del foglio di lavoro sulla barra delle schededella cartella di lavoro. Worksheets(1) è il primo foglio di lavoro da sinistra della cartelladi lavoro, mentre Worksheets(Worksheets.Count) è l'ultimo. Nel calcolo del numero diindice sono compresi tutti i fogli di lavoro, anche quelli nascosti.

Questo esempio nasconde il foglio di lavoro 1 della cartella di lavoro attiva.

Worksheets(1).Visible = False

Page 39: Excel VBA Per Tutti

EXcel VBA x tutti - Gli Oggetti Excel

file:///C:/Users/Butter/AppData/Local/Temp/Rar$EX00.901/Corso/Corso/OggettiExc1.html[15/02/2010 00:57:02]

Il nome del foglio di lavoro è visualizzato sulla scheda del foglio di lavoro. Questoesempio protegge con una password gli scenari di Foglio1.

Worksheets(1).Visible = False

Questo esempio nasconde il foglio di lavoro 1 della cartella di lavoro attiva.

Worksheets("Foglio1").Protect password:="secret", scenarios:=True

Quando il foglio attivo è un foglio di lavoro, per farvi riferimento è possibile utilizzare laproprietà "ActiveSheet". Questo esempio attiva Foglio1 utilizzando il metodo Activate eimposta su orizzontale l'orientamento della pagina. Quindi stampa il foglio di lavoro.

Worksheets("Foglio1").Activate ActiveSheet.PageSetup.Orientation = xlLandscape ActiveSheet.PrintOut

Ogni oggetto Worksheet possiede in VBA un modulo di codice che contiene le routine dievento associate. Se inseriamo un nuovo foglio di lavoro, automaticamente verrà creato ilmodulo di codice associato, mentre verrà rimosso se eliminiamo il foglio di lavoroassociato. La casella degli oggetti contiene l'oggetto "Worksheet" mentre la casella eventicontiene tutti gli eventi associati all’oggetto "Worksheet".

L'insieme Range

Rappresenta una cella, una riga, una colonna, una selezione di celle contenente uno opiù blocchi contigui di celle.

Per restituire un oggetto Range che rappresenta una singola cella o un intervallo di celle,la modalità di utilizzo è Range(arg), dove arg determina l'intervallo.

Questo esempio inserisce il valore della cella A1 nella cella A5.

Worksheets("Foglio1").Range("A5").Value = _ Worksheets("Foglio1").Range("A1").Value

Quando viene utilizzata senza qualificatore di oggetto (vale a dire un oggetto alla sinistradel punto), la proprietà Range restituisce un intervallo del foglio attivo, purché il foglioattivo sia un foglio di lavoro. In caso contrario il metodo non produrrà alcun risultato.Utilizzare il metodo Activate per attivare un foglio di lavoro prima di utilizzare la proprietàRange senza un esplicito qualificatore di oggetto. Questo esempio riempie l'intervalloA1:H8 di numeri casuali impostando la formula in ogni cella dell'intervallo.

Worksheets("Foglio1").Activate Range("A1:H8").Formula = "=Rand()"

Page 40: Excel VBA Per Tutti

EXcel VBA x tutti - Gli Oggetti Excel

file:///C:/Users/Butter/AppData/Local/Temp/Rar$EX00.901/Corso/Corso/OggettiExc1.html[15/02/2010 00:57:02]

Cognolato Studio © 2004

Page 41: Excel VBA Per Tutti

EXcel VBA x tutti - Gli Oggetti Excel

file:///C:/Users/Butter/AppData/Local/Temp/Rar$EX00.901/Corso/Corso/OggettiExc2.html[15/02/2010 00:57:02]

La proprietà Cells

La proprietà Cells restituisce un oggetto che rappresenta tutte le celle del foglio dilavoro attivo. Se il documento attivo non è un foglio di lavoro, questa proprietàgenererà un errore. Proprietà di sola lettura.

La modalità di utilizzo è Cells(row, column) dove row è l'indice di riga e column èl'indice di colonna, per restituire una singola cella. Questo esempio imposta il valoredella cella A1 a 24.

Worksheets(1).Cells(1, 1).Value = 24

Questo esempio imposta la formula della cella A2.

ActiveSheet.Cells(2, 1).Formula = "=Sum(B1:B5)"

Benché sia possibile utilizzare anche Range("A1") per restituire la cella A1, in alcunicasi la proprietà Cells risulta più conveniente, grazie al fatto di poter utilizzare dellevariabili per la riga o la colonna. Questo esempio crea le intestazioni di riga e dicolonna di Foglio1. Quando il foglio di lavoro è stato attivato, la proprietà Cells puòessere utilizzata senza dichiarare esplicitamente il foglio. La proprietà restituisceinfatti una cella del foglio attivo.

Sub SetUpTable() Worksheets("Foglio1").Activate For TheYear = 1 To 5 Cells(1, TheYear + 1).Value = 1990 + TheYear Next TheYear For TheQuarter = 1 To 4 Cells(TheQuarter + 1, 1).Value = "Q" & TheQuarter Next TheQuarter End Sub

Per restituire parte di un intervallo, utilizzare espressione.Cells(row, column), doveespressione restituisce un oggetto Range e row e column sono relative all'angolosuperiore sinistro dell'intervallo. Questo esempio imposta la formula della cella C5.

Worksheets(1).Range("C5:C10").Cells(1, 1).Formula = "=Rand()"

E’ anche possibile utilizzare Range(cell1, cell2), dove cell1 e cell2 sono oggettiRange restituiti dalla proprietà Cells(row, column) che specificano la cella iniziale ela cella finale dell'intervallo. Questo esempio imposta lo stile della linea del bordodelle celle dell'intervallo A1:J10.

With Worksheets(1) .Range(.Cells(1, 1), _ .Cells(10, 10)).Borders.LineStyle = xlThick End With

L'istruzione With consente di eseguire una serie di istruzioni su un oggettospecificato senza riqualificare il nome dell'oggetto. Affinché alla proprietà vengaapplicato l’oggetto dell'istruzione With, è necessario che ogni occorrenza dellaproprietà sia preceduta da un punto. In questo caso il punto indica che le celle sitrovano sul foglio di lavoro 1. Senza il punto, la proprietà Cells avrebbe restituito lecelle del foglio attivo.

Quando si utilizzano selezioni multiple, la proprietà Areas si rivela particolarmenteutile. Essa consente di dividere una selezione multipla in singoli oggetti Range, iquali vengono quindi restituiti sotto forma di insieme. È possibile applicare la

Page 42: Excel VBA Per Tutti

EXcel VBA x tutti - Gli Oggetti Excel

file:///C:/Users/Butter/AppData/Local/Temp/Rar$EX00.901/Corso/Corso/OggettiExc2.html[15/02/2010 00:57:02]

proprietà Count all'insieme restituito per verificare la presenza di una selezionemultipla, come illustrato nel seguente esempio.

Sub NoMultiArea () NumberOfSelectedAreas = Selection.Areas.Count If NumberOfSelectedAreas > 1 Then MsgBox "Non puoi eseguire questo comando " & _ "su selezioni multiarea" End If End Sub

Questo esempio imposta a 14 punti le dimensioni del carattere della cella C5 diFoglio1.

Worksheets("Foglio1").Cells(5, 3).Font.Size = 14

Questo esempio cancella la formula nella cella 1 di Foglio1.

Worksheets("Foglio1").Cells(1).ClearContents

Questo esempio imposta ad Arial 8 punti il carattere di tutte le celle di Foglio1.

With Worksheets("Foglio1").Cells.Font .Name = "Arial" .Size = 8 End With

Questo esempio esegue un ciclo sulle celle comprese tra A1 e J4. Il valore dellecelle contenenti un valore inferiore a 0,001 viene sostituito con zero (0).

For rwIndex = 1 to 4 For colIndex = 1 to 10 With Worksheets("Foglio1").Cells(rwIndex, colIndex) If .Value < .001 Then .Value = 0 End With Next colIndex Next rwIndex

Questo esempio imposta a corsivo lo stile del carattere delle celle comprese tra A1e C5.

Worksheets("Foglio1").Activate Range(Cells(1, 1), Cells(5, 3)).Font.Italic = True

La proprietà Offset

Per restituire un intervallo a una distanza specificata da un altro intervallo,utilizzare Offset(row, column), dove row e column rappresentano gli scarti di riga edi colonna. Questo esempio seleziona la cella che si trova tre righe più in basso euna colonna più a destra rispetto alla cella posizionata all'angolo superiore sinistrodella selezione corrente. Dal momento che è possibile selezionare solo le celle che sitrovano sul foglio attivo, sarà necessario prima attivare il foglio di lavoro.

Worksheets("Foglio1").Activate Selection.Offset(3, 1).Range("A1").Select

Il metodo Union

Per restituire intervalli multipli, vale a dire composti da due o più blocchi contigui dicelle, utilizzare Union(range1, range2, ...). Questo esempio crea un oggetto definitocome l'unione degli intervalli A1:B2 e C3:D4 e lo seleziona.

Dim r1 As Range, r2 As Range, myMultiAreaRange As Range Worksheets("Foglio1").Activate Set r1 = Range("A1:B2") Set r2 = Range("C3:D4")

Page 43: Excel VBA Per Tutti

EXcel VBA x tutti - Gli Oggetti Excel

file:///C:/Users/Butter/AppData/Local/Temp/Rar$EX00.901/Corso/Corso/OggettiExc2.html[15/02/2010 00:57:02]

Set myMultiAreaRange = Union(r1, r2) myMultiAreaRange.Select

Cognolato Studio © 2004

Page 44: Excel VBA Per Tutti

EXcel VBA x tutti - Gli Oggetti Excel

file:///C:/Users/Butter/AppData/Local/Temp/Rar$EX00.901/Corso/Corso/OggettiExc3.html[15/02/2010 00:57:03]

La proprietà Columns

Restituisce un oggetto che rappresenta tutte le colonne del foglio di lavoro attivo.Se il documento attivo non è un foglio di lavoro, la proprietà Columns restituisce unerrore. Proprietà di sola lettura. L'utilizzo di questa proprietà senza un qualificatoredi oggetto equivale ad ActiveSheet.Columns.

Se applicata ad un oggetto Range corrispondente ad una selezione multipla, questaproprietà restituirà solo le colonne della prima area dell'intervallo. Se l'oggettoRange corrisponde ad esempio a una selezione multipla con due aree, A1:B2 eC3:D4, Selection.Columns.Count restituirà 2, non 4. Per utilizzare questa proprietàsu un intervallo che può contenere una selezione multipla, verificare conAreas.Count se l'intervallo è una selezione multipla. In caso affermativo, eseguireun ciclo su ciascuna area dell'intervallo.

Questo esempio imposta a grassetto il tipo di carattere della colonna 1, ovvero dellacolonna A, di Foglio1.

Worksheets("Foglio1").Columns(1).Font.Bold = True

Questo esempio imposta a zero (0) il valore di tutte le celle della colonna 1.

Columns(1).Value = 0

Questo esempio visualizza il numero di colonne nella selezione di Foglio1. Se èselezionata più di un'area, sarà eseguito un ciclo per ciascuna di esse.

Worksheets("Foglio1").Activate areaCount = Selection.Areas.Count If areaCount <= 1 Then MsgBox "La selezione contiene " & _ Selection.Columns.Count & " colonne." Else For i = 1 To areaCount MsgBox "L’Area " & i & " di selezione contiene " & _ Selection.Areas(i).Columns.Count & " colonne." Next i End If

La proprietà Rows

Per un oggetto Application, restituisce un oggetto che rappresenta tutte le righe delfoglio di lavoro attivo. Se il documento attivo non è un foglio di lavoro la proprietàRows restituirà un errore. Per un oggetto Range, restituisce le righe contenutenell'intervallo specificato. Per un oggetto Worksheet, restituisce tutte le righe delfoglio di lavoro specificato. Proprietà di sola lettura. L'utilizzo di questa proprietàsenza un qualificatore di oggetto equivale a ActiveSheet.Rows.

Se si applica ad una selezione multipla, questa proprietà restituirà righe soltantodalla prima area d'intervallo. Se un oggetto Range ha ad esempio due aree, A1:B2e C3:D4, Selection.Rows.Count restituirà 2, non 4. Per utilizzare questa proprietà suun intervallo che include una selezione multipla, provare Areas.Count perdeterminare se l'intervallo è una selezione multipla. In caso affermativo, eseguireun ciclo su ciascuna area dell'intervallo.

Questo esempio elimina la riga 3 di Foglio1.

Worksheets("Foglio1").Rows(3).Delete

Page 45: Excel VBA Per Tutti

EXcel VBA x tutti - Gli Oggetti Excel

file:///C:/Users/Butter/AppData/Local/Temp/Rar$EX00.901/Corso/Corso/OggettiExc3.html[15/02/2010 00:57:03]

Questo esempio elimina le righe contenute nell'area corrente del foglio di lavoro 1in cui il valore della prima cella della riga è lo stesso di quello della prima cella dellariga precedente.

For Each rw In Worksheets(1).Cells(1, 1).CurrentRegion.Rows this = rw.Cells(1, 1).Value If this = last Then rw.Delete last = this Next

Questo esempio visualizza il numero di righe nella selezione di Foglio1. Se èselezionata più di un'area, l'esempio eseguirà un ciclo su ciascuna di esse.

Worksheets("Foglio1").Activate areaCount = Selection.Areas.Count If areaCount <= 1 Then MsgBox "La selezione contiene " & _ Selection.Rows.Count & " righe." Else i = 1 For Each a In Selection.Areas MsgBox "L’Area " & i & " di selezione contiene " & _ a.Rows.Count & " righe." i = i + 1 Next a End If

Cognolato Studio © 2004

Page 46: Excel VBA Per Tutti

EXcel VBA x tutti - Esempi

file:///C:/Users/Butter/AppData/Local/Temp/Rar$EX00.901/Corso/Corso/Esempi.html[15/02/2010 00:57:03]

Esempi

Esempi di automazioni su oggetti Excel

Creiamo un nuovo modulo di codice in VBA e proviamo ad eseguire leroutine seguendo i suggerimenti.

Esempio 1

L'esempio crea una riga diagonale di asterischi dalla cella A1 a J10 sulfoglio di lavoro attivo.

Sub Diagonale_Asterischi() Set Z = Range("A1:J10") Nr = Z.Rows.Count For i = 1 To Nr Z(i, i).Value = "*" Next End Sub

Esempio 2

Inseriamo la funzione "=CASUALE()" in cella "D2" ed eseguiamo laroutine seguente che copia la formula in basso.

Sub Copia_in_Basso() Range("D2").Select Selection.AutoFill Destination:=Range("D2:D8"), _ Type:=xlFillDefault Range("D2:D8").Select End Sub

Esempio 3

Inseriamo dei valori nella prima riga di foglio1. La routine copia laprima riga da foglio1 sulla seconda di foglio2.

Sub Sposta_riga() Worksheets("Foglio1").Select Rows("1:1").Select Selection.Copy Worksheets("Foglio2").Select Rows("2:2").Select ActiveSheet.Paste End Sub

Esempio 4

L'esempio blocca la prima riga del foglio attivo.

Sub Blocca_riga() Rows("2:2").Select ActiveWindow.FreezePanes = True End Sub

Page 47: Excel VBA Per Tutti

EXcel VBA x tutti - Esempi

file:///C:/Users/Butter/AppData/Local/Temp/Rar$EX00.901/Corso/Corso/Esempi.html[15/02/2010 00:57:03]

Esempio 5

L'esempio crea un nuovo foglio di lavoro lo nomina e lo imposta comeultimo foglio.

Sub CreaFoglio() Sheets.Add ActiveSheet.Select ActiveSheet.Name = "FoglioProva" & Worksheets.Count Sheets("FoglioProva" & Worksheets.Count).Select Sheets("FoglioProva" & Worksheets.Count).Move _ After:=Sheets(Worksheets.Count) End Sub

Esempio 6

L'esempio mostra i nomi delle finestre Excel attive e delle cartelleattive.

Sub MostraFin() For each finest in application.Windows Msgbox finest.caption & " " & finest.parent.name Next End Sub

Esempio 7

La routine conta le cartelle e le finestre di applicazione Excel attive,inoltre per ogni cartella conta le finestre attive.

Sub ScorreFin() Const Messiniz = "La cartella n. " Dim i as integer Dim j as integer Dim Mess as string Dim NumCart as integer Dim NumFines as integer NumFines = Windows.count 'conta le finestre totali NumCart = Workbooks.count 'conta le cartelle totali Msgbox " Finestre Totali: " & NumFines Msgbox "Cartelle Totali: " & NumCart For i=1 to NumCart 'scorre le cartelle With WorkBooks(i) Mess = MessIniz & i 'finestre della cartella in esame NumFines = .Windows.count If NumFines=1 then Msgbox Mess & " ha una sola finestra" Else Msgbox Mess & " ha le seguenti finestre" For j=1 to NumFines Msgbox .Windows(j).caption Next End if End with Next End Sub

Esempio 8

La routine mostra tutti i fogli della cartella attiva.

Sub ScorreFin1() For i = 1 To Worksheets.Count With Worksheets(i) .Activate MsgBox .Name End With Next End Sub

Esempio 9

Page 48: Excel VBA Per Tutti

EXcel VBA x tutti - Esempi

file:///C:/Users/Butter/AppData/Local/Temp/Rar$EX00.901/Corso/Corso/Esempi.html[15/02/2010 00:57:03]

L'esempio parte dal foglio attivo e mostra il nome dei fogli finoall'ultimo, poi riparte dal primo fino al foglio attivo.

Sub ScorreFogli() indatt = ActiveSheet.Index nflav = Sheets.Count For i = indatt To nflav With Sheets(i) .Activate MsgBox .Name End With Next For i = 1 To indatt - 1 With Sheets(i) .Activate MsgBox .Name End With Next Sheets(i).Activate End Sub

Esempio 10

In colonna "B" è riportata una serie di valori. Del primo valore sonocalcolati gli elevamenti alla seconda, alla terza alla quarta e disposti adestra della prima cella. La routine copia in basso le formule dispostesulla prima riga per quanti sono i valori della colonna di destra.

UsedRange: Restituisce un oggetto Range, che rappresenta l'intervalloutilizzato dal foglio di lavoro attivo. Proprietà di sola lettura.

Sub CopiaFormule() ActiveWorkbook.Names.Add "Rigaform", RefersToR1C1:= _ ActiveSheet.UsedRange.Range(Cells(1, 2), _ Cells(1, 4)) Application.Goto reference:="Rigaform" ActiveCell.Offset(0, -1).Select Selection.End(xlDown).Select ActiveCell.Offset(0, 3).Select ActiveWorkbook.Names.Add "ultimacella", _ RefersToR1C1:=ActiveCell Range("Rigaform").Select Selection.Copy Range("Rigaform:ultimacella").Select ActiveSheet.Paste Application.CutCopyMode = False ActiveWorkbook.Names("ultimacella").Delete End Sub Esempio 11

Variante del’esempio sopra.

Sub CopiaFormule1() ActiveWorkbook.Names.Add "Rigaform", RefersToR1C1:= _ ActiveSheet.UsedRange.Range(Cells(1, 2), Cells(1, 4)) Application.Goto Reference:="Rigaform" NumRiga = Selection.Offset(0, -1).End(xlDown).Row NumCol = Selection.End(xlToRight).Column Set Primacella = Range("Rigaform").Cells(1, 1) Set Ultimacella = Cells(NumRiga, NumCol) Selection.Copy Range(Primacella, Ultimacella).Select ActiveSheet.Paste

Page 49: Excel VBA Per Tutti

EXcel VBA x tutti - Esempi

file:///C:/Users/Butter/AppData/Local/Temp/Rar$EX00.901/Corso/Corso/Esempi.html[15/02/2010 00:57:03]

Application.CutCopyMode = False End Sub

Cognolato Studio © 2004

Page 50: Excel VBA Per Tutti

EXcel VBA x tutti - Esempi

file:///C:/Users/Butter/AppData/Local/Temp/Rar$EX00.901/Corso/Corso/Esempi1.html[15/02/2010 00:57:04]

Esempio 12

Apriamo una nuova cartella di lavoro Excel e per ogni foglio ricreiamo la situazionein figura.

I valori di riga e colonna delimitano un’area di foglio (CurrentRegion). La routineriempie le celle interne all’area con dei numeri casuali da 1 a 90.

CurrentRegion: Restituisce un oggetto Range, che rappresenta l'area corrente, cheè costituita da un intervallo delimitato da una qualsiasi combinazione di righe ecolonne vuote.

Sub RiempiArea() For Each f In Worksheets Set Zc = f.Range("B2").CurrentRegion Nr = Zc.Rows.Count Nc = Zc.Columns.Count Set Zc = Zc.Offset(1, 1).Resize(Nr - 1, Nc - 1) For Each C In Zc C.Value = Int(Rnd * 90 + 1) Next Next End Sub

Esempio 13

L'esempio crea la "Serie di Fibonacci" in base al numero di occorrenze specificatodalla finestra di input (esempio di creazione formule).FormulaR1C1: Restituisce o imposta la formula per l'oggetto utilizzando unriferimento di tipo R1C1. Proprietà di tipo Variant di lettura-scrittura per gli oggettiRange e di tipo String di lettura-scrittura per gli oggetti Series.

Sub LanciaFib() With Selection .Offset(-1).Value = 1 .Offset(-2).Value = 0 End With C = InputBox("Quanto lunga vuoi la serie?") For i = 1 To C - 1 Fibonacci Selection Selection.Offset(1).Select Next End Sub Sub Fibonacci(Zonafib As Object) Zonafib.FormulaR1C1 = "=R[-2]C+R[-1]C" End Sub

Esempio 14

La routine genera la serie dei mesi, partendo dalla cella attiva.

Page 51: Excel VBA Per Tutti

EXcel VBA x tutti - Esempi

file:///C:/Users/Butter/AppData/Local/Temp/Rar$EX00.901/Corso/Corso/Esempi1.html[15/02/2010 00:57:04]

Gennaio Febbraio Marzo Aprile Maggio Giugno Luglio Agosto Settembre Ottobre Novembre Dicembre

Sub CopiaMese() Worksheets("foglio1").Select Set C = ActiveCell C.Value = InputBox("Dammi un mese") Set Intervdest = Range(C, C.Offset("11")) mess = "In Basso (Si) o verso destra(No)" Dimmitu = MsgBox(mess, vbYesNo, ricopia) If Dimmitu = vbNo Then Set Intervdest = Range(C, C.Offset(0, 11)) End If C.AutoFill Destination:=Intervdest, Type:=xlRicopiaMesi End Sub

Esempio 15

Partendo dalla Cella "B4" generiamo un’area di valori e formule. Non è importantequali formule l'importante è che l'area sia continua. La routine copia la regioneappena creata da foglio1 a foglio3.

Sub SpostaRegione() ActiveWorkbook.Names.Add Name:="Inizon",_ RefersToR1C1:=Worksheets("foglio3").Range("B4") Set Zonaformule = Worksheets("foglio3").Range("Inizon").CurrentRegion ActiveWorkbook.Names.Add Name:="formulina", _ RefersToR1C1:=Range("B4").CurrentRegion Range("formulina").Copy Zonaformule End Sub

Esempio 16

Riferendosi all’esempio precedente sostituisce le formule coi valori delle celle.

Sub EliminaFormule() ActiveSheet.Range("Inizon").CurrentRegion.Select For Each MiaC In Selection MiaC.Value = MiaC Next End Sub

Esempio 17

Variante dell’esempio sopra.

Sub EliminaFormule() ActiveSheet.Range("Inizon").CurrentRegion.Select Selection.Copy Selection.PasteSpecial Paste:=xlValues Application.CutCopyMode = False End Sub

Page 52: Excel VBA Per Tutti

EXcel VBA x tutti - Esempi

file:///C:/Users/Butter/AppData/Local/Temp/Rar$EX00.901/Corso/Corso/Esempi1.html[15/02/2010 00:57:04]

Cognolato Studio © 2004

Page 53: Excel VBA Per Tutti

EXcel VBA x tutti - Esempi

file:///C:/Users/Butter/AppData/Local/Temp/Rar$EX00.901/Corso/Corso/Esempi2.html[15/02/2010 00:57:05]

Esempi di sviluppo automazioni con interfaccia utente

Esempio 18

Una Biblioteca vuole catalogare tutti i libri in esposizione ed eseguire alcune statistiche suilibri con lo stesso editore, categoria e numero copie possedute.

L’esempio filtra i record del foglio per casa editrice, categoria , copie possedute o tutti e tre icampi contemporaneamente. Al termine della ricerca visualizza solo le righe che soddisfanola condizione.

Realizziamo un foglio Excel come rappresentato in figura. Inoltre creiamo una UserForm consei pulsanti e tre caselle di testo.

Definiamo le proprietà degli oggetti appena creati come riportato in tabella:

Name CaptionFrmCerca Ricerca Articoli

CmdEditore EditoreCmdCategoria CategoriaCmdQuantita Quantità

TxtEditore

Page 54: Excel VBA Per Tutti

EXcel VBA x tutti - Esempi

file:///C:/Users/Butter/AppData/Local/Temp/Rar$EX00.901/Corso/Corso/Esempi2.html[15/02/2010 00:57:05]

TxtCategoria TxtQuantita CmdCerca Cerca

CmdRipristina RipristinaCmdChiudi Chiudi

Di seguito sono riportate le routine da inserire nel modulo di codice associato alla UserForm"FrmCerca".

Private Sub CmdCerca_Click() CmdEditore_Click CmdCategoria_Click CmdQuantita_Click End Sub Private Sub CmdChiudi_Click() FrmCerca.Hide End Sub Private Sub CmdEditore_Click() If TxtEditore.Text = "" Then MsgBox "Inserire dati per la ricerca!" Exit Sub End If ActiveSheet.UsedRange.Select riga = Worksheets(1).UsedRange.Rows.Count For indi = 2 To riga If Range("B" & indi) <> TxtEditore.Text Then Range("B" & indi).Select Selection.EntireRow.Hidden = True End If Next End Sub Private Sub CmdCategoria_Click() If TxtCategoria.Text = "" Then MsgBox "Inserire dati per la ricerca!" Exit Sub End If ActiveSheet.UsedRange.Select riga = Worksheets(1).UsedRange.Rows.Count For indi = 2 To riga If Range("C" & indi) <> TxtCategoria.Text Then Range("C" & indi).Select Selection.EntireRow.Hidden = True End If Next End Sub Private Sub CmdQuantita_Click() If TxtQuantita.Text = "" Then MsgBox "Inserire dati per la ricerca!" Exit Sub End If ActiveSheet.UsedRange.Select riga = Worksheets(1).UsedRange.Rows.Count For indi = 2 To riga If Range("D" & indi) <> TxtQuantita.Text Then Range("D" & indi).Select Selection.EntireRow.Hidden = True End If Next End Sub Private Sub CmdRipristina_Click() ActiveSheet.UsedRange.Select Selection.EntireRow.Hidden = False End Sub

Nel foglio di lavoro inseriamo un pulsante che attivi la Userform "FrmCerca" (vedi paragrafo"Generatore di Macro").

Page 55: Excel VBA Per Tutti

EXcel VBA x tutti - Esempi

file:///C:/Users/Butter/AppData/Local/Temp/Rar$EX00.901/Corso/Corso/Esempi2.html[15/02/2010 00:57:05]

Cognolato Studio © 2004

Page 56: Excel VBA Per Tutti

EXcel VBA x tutti - Esempi

file:///C:/Users/Butter/AppData/Local/Temp/Rar$EX00.901/Corso/Corso/Esempi3.html[15/02/2010 00:57:05]

Esempio 19

La stessa biblioteca dell’esempio precedente vuole monitorare i libri in prestito ed evidenziare i casi in cuisia stata superata la data di riconsegna del libro.

L’applicazione verifica se la data di scadenza è superiore della data odierna, in tal caso riporta il recordnella casella di riepilogo.

Impostiamo un foglio di lavoro e creiamo una nuova UserForm con un pulsante ed una casella di riepilogo,come illustrato in figura.

Definiamo le proprietà degli oggetti appena creati come riportato in tabella:

Name Caption ColumnCountFrmScaduti Visualizza prestiti scaduti LstScaduti 5CmdChiudi Chiudi

Di seguito sono riportate le routine da inserire nel modulo di codice associato alla UserForm "FrmScaduti".

Private Sub CmdEsci_Click() Unload Me End Sub

Page 57: Excel VBA Per Tutti

EXcel VBA x tutti - Esempi

file:///C:/Users/Butter/AppData/Local/Temp/Rar$EX00.901/Corso/Corso/Esempi3.html[15/02/2010 00:57:05]

Private Sub UserForm_Activate() 'calcolo la data di sistema e la salvo su una variabile MyDate = Date 'creo la riga descrizioni della ListBox FrmScaduti.LstScaduti.AddItem "Titolo" FrmScaduti.LstScaduti.List(RigaLista, 1) = "Editore" FrmScaduti.LstScaduti.List(RigaLista, 2) = "Cognome Nome" FrmScaduti.LstScaduti.List(RigaLista, 3) = "Telefono" FrmScaduti.LstScaduti.List(RigaLista, 4) = "Data scadenza" RigaLista = 0 ActiveSheet.UsedRange.Select riga = Worksheets(1).UsedRange.Rows.Count For Indi = 2 To riga If Range("E" & Indi) <= MyDate Then RigaLista = RigaLista + 1 FrmScaduti.LstScaduti.AddItem Range("A" & Indi) FrmScaduti.LstScaduti.List(RigaLista, 1) = _ Range("B" & Indi) FrmScaduti.LstScaduti.List(RigaLista, 2) = _ Range("C" & Indi) FrmScaduti.LstScaduti.List(RigaLista, 3) = _ Range("D" & Indi) FrmScaduti.LstScaduti.List(RigaLista, 4) = _ Range("E" & Indi) End If Next End Sub

Nel foglio di lavoro inseriamo un pulsante che attivi la Userform "FrmScaduti" (vedi paragrafo "Generatoredi Macro").

Cognolato Studio © 2004

Page 58: Excel VBA Per Tutti

EXcel VBA x tutti - Esempi

file:///C:/Users/Butter/AppData/Local/Temp/Rar$EX00.901/Corso/Corso/Esempi4.html[15/02/2010 00:57:06]

Esempio 20

La biblioteca desidera possedere un archivio che memorizzi le informazioni relative a Titolo,Autore e Casa Editrice di tutti i libri posseduti. Inoltre si vuole gestire l'inserimento, lacancellazione e la ricerca dei dati tramite un' interfaccia utente personalizzata.

Realizziamo un foglio Excel come descritto in figura. Inoltre creiamo una nuova UserForm conquattro pulsanti, quattro caselle di testo, una barra di scorrimento(ScrollBar) ed un pulsante diselezione(SpinButton).

Definiamo le proprietà degli oggetti appena creati come riportato in tabella:

Name CaptionFrmLista Gestione Libri

CmdInserisci InserisciCmdCancella CancellaCmdCerca Cerca X Titolo

CmdChiudi ChiudiTxtTitolo TxtAutore TxtEditore SpnNum ScrNum

Page 59: Excel VBA Per Tutti

EXcel VBA x tutti - Esempi

file:///C:/Users/Butter/AppData/Local/Temp/Rar$EX00.901/Corso/Corso/Esempi4.html[15/02/2010 00:57:06]

TxtNum

Di seguito sono riportate le routine da inserire nel modulo di codice associato alla UserForm"FrmLista".

Private Sub CmdCancella_Click() Numriga = ActiveCell.Row Rows(Numriga & ":" & Numriga).Select Selection.Delete Shift:=xlUp ScrNum.Max = ActiveSheet.UsedRange.Rows.Count End Sub Private Sub CmdCerca_Click() On Error GoTo 10 Cells.Find(what:=TxtTitolo.Text, After:=ActiveCell, _ LookAt:=xlPart, SearchOrder:=xlByRows, _ searchdirection:=xlNext).Activate x = ActiveCell.Column TxtTitolo.Text = ActiveCell.Text TxtEditore.Text = ActiveCell.Offset(columnoffset:=x).Text TxtAutore.Text = ActiveCell.Offset(columnoffset:=x + 1).Text ValScr = ActiveCell.Row ScrNum.Value = ValScr TxtNum.Text = ValScr Exit Sub 10: MsgBox "Record non trovato" End Sub Private Sub CmdEsci_Click() Unload Me End Sub Private Sub CmdInserisci_Click() ValScr = ActiveSheet.UsedRange.Rows.Count + 1 TmpTitolo = TxtTitolo.Text TmpEditore = TxtEditore.Text TmpAutore = TxtAutore.Text ScrNum.Max = ValScr ScrNum.Value = ValScr Range("A" & ValScr) = TmpTitolo Range("B" & ValScr) = TmpEditore Range("C" & ValScr) = TmpAutore TxtNum.Text = ValScr End Sub Private Sub ScrNum_Change() ValScr = ScrNum.Value Range("A" & ValScr & ":" & "C" & ValScr).Select TxtTitolo.Text = Range("A" & ValScr) TxtEditore.Text = Range("B" & ValScr) TxtAutore.Text = Range("C" & ValScr) TxtNum.Text = ValScr End Sub Private Sub SpnNum_SpinDown() ScrNum.Value = 2 ScrNum_Change End Sub Private Sub SpnNum_SpinUp() ValScr = ActiveSheet.UsedRange.Rows.Count ScrNum.Max = ValScr ScrNum.Value = ValScr ScrNum_Change End Sub Private Sub UserForm_Activate() ScrNum.Max = ActiveSheet.UsedRange.Rows.Count ScrNum.Min = 2 End Sub

Nel foglio di lavoro inseriamo un pulsante che attivi la Userform "FrmLista" (vedi paragrafo"Generatore di Macro").

Page 60: Excel VBA Per Tutti

EXcel VBA x tutti - Esempi

file:///C:/Users/Butter/AppData/Local/Temp/Rar$EX00.901/Corso/Corso/Esempi4.html[15/02/2010 00:57:06]

Cognolato Studio © 2004

Page 61: Excel VBA Per Tutti

EXcel VBA x tutti - Obiettivi

file:///C:/Users/Butter/AppData/Local/Temp/Rar$EX00.901/Corso/Corso/Introduzione.html[15/02/2010 00:57:07]

Obiettivi

Visual Basic for Application (VBA) è presente nelle applicazioni Officecome: Word, Excel, Power Point ed Access. La sua funzione è quella direndere programmabili questi applicativi, allo scopo di personalizzarli aseconda delle esigenze specifiche dell'utente. La mia esperienza derivadall'utilizzo quotidiano del PC e dalla scoperta di questa potenzialitàgiorno per giorno, aiutato anche dalla mia professione diprogrammatore.

Molte persone utilizzano correntemente il pacchetto Office,normalmente in uso in molti personal computer, ma ignorano questotipo di funzionalità. Il mio obiettivo è quello di fornire le basi su questotipo di programmazione anche a chi non è un programmatoreprofessionista. La trattazione riguarderà solamente Microsoft Excel lecui prestazioni aumentano notevolmente grazie a VBA, tuttavia non vadimenticato che questo tipo di funzionalità può essere usato anche inWord, Access e Power Point.

Requisito fondamentale per coloro i quali intendessero seguirmi inquesto percorso formativo, è solamente una discreta conoscenza diMicrosoft Excel. Non voglio tediare il lettore con concetti astrusi ecomplicati, ma solamente dare familiarità con l'ambiente di sviluppo eun'infarinatura sui concetti della programmazione VBA, quindi dare achi apprende un minimo di indipendenza nell'iniziare a personalizzare ipropri fogli di lavoro.

Inizierò col descrivere l'ambiente di lavoro in cui andremo ad operare.In seguito spiegherò come creare un'interfaccia utente (finestra dicomandi) e come inserire il codice per farla funzionare. Le ultimesezioni saranno dedicate ad esempi pratici.

Affrontare un nuovo argomento è sempre un passo difficile, ma quandocomincerai a vedere i primi risultati concreti, il mondo di Excel VBA tiaffascinerà!

Buona lettura!

Cognolato Studio © 2004