You are on page 1of 140

Viaggio attraverso la conoscenza del pi diffuso linguaggio di creazione macro

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

Excel Visual Basic per applicazioni Autore: Enrico Cannoni Prima edizione Corso on.line - Novembre 2001 Seconda edizione- Versione CD-ROM - Dicembre 2001 Copyright 2001 Manuali Net U.R.L. www.manuali.it/ Copertina e progetto grafico di Enrico Cannoni Ogni cura stata posta nella raccolta e nella verifica della documentazione contenuta in questo corso. Tuttavia n lautore, n Manuali Net possono assumersi alcuna responsabilit derivanti dallutilizzo della stesa. Tutti i diritti sono riservati a norma di legge e a norma delle convenzioni internazionali. Nessuna parte di questo corso pu essere riprodotta con sistemi elettronici, meccanici o altri, senza lautorizzazione scritta dellEditore. Nomi e marchi citati nel testo sono generalmente depositati o registrati dalle rispettive case produttrici.

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

Sommario
Sommario _________________________________________________________ 3 Presentazione ______________________________________________________ 8 Informazioni preliminari_____________________________________________ 9 Cosa bisogna sapere per affrontare questo corso? _________________________ 9 Versioni di Excel __________________________________________________ 9 Convenzioni utilizzate ______________________________________________ 9 Contenuto del corso ________________________________________________ 10 PARTE 1 Introduzione alle macro _______________________________________ 14 Lezione I - Il registratore di macro ___________________________________ 15 Prepariamoci a registrare una macro __________________________________ 15 Iniziamo a registrare_______________________________________________ 16 Il registratore partito _____________________________________________ 17 Provare la macro _________________________________________________ 17 Lezione II Riferimenti relativi ______________________________________ 19 Registrare una macro con i riferimenti relativi __________________________ 19 Verificare una macro con i riferimenti relativi __________________________ 20 Macro o Procedura ________________________________________________ 21 Allarme virus ____________________________________________________ 21 Lezione III - Macro di navigazione ___________________________________ 22 Navigare tra fogli _________________________________________________ 22 Scorciatoie da tastiera _____________________________________________ 23 I pulsanti________________________________________________________ 23 Raccolta di istruzioni per la gestione dei pulsanti ________________________ 24 Ping Pong _______________________________________________________ 25 Lezione IV - Macro universali _______________________________________ 26 Cartella macro personale ___________________________________________ 26 Personal.xls _____________________________________________________ 27 Lezione V Barre degli strumenti ____________________________________ 29 Macro per visualizzare le barre ____________________________________ 29 Una nuova barra degli strumenti _____________________________________ 31 Rifinire i pulsanti _________________________________________________ 32 Lezione VI Moduli, la terra di nessuno_______________________________ 34 Intervallo dati denominato __________________________________________ 34 Casella combinata ________________________________________________ 35 Casella di controllo _______________________________________________ 37 Casella di selezione _______________________________________________ 38

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

Lezione VII Un modello valutario ___________________________________ 40 Euroconvert _____________________________________________________ 40 Predisporre la casella combinata _____________________________________ 41 La funzione Indice ________________________________________________ 42 Calcolare lEuro __________________________________________________ 43 Vincolare la quantit ______________________________________________ 43 Gestire gli eccessi_________________________________________________ 44 Considerazioni ___________________________________________________ 45 PARTE 2 Primi passi nel VBA __________________________________________ 46 Lezione VIII LEditor di VBA ______________________________________ 47 Aprire lEditor di VB ______________________________________________ 47 Le finestre dellEditor di VB ________________________________________ 48 La finestra Progetto _______________________________________________ 48 La finestra delle Propriet __________________________________________ 49 La finestra del Codice _____________________________________________ 49 Lezione IX Il codice delle macro ____________________________________ 51 Regole generali___________________________________________________ 51 Analizzare il codice di Macro1 ______________________________________ 52 Analizzare il codice della macro RiferimentiRelativi _____________________ 53 Modificare il contenuto di una macro _________________________________ 54 I nomi delle procedure _____________________________________________ 55 Identare il codice _________________________________________________ 55 Le maiuscole ____________________________________________________ 55 Lezione X Operare delle scelte con IF______________________________ 56 Il file Comuni ____________________________________________________ 56 Scomporre i problemi______________________________________________ 56 Registrare la colorazione di una cella _________________________________ 57 Esaminare il codice della macro Colorare ______________________________ 58 Lenunciato Whit _________________________________________________ 59 Eliminare codice superfluo _________________________________________ 59 Colorare e scendere _______________________________________________ 60 SeAllora ______________________________________________________ 60 Lezione XI Ripetere le azioni _______________________________________ 62 Pulsanti alternativi ________________________________________________ 62 Rinominare un modulo_____________________________________________ 62 I cicli___________________________________________________________ 63 Do WhileLoop _________________________________________________ 63 Do Until Loop _________________________________________________ 64 Almeno una volta _______________________________________________ 65

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

Lezione XII - Le variabili ___________________________________________ 66 Definizione di variabile ____________________________________________ 66 Non dichiarare le variabili __________________________________________ 66 Dichiarare le variabili______________________________________________ 66 Denominazione di variabili _________________________________________ 67 Tipo di dati delle variabili __________________________________________ 67 La notazione scientifica ____________________________________________ 68 Dichiarazione delle variabili e del tipo ________________________________ 68 Le costanti ______________________________________________________ 69 Portata delle variabili ______________________________________________ 69 Dichiarare le costanti ______________________________________________ 69 Lezione XIII Comunicazioni allutente_______________________________ 70 Una semplice finestra di messaggio___________________________________ 70 Gli argomenti di MsgBox___________________________________________ 70 Lezione XIV Interazione con lutente ________________________________ 74 Finestra input ____________________________________________________ 74 Loutput verso una cella____________________________________________ 75 Ancora sugli argomenti ____________________________________________ 76 Metodo InputBox _________________________________________________ 76 A capo _________________________________________________________ 77 Lezione XV Procedura decisionale __________________________________ 78 Variabili a portata di modulo ________________________________________ 78 Inserire una procedura dentro una procedura____________________________ 79 Programmazione strutturata _________________________________________ 79 Decolorare ______________________________________________________ 80 PARTE 3 Addentrarsi nel VBA _________________________________________ 81 Lezione XVI Trova _______________________________________________ 82 Pulire lEditor di VB ______________________________________________ 82 Una macro per trovare _____________________________________________ 83 La guida in linea__________________________________________________ 84 Lezione XVII InputBox e Trova ____________________________________ 86 Una variabile contro la rigidit ______________________________________ 86 Adattare una macro preesistente _____________________________________ 86 Una immagine come pulsante _______________________________________ 87

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

Lezione XVIII Gestione degli errori _________________________________ 88 Errori di linguaggio o di sintassi _____________________________________ 88 Errori di runtime__________________________________________________ 88 Errori logici _____________________________________________________ 88 Il primo errore ___________________________________________________ 89 Ancora logica ____________________________________________________ 89 Un errore da runtime ______________________________________________ 90 Un caso ambiguo _________________________________________________ 90 Un errore ortografico ____________________________________________ 91 Un errore spaziale_______________________________________________ 91 Non finiscono mai ________________________________________________ 91 Lezione XIX Debug _______________________________________________ 92 Punti di interruzione_______________________________________________ 92 Effettuare il debug ________________________________________________ 92 Intercettare gli errori di runtime ______________________________________ 94 Lezione XX I forms _______________________________________________ 95 Il primo form ____________________________________________________ 95 Forms e pulsanti __________________________________________________ 96 Personalizzare il pulsante tramite la finestra delle Propriet. _______________ 96 Evento clic ______________________________________________________ 97 Pubbliche e Private________________________________________________ 98 Lezione XXI Forms: atto II ________________________________________ 99 Dare vita ad un Form ____________________________________________ 99 Chiudere un Form _______________________________________________ 100 Aggiungere un altro pulsante _______________________________________ 100 Duplicare i pulsanti ______________________________________________ 101 Lezione XXII Allora Se___________________________________________ 102 Chiedere conferma _______________________________________________ 102 Scegliere un colore _______________________________________________ 103 I Pulsanti di opzione______________________________________________ 103 IfThenElse IfElseEnd If ___________________________________ 104 Case __________________________________________________________ 106 Lezione XXIII Ciclo For Next ___________________________________ 107 Ricavare dati da una cella _________________________________________ 108 Errore di Overflow _______________________________________________ 109 Proteggere e sproteggere __________________________________________ 109 Lezione XXIV Nidificare For Next _______________________________ 111 Il codice di ordinamento___________________________________________ 111

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

Parte 4 Controllare Excel _____________________________________________ 113 Lezione XXV Le Function ________________________________________ 114 Tipi di routine___________________________________________________ 114 Creare una nuova funzione per Excel ________________________________ 114 Analisi del problema _____________________________________________ 115 Come trovare limporto netto_______________________________________ 115 CompensoNetto _________________________________________________ 116 Lezione XXVI Manipolare i dati ___________________________________ 118 Costruire lesempio ______________________________________________ 118 Funzioni Len e Left ______________________________________________ 119 Ottimizzare _____________________________________________________ 120 Passare i dati ad un nuovo foglio ____________________________________ 121 Pulire solo se _________________________________________________ 123 Lezione XXVII Auto_Apri_Chiudi _________________________________ 124 Auto_Apri _____________________________________________________ 124 Auto_Chiudi ____________________________________________________ 125 Un po di storia __________________________________________________ 125 Istruzioni varie __________________________________________________ 125 Esempi di Auto_Apri e Auto_Chiudi_________________________________ 126 Proteggere _____________________________________________________ 127 Lezione XXVIII I macro virus _____________________________________ 128 Come difendersi _________________________________________________ 128 Difesa artigianale ________________________________________________ 129 Appendici __________________________________________________________ 130 Unanimazione con Excel __________________________________________ 131 Il codice _______________________________________________________ 132 Controllare la risoluzione dello schermo ______________________________ 134 Impostazioni ____________________________________________________ 134 Listato_________________________________________________________ 135 Il commento del codice ___________________________________________ 136 File allegato ______________________________________________________ 138 Conclusioni ______________________________________________________ 139 Indice rapido_____________________________________________________ 140

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

Presentazione
A partire dalla lontana versione 5.0 (1993), Excel primo fra i programmi della Microsoft, introdusse un nuovo strumento di automatizzazione, il Visual Basic per Applicazioni. Il VBA (acronimo di Visual Basic for Application) un vero e proprio linguaggio di programmazione, che appartiene alla famiglia del Visual Basic e ne possiede identica sintassi e struttura, ma a differenza di questultimo contiene degli oggetti peculiari di un foglio elettronico. Grazie al connubio fra Excel e il VBA stata data la possibilit, ad un gran numero di utenti, di creare potenti sistemi informativi completamente automatizzati, prerogativa sino a non molto tempo fa riservata ai soli programmatori professionisti. La strategia della Microsoft, a partire da Office 97, ha introdotto il VBA in tutte le sue applicazioni, in modo tale da diventare un unico linguaggio di programmazione, nella specificit dei rispettivi ambienti di lavoro. Ci ha favorito al massimo grado quella sinergia fra programmi, quali Excel ed Access per esempio, da tanti invocata. Nonostante tutte queste premesse favorevoli, in Italia il VBA non ha incontrato il successo che ci si poteva attendere, come ad esempio ha avuto negli Stati Uniti. Soprassedendo sulle varie ragioni culturali ed economiche, la scarsa diffusione del VBA probabilmente da ricercare nelle difficolt che gli utenti incontrano nellapprendere la sintassi di un linguaggio di programmazione. Il primo passo che occorre intraprendere per rendere la curva di apprendimento del VBA meno erta proprio quella di avvicinarvisi dal versante di Excel, che grazie al suo Registratore di Macro rende tutto molto pi semplice. Il secondo passo lo compie questo corso, durante il quale si cercher di accompagnare gli utenti con esempi pratici e concreti, senza avventurarsi in dissertazioni e finezze teoriche, sicuramente fondamentali per un programmatore professionista, ma non indispensabili per un utente evoluto che vuole essere subito produttivo. Insomma quello che vi trovate innanzi un corso di programmazione per non programmatori grazie al quale sarete in grado di costruire applicazioni molto potenti. Novembre 2001

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

Informazioni preliminari

Cosa bisogna sapere per affrontare questo corso? Per affrontare proficuamente lapprendimento del VBA non necessario avere avuto precedenti esperienze di programmazione, ma sicuramente indispensabile conoscere bene Excel. Versioni di Excel Pur essendo le immagini di corredo alle lezioni tratte da Excel 10 (Office XP), si possono utilizzare tranquillamente anche le relase 9 (Office 2000) e 8 (Office 97). Pi problematica si presenta la situazione per chi ancora dispone di Excel 7 (Office 95), o addirittura la mitica versione 5 per Windows 3.1. Naturalmente non assolutamente possibile utilizzare degli autentici fossili tipo Excel 4. Convenzioni utilizzate Esempio di convenzione Debug SaltaErrore
Do While ActiveCell <>

CTRL+C Nota: Non fate

Descrizione Le parole in corsivo evidenziano elementi di Excel o del VBA. Il grassetto indica i nomi attribuiti alle procedure, alle variabili, ai fogli di lavoro e alle celle. Il font Verdana con rientro sporgente evidenzia codice di esempio. Il testo bordato indica tasti, combinazioni di tasti o pulsanti. Testo su sfondo grigio, indica note o approfondimenti.

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

10

Contenuto del corso

INTRODUZIONE ALLE MACRO


LEZIONE I Il registratore di macro Prendere confidenza con il registratore di macro e verificarne il funzionamento. LEZIONE II Riferimenti relativi Registrare ed eseguire una macro. Apprendere la differenza fra macro con riferimenti assoluti e macro con riferimenti relativi. LEZIONE III Macro di navigazione Navigare allinterno di un foglio e fra fogli. Associare le macro registrate a dei pulsanti. LEZIONE IV Macro universali Rendere le macro sempre disponibili. I segreti di Personal.xls. LEZIONE V Barre degli strumenti Registrare una serie di azioni e associarle ai pulsanti di una nuova Barra degli strumenti. LEZIONE VI Moduli, la terra di nessuno I controlli della Barra degli strumenti Moduli. Esaminare il funzionamento della Casella combinata, della Casella di controllo e della Casella di selezione: controlli direttamente disponibili nel foglio di lavoro. LEZIONE VII Un modello valutario Utilizzando gli strumenti presentati nella precedente lezione e una buona conoscenza del foglio elettronico costruiremo un programma di conversione di alcune valute Europee in Euro.

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

11

PRIMI PASSI NEL VBA


LEZIONE VIII LEditor di VBA Descrizione dellambiente di programmazione. LEZIONE IX Il codice delle macro Leggere, analizzare e modificare il codice della macro precedentemente registrate. LEZIONE X Operare delle scelte con IfThen Scrivere routine che verificando determinate condizioni eseguono operazioni diverse a seconda del risultato. LEZIONE XI Eseguire il ciclo Do WhileLoop Le strutture a ciclo consentano di eseguire ripetutamente una serie di istruzioni. LEZIONE XII Le variabili Cosa sono le variabili. Tipi di variabili. Dichiarare le variabili. LEZIONE XIII Comunicazioni allutente Usare MsgBox (Finestra messaggio). LEZIONE XIV Interazione con lutente Usare InputBox (Finestra di input) LEZIONE XV Procedura decisionale Usando InputBox e MsgBox creare una procedura che agisce secondo le decisioni prese dallutente.

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

12

ADDENTRARSI NEL VBA


LEZIONE XVI Trova Implementare con il VBA una procedura di ricerca. LEZIONE XVII InputBox e Trova Rendere pi flessibile la ricerca di un campo sfruttando le potenzialit di InputBox. LEZIONE XVIII Gestire gli errori Imparare ad intercettare gli errori per rendere le procedure pi professionali. LEZIONE XIX Debug Esaminare una procedura durante lesecuzione passo passo per verificarne il funzionamento. LEZIONE XX I Forms Costruire una Finestra di dialogo. LEZIONE XXI Forms. Atto II Approfondire le modalit di gestione di un form. LEZIONE XXII Allora Se Potenziare le procedure precedentemente create con la struttura di controllo IfThen...ElseIfElseEnd If e i Pulsanti di opzione. Ottimizzare con la struttura di controllo Case. LEZIONE XXIII Ciclo ForNext For, routine da utilizzare quando si a conoscenza del numero di volte che le istruzioni di un ciclo vanno ripetute. Il suo impiego facilita la creazione di piccole utilit. Passare ad una procedura il valore contenuto in una cella. LEZIONE XXIV Nidificare ForNext Inserire un ciclo ForNext allinterno di un altro ciclo ForNext, aumenta enormemente le nostre possibilit in Excel.

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

13

CONTROLLARE EXCEL
LEZIONE XXV Le Function Differenze fra Sub e Function. Con lo strumento Function possibile creare nuove funzioni per il foglio di lavoro Excel. LEZIONE XXVI Manipolare i dati Costruzione di una procedura che ripulisce il contenuto delle singole celle di una colonna da caratteri superflui, che poi copia in un altro foglio di lavoro. Sar introdotto luso delle funzioni interne Len e Left.. LEZIONE XXVII Auto_Apri_Chiudi Con lausilio di particolari macro possibile eseguire delle routine in fase di avvio e di chiusura di Excel. Piccola carrellata di routine adibite a potenziare gli automatismi delle nostre procedure. LEZIONE XXVIII I macro virus Come difendersi dai macro virus Appendice Unanimazione per misurare le prestazioni del PC.

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

14

PARTE 1 Introduzione alle macro


In questa prima fase del corso impareremo ad usare il Registratore di macro. Si tratta di uno strumento piuttosto limitato, ma il suo uso rappresenta un buon trampolino di lancio per imparare a programmare con il VBA. Affrontando lo studio della cartella Personal.xls impareremo a rendere globali le nostre macro. Infine, grazie al sapiente utilizzo dei controlli offerti dalla barra degli strumenti Moduli, impareremo a creare applicazioni sorprendenti senza usare una sola parola di codice.

Al corso allegato un file di Excel, di nome Comuni, contenente, oltre ai soliti tre fogli vuoti, un foglio denominato Comuni, contenente lelenco di tutti i comuni della provincia di Torino. A partire dalla nona lezione dovrete utilizzare i dati presenti nel foglio di lavoro citato nel precedente paragrafo. E comunque consigliato usare la cartella di lavoro Comuni sin dalla prima lezione.

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

15

Lezione I - Il registratore di macro


Il Registratore di Macro un mezzo per memorizzare e riutilizzare le azioni compiute con la tastiera e/o con il mouse, permettendo cos di creare delle procedure automatizzate chiamate Macro. Le Macro eseguono sequenze di azioni molto pi rapidamente di noi. Prepariamoci a registrare una macro Prima di iniziare la registrazione, dobbiamo pianificare le azioni che vorremo successivamente far eseguire alla macro, poich eventuali ripensamenti che dovessero sopraggiungere durante la registrazione saranno impietosamente memorizzati e quindi riprodotti dalla macro. Noi, ad esempio, vogliamo grassettare le intestazioni della tabella dati riportata nellimmagine sottostante.

Per effettuate loperazione voluta dovremo spostarci dalla cella A1 alla cella A3, selezionare lintervallo A3:F3 per poi cliccare sul comando grassetta. Certo in questo caso le operazioni da effettuare sono molto semplici, ma se la registrazione da fare ci richiedesse un buon numero di azioni, sarebbe consigliabile effettuare una o pi prove senza avviare il registratore. La possibilit di compiere degli errori molto alta.

NOTA: importante porre molta attenzione nelle azioni che registreremo, poich anche la pi piccola variazione pu creare ripercussioni assolutamente imprevedibili.

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

16

Iniziamo a registrare Dal menu Strumenti scegliere Macro per espandere una ulteriore tendina e cliccare sulla voce Registra nuova macro .

Sar visualizzata una finestra di dialogo denominata Registra Macro.

In questa prima registrazione non ci soffermeremo sulle opzioni che ci vengono offerte, lasceremo invariato anche il poco fantasioso nome di default Macro1. Cliccare su OK per confermare linizio della registrazione.

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

17

Il registratore partito In apparenza non sembra essere successo niente se escludiamo la presenza di un nuovo pulsante nellarea di lavoro. Ad essere precisi il pulsante una barra degli strumenti che prende il nome di Interrompi registrazione e serve appunto a bloccare la registrazione della macro. Iniziamo ad eseguire le operazioni precedentemente provate: spostarsi dalla cella A1 alla cella A3, selezionare lintervallo A3:F3 per poi cliccare sul comando grassetta. Infine deselezioniamo attivando la cella A2. Finito il nostro compito stoppiamo la registrazione cliccando sullapposito pulsante.

NOTA: Quando volete fermare la registrazione fate attenzione a non posizionarvi sulla X, poich in tal caso chiudereste la barra degli strumenti Interrompi registrazione, lasciando il registratore di macro beatamente acceso.

Provare la macro Adesso verifichiamo il nostro operato. Propedeuticamente selezioniamo nuovamente lintervallo A3:F3 e togliamo la grassettatura, altrimenti risulter difficile valutare leffetto della nostra prima macro

Quindi dal menu Strumenti\Macro scegliamo la voce Macro .

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

18

Sar visualizzata la finestra di dialogo Macro, al momento ospitante la sola Macro1. Cliccando sul pulsante Esegui la macro sar avviata

e come dincanto le intestazioni della tabella saranno grassettate. Proviamo a ripetere lesecuzione della macro, spostandoci per, prima di avviarla, nella cella C5 e togliendo la grassettatura. Anche in questo caso la macro viene eseguita correttamente. Ma allora perch abbiamo fatto questa prova? Portate pazienza, con la prossima registrazione scopriremo larcano.

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

19

Lezione II Riferimenti relativi

Registrare una macro con i riferimenti relativi Iniziamo a registrare una seconda macro, avendo avuto cura di eliminare leventuale grassettatura dalle intestazioni della tabella e di posizionarsi sulla cella A1. Dal menu Strumenti scegliere Macro per espandere una ulteriore tendina e cliccare sulla voce Registra nuova macro . Questa volta sostituiamo il nome predefinito Macro2 con il nuovo nome RiferimentiRelativi. Quindi clicchiamo su OK per dare inizio alla nuova registrazione. Individuiamo nellarea di lavoro la barra degli strumenti Interrompi registrazione e prima di effettuare una qualsiasi azione cliccare sul pulsante Riferimento relativo. Spostarsi dalla cella A1 alla cella A3, selezionare lintervallo A3:F3 per poi cliccare sul comando grassetta Infine deselezionare attivando la cella A2.

Interrompiamo la registrazione cliccando sullapposito pulsante.

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

20

Verificare una macro con i riferimenti relativi Posizioniamoci sulla cella A1 e dal menu Strumenti\Macro clicchiamo sulla voce Macro per visualizzare la finestra di dialogo Macro. Selezioniamo la nuova macro RiferimentiRelativi e clicchiamo sul pulsante Esegui.

Anche questa volta la macro eseguir il suo lavoro correttamente. Ma adesso proviamo a rieseguire RiferimentiRelativi posizionando la cella attiva in C5. Ricordiamoci di togliere preventivamente la grassettatura dalle intestazioni. Constaterete che in questo caso la macro non ha funzionato. Vediamo di capire il perch. La prima macro, Macro1, funziona sempre indipendentemente dalla cella attiva al momento della sua esecuzione, poich una macro con riferimenti assoluti; essa sa che deve iniziare in ogni caso il suo lavoro dalla cella A3. Invece RiferimentiRelativi, come dice il suo nome una macro con riferimenti relativi. Durante la registrazione ci siamo spostati dalla cella A1 alla cella A3, cio siamo scesi in basso di due celle. Quindi la nostra macro, essendo relativa, non ha registrato lo spostamento sulla cella A3, bens ha registrato uno spostamento in basso di due celle. Pertanto essa strettamente condizionata dalla cella di partenza. Si potrebbe dire che le macro con riferimenti assoluti sono pi sicure, ma pi rigide potendo essere utilizzate solo in locazioni non modificabili, mentre le macro con riferimenti relativi sono flessibili ma pi difficili da gestire. In realt le applicazioni pratiche di queste macro sono estremamente limitate, il loro vero valore di tipo didattico e ce ne renderemo bene conto quando passeremo ad esaminare il codice che hanno generato nelle esercitazioni precedenti.

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

21

Macro o Procedura I termini Macro e Procedura, secondo alcuni autori, non sono equivalenti. Si attribuisce lappellativo macro al codice prodotto con il registratore di macro, mentre si definisce procedura ci che viene scritto completamente a mano, senza lausilio del registratore. In realt il codice che viene prodotto con il VBA di Excel spesso il risultato combinato delluso del registratore e di scrittura diretta del codice: pertanto, distinguere i due termini risulterebbe alquanto pleonastico, conseguentemente in questo corso le due definizioni saranno considerate sinonimi. Allarme virus Sappiamo tutti che la nostra cartella di lavoro, avendo utilizzato il registratore, in fase di apertura visualizzer una finestra segnalante la presenza di macro, potenziali veicolatici di virus. Nessun allarmismo in questo caso, clicchiamo pure su Attiva macro, ma attenzione a non abbassare la guardia con file di altra provenienza.

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

22

Lezione III - Macro di navigazione


In questa terza lezione continueremo ad usare il Registratore generando delle macro che, per quanto semplici, si riveleranno anche molto utili. Diciamo che alla fine di questa lezione , se dotati di un buon spirito dinventiva potremo costruire un primo rudimentale sistema informativo. Navigare tra fogli Spostarsi fra i fogli di lavoro di una cartella, servendosi delle apposite schede, non sempre agevole, soprattutto per gli utenti non molto avvezzi alluso del pc. Inoltre in certi casi si preferisce disattivare la visualizzazione delle schede, per poter cos creare una navigazione guidata tra i fogli. Ma nel caso test prospettato, in che modo le macro possono aiutarci? Innanzi tutto registriamo una macro che ci porti al Foglio2. Attivare il Foglio1 poich per poter registrare lo spostamento al Foglio2 chiaramente indispensabile avviare la registrazione da una locazione diversa da quella di destinazione. Portarsi sul menu Strumenti\Macro e avviare il Registratore di macro. Denominare la macro Navigator e confermare cliccando su OK. Attivare il Foglio2 registrazione. e interrompere la

Verifichiamo il funzionamento di Navigator. Portarsi nel Foglio1. Dal menu Strumenti\Macro scegliere Macro. Eseguire la macro denominata Navigator. Verremo trasportati nel Foglio2. Per, se nei nostri intendimenti vi era lobiettivo di rendere pi facile la vita degli utenti, dovremo operare qualche ulteriore accorgimento.

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

23

Scorciatoie da tastiera Mettiamo nuovamente mano al registratore, avviandolo dal menu Strumenti\Macro\Registra nuova macro. Lasciamo invariato il nome della macro proposto da Excel e spostiamo il nostro interesse alla casella di controllo Tasto di scelta rapida che presenta preimpostato il tasto CTRL. Se noi inserissimo nella casella di controllo la lettera M ad esempio, per avviare la macro associata, basterebbe digitare la combinazione di tasti CTRL+M. Il problema che sono molti i comandi associati alla combinazione CTRL pi lettera dellalfabeto, quindi pi prudente utilizzare la combinazione di tasti CTRL+SHIFT+M o una qualche altra lettera. Per operare una simile combinazione di tasti occorre tener schiacciato il tasto SHIFT mentre viene digitata la lettera da associare. Non male! Peccato che le scorciatoie da tastiera siano un ottimo strumento per utenti esperti, non certo per neofiti!

I pulsanti Indubbiamente il sistema pi comodo e facile per far eseguire delle operazioni a chiunque, quello di usare un pulsante. Dal menu Visualizza\Barre degli strumenti scegliere Moduli. Individuare loggetto Pulsante e cliccarci sopra. Spostare il puntatore del mouse in una zona libera del foglio ed effettuare un clic. Sar automaticamente generato un pulsante ed avviata la finestra di dialogo Assegna macro, dalla quale bisogner selezionare il nome della macro di nostro interesse, che in questo caso sar Navigator. Confermare cliccando su OK.

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

24

A questo punto, senza nullaltro fare, digitare il nuovo nome per il pulsante che, per rendere chiara la sua funzione sar Foglio 2. Deselezionarlo eseguendo un clic a vuoto. Posizionando il puntatore del mouse sulla nuova creazione lo vedremo trasformarsi in una manina ad indicare la sua associazione ad una macro. Ciccandoci sopra sarete proiettati nel Foglio2.

Raccolta di istruzioni per la gestione dei pulsanti Per poter spostare, dimensionare o rinominare un pulsante devono essere presenti le maniglie. Nel caso gli sia associata una macro cliccandoci sopra questa sar eseguita rendendo impossibile far comparire le maniglie. In tal caso prima di cliccare sulloggetto, tenere premuto il tasto CTRL. Non volendo associare una macro al pulsante allatto della creazione occorrer cliccare su Annulla nella finestra di dialogo Assegna macro. Per associare una macro ad un pulsante cliccarci sopra con il tasto destro del mouse e dal menu contestuale scegliere Assegna macro.

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

25

Ping Pong Grazie al pulsante precedentemente creato possiamo attivare il Foglio2: ma adesso vogliamo anche ritornare indietro, sempre utilizzando un pulsante. Attivare il Foglio2. Dal menu Strumenti\Macro scegliere Registra nuova macro. Rinominare la macro Navigator2. Portarsi nel Foglio1 ed interrompere la registrazione. Finita la fase di registrazione ritornare nel Foglio2. Dalla barra degli strumenti Moduli selezionare loggetto Pulsante e cliccare in una zona vuota del foglio per generarlo. Associargli la macro Navigator2. Rinominare il pulsante Indietro e deselezionarlo cliccando a vuoto. A questo punto sarete in grado di passare dal Foglio1 al Foglio2 e viceversa cliccando sui due pulsanti. Per rendere pi evidente le potenzialit del lavoro svolto in questa lezione, dal menu Strumenti scegliete la voce Opzioni, attivate la scheda Visualizza e quindi deselezionate lopzione Schede. Noterete che per muoversi fra i fogli della cartella sarete obbligati a servirvi dei pulsanti, quindi ad una navigazione guidata. Nota: Per spostarsi da un foglio di lavoro allaltro si possono anche utilizzare le combinazioni di tasti: CTRL+Pag , per passare al foglio successivo, o CTRL+Pag per tornare al foglio precedente.

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

26

Lezione IV - Macro universali


E giunto il momento di conoscere pi approfonditamente la finestra di dialogo Registra macro. Cartella macro personale Tutti gli elementi della finestra di dialogo Registra macro sono di immediata comprensione. Tutti , escludendo la voce Memorizza macro in : , la quale ospita un piccolo elenco di possibilit fra le quali scegliere.

Questa cartella di lavoro o Scelta di default. o Le macro saranno contenute nella cartella di lavoro nella quale sono state registrate. o Le suddette macro saranno disponibili per le altre cartelle solo se la cartella che le contiene aperta. Cartella macro personale o Le macro non saranno contenute nella cartella dalla quale stata effettuata la registrazione. o Le macro saranno sempre disponibili, indifferentemente dalla cartella aperta. o Nelleventualit la cartella sia esportata in un altro pc, le macro (quelle registrate con la modalit Cartella macro personale) non saranno disponibili. Nuova cartella di lavoro o Opzione di scarsa utilit.

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

27

Personal.xls Quando registriamo una macro in modalit Cartella macro personale , questa non viene memorizzata nella cartella in uso, bens in una cartella nascosta che si chiama Personal.xls. Nota : La cartella Personal.xls non esiste come file sino a quando non viene effettuata una registrazione in modalit Cartella macro personale. Ogni volta che Excel viene avviato il file Personal.xls, pur rimanendo nascosto, viene aperto, mettendo le sue macro a disposizione delle altre cartelle aperte.

E possibile visualizzare la cartella Personal.xls scegliendo dal menu Finestra la voce Scopri, che visualizza lomonima finestra di dialogo.

E comunque consigliabile nascondere Personal.xls cliccando su Nascondi sempre dal menu Finestra.

Nota: I macro virus che affliggano Excel hanno la consuetudine di eleggere a loro quartiere generale Personal.xls.

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

28

Ma dove sita la cartella Personal.xls ? Non troppo complicato da esporre con Windows 95/98. PERCORSO C:\ Programmi\ Microsoft Office\ Office\ XLStart\ Personal.xls DESCRIZIONE O altra unit disco O similare

Pi complesso con Windows 2000. PERCORSO C:\ Documents and settings\ Enrico Cannoni\ Dati applicazioni\ Microsoft\ Excel\ XLStart\ Personal.xls DESCRIZIONE O altra unit disco

Il nome dellutente

I files ospitati allinterno della directori XLStart vengono eseguiti automaticamente allavvio di Excel.

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

29

Lezione V Barre degli strumenti


In questa lezione vedremo come sfruttare al meglio gli strumenti di personalizzazione delle barre degli strumenti offerti da Excel. Il nostro compito sar quello di creare una piccola barra degli strumenti, disponibile da tutte le cartelle del nostro computer, dalla quale richiamare le barre di uso pi frequente. Macro per visualizzare le barre Selezionare il menu Visualizza\Barre degli strumenti e deselezionare le barre Standard e Formattazione. Dal menu Strumenti\Macro lanciare Registra nuova macro. Denominare la macro Standard e memorizzarla in Cartella macro personale. Confermare lavvio della registrazione cliccando su OK.

Dal menu Visualizza\Barre degli strumenti attivare la barra Standard. Interrompere la registrazione. Siccome caldamente consigliato verificare sempre il funzionamento della macro registrata, disattivare nuovamente la barra degli strumenti Standard e richiamare la finestra di dialogo Macro dal menu Strumenti\Macro.

Nota: E interessante osservare che la macro Standard a differenza delle altre preceduta da Personal.xls! , il file ove ospitata.

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

30

Selezionare Standard e cliccare sul pulsante Esegui.

La barra degli strumenti Standard sar immediatamente ripristinata.

Nota: Nelleventualit che la macro Standard non fosse disp onibile nellelenco della finestra di dialogo Macro, prescindendo da un vostro errore, controllate che la casella Macro in: sia impostata su Tutte le cartelle di lavoro aperte.

Seguendo i punti da 1 a 6, precedentemente illustrati, si proceda a registrare le macro Formattazione, Disegno e Moduli, attivanti le omonime barre degli strumenti.

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

31

Una nuova barra degli strumenti Creare linvolucro della nuova barra degli strumenti unoperazione molto semplice. Fare clic su Personalizza dal menu Visualizza\Barre degli strumenti. Nella finestra di dialogo Personalizza attivare la scheda Barre degli strumenti. Cliccare sul pulsante Nuova .

Apparir una nuova barra degli strumenti, priva di ogni pulsante che, salvo diversa scelta, si chiamer Personalizzata1. Nella finestra di dialogo Personalizza scegliere la scheda Comandi per aggiungere dei pulsanti alla barra degli strumenti Personalizzata1. Nel riquadro di sinistra, Categorie scegliere Macro.

Dal riquadro di destra, Comandi, trascinate Pulsante personalizzato, la faccina che ride, allinterno della barra degli strumenti in costruzione.

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

32

Cliccare con il tasto destro del mouse sul pulsante e dal menu contestuale che apparir, scegliere Assegna macro.

Dalla finestra di dialogo Macro scegliere la macro Standard e confermare cliccando su OK. Chiudere la finestra di dialogo Personalizza. Verificare il funzionamento del tutto.

Rifinire i pulsanti Il tutto funziona bene, lunico neo rappresentato dalletichetta autoesplicativa che, compare quando si posiziona il puntatore del mouse sul pulsante, poich la dicitura Pulsante personalizzato eccessivamente generica.. Dopo aver aperto la finestra di dialogo Personalizza, cliccare con il tasto destro del mouse sul pulsante e nel conseguente menu contestuale portarsi sulla voce Nome e rinominare il predefinito Pulsante personalizzato in Barra Standard. Adesso possiamo inserire nella nostra barra degli strumenti un secondo pulsante. Seguiamo le istruzioni precedentemente illustrate, con lunica differenza di associare la macro denominata Formattazione, che permette la visualizzazione dellomonima barra degli strumenti.

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

33

Per rendere questo secondo pulsante distinguibile dal primo, clicchiamoci sopra con il tasto destro del mouse e dal menu contestuale che apparir, posizionarsi su Cambia icona pulsante per disporre di una discreta raccolta di icone per pulsanti.

Ripetere le operazioni descritte precedentemente anche per le macro Disegno e Moduli. A questo punto potrete verificare che la nuova barra degli strumenti disponibile per qualsiasi cartella di lavoro del vostro computer, o profilo per gli utilizzatori di NT.

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

34

Lezione VI Moduli, la terra di nessuno


Generalmente si ritiene che la creazione di interfacce grafiche con caselle combinate, caselle di comando e altri controlli visivi siano unattivit esclusiva degli sviluppatori. Con Excel possibile disporre di controlli grafici senza conoscere una sola parola di programmazione. Tale possibilit ci data dagli strumenti disponibili sulla barra degli strumenti Moduli, gi sperimentata nella seconda lezione, che ci permette di inserire i suoi controlli direttamente su un foglio di lavoro. Possiamo dire di avventurarci in un territorio inesplorato sia dagli utenti di Excel che dai programmatori, insomma in una terra di nessuno. Intervallo dati denominato Inizieremo il nostro studio sui controlli della barra degli strumenti Moduli, prendendo in esame la Casella Combinata. Nota: Nelleventualit non fosse chiaro di quale oggetto stiamo parlando, pensate ai vari menu a tendina usati per cambiare il tipo di font e le dimensioni dei caratteri. Per poter vedere una Casella combinata in funzione occorre disporre di un intervallo di dati denominato. Partendo dalla cella A2 di un foglio intonso, si digitino i nomi della citt visibili nellimmagine sottostante. Selezionare lintervallo di dati A2:A8. Scegliere Crea dal menu Inserisci\Nome. Apparir la finestra di dialogo Crea nomi e dopo aver controllato che sia selezionata la sola opzione Riga superiore, confermare cliccando su OK.

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

35

Verifichiamo leffetto dellintervallo denominato test creato.

Fare clic sul pulsante della Casella del nome e selezionare il nome Citt dallintervallo dellelenco a discesa. Leffetto che si otterr sar la selezione di tut ti i nomi di citt sottostanti letichetta Citt, che sarebbe il nome dellintervallo dati denominato.

Nota: In realt la Casella del nome non altro che una Casella combinata, quindi lesatta dicitura sarebbe: cliccare sulla casella combinata Casella del nome.

Casella combinata Passiamo alla vera e propria creazione della Casella combinata. Dal menu Visualizza\Barre degli strumenti scegliere Moduli. Sfruttando le propriet di autoesplicazione dei pulsanti, cercare il controllo Casella combinata e cliccarci sopra. Posizionarsi sulla cella C4 e modellare un riquadro grande allincirca come due celle. Fare clic con il tasto destro sulla Casella combinata or ora creata e dal menu contestuale scegliere la voce Formato controllo.

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

36

Apparir la finestra di dialogo Formato controllo ove dovremo selezionare la scheda Controllo. Nella casella Intervallo di input: digitare Citt, nella casella Collegamento cella: digitare C1 e cliccare su OK.

Deselezionare loggetto cliccando a vuoto. Cliccando sul pulsantino della Casella combinata vedremo comparire la lista delle citt e cliccando su una di esse, ad esempio Milano, nella cella C2 comparir il numero 2. Provando a fare clic su Firenze in C1 sar inserito il 4.

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

37

Cerchiamo di capire come siamo riusciti ad ottenere un simile risultato. Digitando Citt nella casella Intervallo di input della finestra di dialogo Formato controllo, abbiamo detto alla Casella combinata: Guarda casella che tu devi contenere lelenco di nomi corrispondente allintervallo di dati Citt, cio Torino, Milano, Venezia ecc. .Poi, la citt che sceglier dovrai indicarla nella cella C1, la cella appunto digitata in Collegamento cella. Ma che cosa che quel numero che compare in C1? Semplice, il numero di posizione nellelenco dellelemento scelto. Milano il secondo, quindi corrisponde al numero 2. Casella di controllo La Casella di controllo, altro oggetto molto diffuso, serve ad indicare se vogliamo o non volgiamo fare una certa cosa, se vero o non vero o meglio VERO o FALSO. Dalla barra degli strumenti Moduli cliccare sulloggetto Casella di controllo. Fare clic in corrispondenza della cella C9, sar automaticamente generata una Casella di controllo.

Cliccare con il tasto destro sulla Casella di controllo per far apparire il menu contestuale, dal quale selezionare Formato controllo.

Apparir la finestra di dialogo Formato controllo ove dovremo selezionare la scheda Controllo. Nella casella Collegamento cella digitare B9. Deselezionare loggetto cliccando a vuoto.

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

38

Cliccando sulla Casella di controllo vi comparir un segno di spunta e nella cella B9, quella indicata in Collegamento cella, VERO. Cliccando nuovamente sulla Casella di controllo il segno di spunta sar tolto e in B9 comparir FALSO.

Casella di selezione Dalla barra degli strumenti Moduli cliccare sulloggetto Casella di selezione. Fare clic in una zona vuota del foglio per generare automaticamente una Casella di selezione. Fare clic con il tasto destro sulla Casella di selezione per far apparire li menu contestuale, dal quale selezionare Formato controllo. Selezionare la scheda Controllo e digitare: o Valore corrente 10 o Valore minimo 10 o Valore massimo 100 o Avanzamento 5 o Collegamento cella H1 Cliccare su OK.

Deselezionare il controllo.

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

39

Adesso cliccando sulla sezione superiore della Casella di selezione vedrete il valore in H1 aumentare di 5 in 5 sino ad un massimo di 100. Cliccando sulla parte inferiore diminuir di 5 in 5 sino ad un minimo di 10. Probabilmente, dopo un primo momento di soddisfazione, vi sorger un dubbio. Ma a che servono questi controlli? Portate pazienza, nella prossima lezione realizzeremo una interessante applicazione che ricorrer agli oggetti test studiati.

Nota: Nei controlli ove si imposta un valore massimo non possibile superare 30.000.

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

40

Lezione VII Un modello valutario


Questa lezione potrebbe risultare particolarmente impegnativa, soprattutto per chi non fosse dotato di una adeguata conoscenza di Excel. Ma qu cogliamo loccasione per ribadire che, soltanto chi gi conosce bene il foglio elettronico potr trarre pieno giovamento da questo corso di VBA. Excel dotato di una funzione, Euroconvert, in grado di convertire il valore delle valute Europee in euro . Ma se per un utilizzatore di Excel di medie capacit, ricorrere ad una funzione non rappresenta certo un problema, ben diversa la situazione per quegli utenti sprovveduti di conoscenze sul foglio elettronico. Il nostro compito sar quello di creare un programma di conversione in euro dallinterfaccia amichevole.

Euroconvert Diamo una rapida occhiata alla sintassi delle funzione Euroconvert. =Euroconvert(Numero ; Origine; Destinazione) Numero Origine Destinazione Importo da convertire. Il codice ISO della moneta di origine. Il codice ISO della moneta di destinazione.

Nellesempio sottostante vediamo come convertire 1000 lire in euro.


=Euroconvert(1000;itl;eur)

Il risultato 0,52 Nota: Nella guida di Excel troverete tutti i ragguagli relativi alla funzione Euroconvert.

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

41

Predisporre la casella combinata Lutilizzo di una Casella combinata prevede un intervallo dati denominato. Partendo dalla cella J2 di un foglio vuoto, digitare i dati sottostanti. Paese Francia Italia Paesi Bassi Germania Spagna Moneta Franco Lira Fiorino Marco Peseta CodiceISO frf itl nlg dem esp

Selezioniamo lintervallo di dati K2:L7. Scegliere Crea dal menu Inserisci\Nome. Nella finestra di dialogo Crea nomi lasciare selezionata solo Riga superiore e confermare cliccando su OK .

Nota: In realt abbiamo creato due intervalli denominati, Moneta e CodiceISO. Passiamo alla creazione di una Casella combinata. Dal menu Visualizza\Barre degli strumenti scegliere Moduli. Sfruttando le propriet di autoesplicazione dei pulsanti cercare nella barra Moduli il controllo Casella combinata e cliccarci sopra. Posizionarsi sulla cella E5 e modellare un riquadro grande allincirca come due celle. Fare clic con il tasto destro sulla Casella combinata or ora creata e dal menu contestuale scegliere la voce Formato controllo. Apparir la finestra di dialogo Formato controllo ove dovremo selezionare la scheda Controllo. Nella casella Intervallo di input: digitare il nome dellintervallo denominato Moneta, nella casella Collegamento cella: digitare G5 e cliccare su OK. Deselezionare loggetto cliccando a vuoto.

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

42

La funzione Indice Inseriamo nella colonna B i dati come raffigurati nellimmagine sottostante, la quale ci lascia intuire che la moneta presente nella cella C4, Peseta, quella scelta con la Casella combinata. Sempre nellimmagine sottostante la Barra della formula, indicante il contenuto della cella C4, ci mostra la funzione Indice.

Esaminiamo brevemente anche la sintassi della funzione INDICE.


=INDICE(Intervallo dati; Riga) =INDICE(Moneta;G5)

Intervallo dati

Riga

Lintervallo denominato contenente i dati ove vogliamo effettuare la ricerca, nel nostro caso Moneta. La riga dellintervallo dati in corrispondenza della quale si trova il valore desiderato. Nel nostro esempio la Peseta il quinto elemento, cio si trova alla quinta riga dellintervallo denominato Moneta.

Nota: La sintassi della funzione Indice ben pi articolata di quella rappresentata nei paragrafi precedenti, ma essendo questo un corso di VBA non ci dilungheremo oltre su di essa.

Quindi ogni qualvolta che scegliamo una valuta con la Casella combinata, grazie alla funzione Indice, questa viene visualizzata anche nella cella C4.

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

43

Calcolare lEuro

La cella C4 individua la valuta che vogliamo convertire, mentre la cella C6 adibita allinserimento della quantit della valuta scelta. Nel nostro esempio, illustrato nellimmagine a seguire, vogliamo convertire 1.000 Lire: il risultato dovr apparire nella cella C9. Per ottenere tale risultato dobbiamo inserire in C9 una funzione piuttosto complessa.
=EUROCONVERT(C6;INDICE(CodiceIso;G5);eur)

Il secondo argomento della funzione EUROCONVERT, valuta di origine, invece di essere digitato direttamente viene passato dalla funzione INDICE, che a sua volta si avvale dellintervallo denominato CodiceIso.

A questo punto, variando la quantit ( C6) o la moneta con la Casella combinata, automaticamente sar calcolato limporto corrispondente in Euro.

Vincolare la quantit Volendo impostare una quantit ( C6) che non possa eccedere un determinato valore, o pi semplicemente togliere allutente ogni onere di digitazione, possiamo ricorrere ad una Casella di selezione. Dalla barra degli strumenti Moduli cliccare sulloggetto Casella di selezione. Fare clic in una zona vuota del foglio per generare automaticamente una Casella di selezione.

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

44

Fare clic con il tasto destro sulla Casella di selezione per far apparire li menu contestuale, dal quale selezionare Formato controllo. Selezionare la scheda Controllo e digitare: o Valore corrente 10 o Valore minimo 1 o Valore massimo 20000 o Avanzamento 1 o Collegamento cella G8 Cliccare su OK. Quindi nella cella C6, in corrispondenza della quantit, digitare la seguente formula: =1000*G8 ove G8 la cella collegata alla Casella di selezione. Noterete che ad ogni singolo clic sulla Casella di selezione si aggiorner automaticamente la quantit di valuta da convertire e a cascata gli euro corrispondenti. Gestire gli eccessi Il nostro modello valutario ha un problema! Il valore minimo 1000, impostabile dallazione combinata della Casella di selezione e della formula in C6, sicuramente adeguato alle lire, ma troppo elevato per i franchi. Si potrebbe rimediare al problema abbastanza agevolmente con una funzione SE nidificata, ma noi che vogliamo vedere la Casella di controllo in azione seguiremo unaltra via. Dalla barra degli strumenti Moduli cliccare sulloggetto Casella di controllo. Fare clic in corrispondenza della cella E11. Sar automaticamente generata una Casella di controllo. Fare clic con il tasto destro sulla Casella di controllo per far apparire li menu contestuale, dal quale selezionare Formato controllo. Apparir la fine stra di dialogo Formato controllo ove dovremo selezionare la scheda Controllo. Nella casella Collegamento cella digitare G11. Selezionare il nome di default per sovrascriverlo digitando Dividi per 100. Deselezionare loggetto cliccando a vuoto.

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

45

Il nostro intendimento quello di poter dividere per 100 la quantit ( C6) di valuta da convertire quando selezioniamo la Casella di controllo e conseguentemente nella cella G11 comparir VERO. Ad esempio, se la quantit in C6 di 92000 risultasse eccessiva metteremo il segno di spunta alla Casella di controllo ed automaticamente il valore in C6 si trasformerebbe in 920. Per ottenere il risultato di cui sopra, occorre modificare la formula in C6, integrandola cos : =SE(G11=FALSO;1000*G8;10*G8) . Traducibile in: se la Casella di controllo non selezionato e quindi restituisce il valore FALSO in G11, venga eseguita la moltiplicazione normale per 1000, altrimenti moltiplicare solo per 10 (1000/100=10).

Considerazioni Luso dei Pulsanti di opzione ci avrebbe permesso di creare un modello valutario pi elegante e preciso, ma in questa fase del nostro corso avremmo introdotto delle difficolt, forse, eccessive. Poi, per completezza di informazione, vi invito a fare una visitina al menu Strumenti/Conversione euro per prendere visione di uno strumento di conversione niente male, che Excel ci mette a disposizione. Ma allora vi domanderete, perch tutto sto esercizio? Semplice! Per pure finalit didattiche!

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

46

PARTE 2 Primi passi nel VBA


Inizieremo adesso ad addentrarci nel VBA vero e proprio. Prenderemo confidenza con lambiente di programmazione e vedremo il codice scritto con le macro che abbiamo registrato. Scriveremo le prime semplici procedure e piano piano conosceremo le principali strutture di controllo. Insomma vedremo che la programmazione, se accompagnata dalla logica e un po di inventiva, non poi cos difficile, anzi ci troveremo ben presto in grado di raggiungere risultati di tutto rispetto.

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

47

Lezione VIII LEditor di VBA


I novizi della programmazione troveranno non poche difficolt nel primo impatto con lEditor di Visual Basic; tenete conto che anche i vecchi utilizzatori del VBA prima maniera, cio quello risalente alle versioni 5 e 7 di Excel, trovarono ostico raccapezzarsi nel nuovo ambiente di programmazione. Per questa ragione illustreremo gli elementi essenziali dellEditor da questa prima lezione dedicata ai rudimenti della programmazione. Aprire lEditor di VB Nellimmagine sottostante si pu ammirare lEditor di VB

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

48

richiamabile dal menu Strumenti di Excel, posizionandosi sulla voce Macro per poi cliccare Visual Basic Editor., oppure con la combinazione di tasti ALT+F11.

Nota: LEditor illustrato nellimmagine della pagina precedente corrisponde ad una nuova cartella di lavoro appena aperta. Gli elementi di un Editor associato ad una cartella contenente delle macro si presenterebbero un po diversamente.

Le finestre dellEditor di VB LEditor di VB composto da una finestra principale, detta genitrice, che contiene tre sottofinestre definite figlie. Le finestre figlie sono: Finestra Progetto, Finestra delle Propriet e Finestra del Codice. Tutte e tre le sottofinestre possono essere chiuse, spostate e ridimensionate. La finestra Progetto La Finestra Progetto per default posizionata in alto a sinistra e visualizza tutti i fogli di lavoro, i moduli e se presenti i forms della cartella o cartelle di lavoro aperte. I suoi contenuti sono rappresentati da un diagramma ad albero con tutte le cartelle aperte e collassabili con un clic sul segno meno (-). Nellesempio raffigurato a lato possiamo vedere che stiamo trattando del VBAProject(Cartel1), cio di una cartella appena aperta che ha il consueto nome Cartel1.xls. Scendendo nella scala gerarchica troviamo la cartella Microsoft Excel Oggetti contenente i tre fogli di lavoro, pi un elemento particolare denominato ThisWorkbook, del quale parleremo nelle ultime lezioni.

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

49

Nelleventualit la finestra Progetto non fosse presente, la si pu richiamare dal menu Visualizza dellEditor VB, cliccando sulla voce Gestione progetti.

La finestra delle Propriet

La finestra delle Propriet mostra le propriet delloggetto selezionato. Nellimmagine desempio stiamo visualizzando le propriet del Foglio1. Provando a cliccare sul Foglio2 nella finestra del Progetto vedremo la finestra delle Propriet aggiornarsi al nuovo elemento selezionato.

Nelleventualit la finestra delle Propriet non fosse presente, la si pu richiamare dal menu Visualizza dellEditor VB, cliccando sulla voce Finestra Propriet.

La finestra del Codice La terza sottofinestra, quella del Codice, nellimmagine raffigurante lEditor non presente, al suo posto vediamo uno spazio vuoto grigio. Ci dovuto al fatto che in una nuova cartella di lavoro non ancora presente il codice, quindi a meno di richiamarla esplicitamente, la finestra del Codice non visibile. Per richiamare la finestra del Codice, vi sono vari sistemi, tra i quali fare clic sul menu Inserisci/Modulo. Ma se andiamo ad aprire la cartella di lavoro Comuni, ove abbiamo eseguito le prime registrazioni, scopriremo una situazione sensibilmente diversa.

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

50

La finestra del Progetto presenta degli elementi aggiuntivi, tipo la cartella Moduli, allinterno della quale troviamo Modulo1 e Modulo2.

Ancora pi evidente la presenza della finestra del Codice con del codice allinterno.

Nota: LEditor di Visual Basic sicuramente ben pi complesso di quello che pu apparire dalla nostra breve chiacchierata, ma senza appesantimenti teorici che, rischierebbero di scoraggiarci, gli elementi appresi in questa lezione sono sufficienti ad orientarci nel suo interno.

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

51

Lezione IX Il codice delle macro


Finalmente giunto il momento di esplorare il codice prodotto dal nostro registratore di macro. Regole generali Apriamo la cartella di lavoro contenente gli esempi delle prime lezioni e dal menu Strumenti\Macro selezioniamo la voce Visual Basic Editor. La finestra Progetto dovrebbe gi mostrare selezionato il Modulo1 e la finestra Codice il corrispondente listato. Se cos non fosse nella finestra Progetto, eseguire un doppio clic sulla voce Modulo1. Andiamo cos ad esaminare la macro registrata nella prima lezione. Le righe che iniziano con un apice (), colorate di verde sono testo di commento. E possibile aggiungere, modificare, eliminare commenti senza influenzare lesecuzione della macro. Ricordiamoci per che i commenti rivestono una grande ruolo nella documentazione delle nostre procedure. La macro vera e propria inizia con Sub, Procedura in Italiano. Quindi ogni macro deve iniziare con la parola chiave Sub, al quale segue un nome di fantasia, che nel nostro caso Macro1. Infine aprire e chiudere una coppia di parentesi tonde senza spazi allinterno. Riepilogando una macro deve sempre iniziare con la seguente sintassi:
Sub NomeFantasia( )

Sub un elemento fondamentale anche per la chiusura della macro. Ogni macro deve terminare con End Sub.

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

52

Analizzare il codice di Macro1 La macro registrava le azioni di selezionare lintervallo di celle A3:F3, di grassettarlo e infine di deselezionare attivando la cella A2.
Range("A3:F3").Select Selection.Font.Bold = True Range("A2").Select

Seleziono le celle da A3 a F3 La selezione deve essere grassettata? Vero. Seleziono la cella A2 per deselezionare.

Per rendere pi comprensibile la trasposizione del codice, in linguaggio corrente si un po sacrificata la struttura sintattica. In VBA, loggetto precede lazione.
Range("A2") = oggetto Select = azione (verbo)

E come se nel parlare di tutti i giorni invece di dire Bevo il caff, dicessimo Il caff bevo. Qual il vantaggio di una simile bizzarria linguistica? Una volta selezionato un oggetto possiamo compiere su di esso innumerevoli azioni senza dover riselezionare continuamente lo stesso oggetto. Per restare nellesempio del caff come se dicessimo: Il caff bevo, acquisto, sorseggio, rovescio. Il punto (.) funge da separatore fra loggetto e lazione

Nota: Ad essere precisi loggetto, oltre a precedere lazione, pu anche precedere la specificazione di una sua Propriet, ossia, continuando la metafora linguistica, laggettivo. Sempre per mettere i puntini sulle i, lazione in VBA viene chiamata Metodo.

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

53

Analizzare il codice della macro RiferimentiRelativi La seconda macro, registrata durante la prima lezione, introduceva la logica dei riferimenti relativi. Anche questa macro, registrava le azioni di selezionare lintervallo di celle A3:F3, di grassettarlo e infine di deselezionare attivando la cella A2.
Sub Riferimentirelativi() 'Riferimentirelativi Macro ActiveCell.Offset(2, 0).Range("A1:F1").Select Selection.Font.Bold = True ActiveCell.Offset(-1, 0).Range("A1").Select End Sub

Ma in questo caso passava in secondo piano lesatta ubicazione delle celle, bens assumevano importanza gli spostamenti, quindi era anche importante sapere qual era la cella attiva nel momento in cui veniva attivata la registrazione. La cella attiva era A1.

ActiveCell.Offset(2, 0).

("A1:F1").Select

Dalla cella attiva, qualunque essa sia, scende di 2 celle quindi seleziona verso destra 6 celle. E importante notare che A1 e F1 non rappresentano riferimenti assoluti, anche perch in realt s ono state selezionate le celle A3:F3. La selezione deve essere grassettata? S . Dalla cella attiva, qualunque essa sia, sale di 1 cella quindi seleziona la cella per deselezionare. Anche qui importante notare che non A1 la cella selezionata.

Selection.Font.Bold = True ActiveCell.Offset(-1, 0).

Range("A1").Select

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

54

Modificare il contenuto di una macro Passiamo ad esaminare .la macro Navigator, presente nel Modulo2:
Sub Navigator() Sheets("Foglio2").Select End Sub

Con listruzione
Sheets(Foglio2).Select

come se dicessimo Il foglio chiamato Foglio2 seleziona. E intuitivo che volendo cambiare il foglio da attivare, baster riscrivere il nome del foglio posto fra le parentesi tonde e le virgolette: ad esempio reindirizziamo la navigazione di Navigator al Foglio3.
Sheets(Foglio3).Select

Facile vero?! Le nostre procedure di navigazione hanno un difetto per! Ci portano nel foglio desiderato, ma non si preoccupano di controllare se il foglio visibile dallinizio: certamente sgradevole transitare in un foglio e visualizzare la fine di una tabella. Posizioniamoci dopo Select della macro Navigator e diamo un INVIO per creare una riga vuota. Spostiamo il cursore sulla riga vuota test creata e digitiamo le seguenti istruzioni:
Range("A1").Select

Laggiunta della piccola porzione di codice sopra illustrata, far s che la macro dopo essersi spostata sul foglio desiderato, attivi la cella A1, garantendo cos la visualizzazione del foglio dallinizio. Nel paragrafo sottostante possiamo vedere la nuova versione di Navigator:
Sub Navigator() Sheets("Foglio3").Select Range("A1").Select End Sub

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

55

I nomi delle procedure Nellassegnazione di nomi alle macro, occorre seguire alcune regole di denominazione: Devono iniziare con una lettera. Non possono includere punti, operatori matematici o di confronto. Non possono superare 255 caratteri. Devono essere univoci, almeno allinterno della procedura (poich a volte non basta meglio prudentemente allinterno della cartella), o pi correttamente nellarea di validit. Non possono coincidere con il nome di parole chiave del VBA. Non devono essere composti da pi parole.

Identare il codice Si pu notare, nei primi esempi di macro esaminati, che le righe non sono sempre allineate al margine sinistro, ma risultano spostate verso destra in vario modo. Questo stile di scrivere il codice detto indentazione. Non ci sono regole fisse che stabiliscano di quanto bisogna far rientrare una riga, od un gruppo di righe; lidentazione solo un modo per rendere visivamente pi chiara la struttura del programma. Generalmente ci si serve dellidentazione per allineare ad esempio sulla stessa colonna blocchi di istruzioni dello stesso livello o comunque correlati fra loro. Nelluso dellidentazione entra comunque il gusto personale dellautore del programma, giacch introduce elementi di chiarezza visiva, del tutto estranei al sistema di esecuzione del programma. Le maiuscole Tutte le parole chiave del VBA hanno liniziale maiuscola: Sub, End, Range, Select ecc. . Per la digitazione di esse deve avvenire tutta in minuscolo, poich automaticamente le iniziali di trasformeranno in maiuscole, sempre che siano state scritte correttamente. Il digitare le iniziali delle parole chiave in minuscolo di fatto un sistema di controllo.

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

56

Lezione X Operare delle scelte con IF


In questa lezione impareremo a prendere delle decisioni, a scrivere delle routine che verificano determinate condizioni ed eseguono conseguentemente, istruzioni specifiche, in base al risultato della verifica. Le istruzioni in VBA che controllano il flusso delle decisioni sono definite strutture di controllo. Mettendola un po sul mistico, potremmo dire che implementiamo le capacit delle nostre macro a scegliere fra il vero ed il falso: fra il bene ed il male. Il file Comuni Apriamo la cartella di lavoro Comuni e scegliamo lomonimo foglio, contenente lelenco dei comuni della provincia di Torino. In particolar modo, soffermiamoci sulla colonna F, contenente i valori relativi alla popolazione. Il nostro compito consister nel colorare di giallo le celle contenenti un numero di abitanti superiore al valore di 9.999: il tutto naturalmente, con un semplice clic.

Scomporre i problemi Iniziamo per gradi: il primo compito quello di capire come si fa a colorare di giallo una cella tramite il codice VBA. La soluzione molto semplice! Registriamo una macro che formatta di giallo lo sfondo di una cella.

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

57

Prima di iniziare la registrazione ci accerteremo che larea di lavoro non presenti degli impedimenti, che potrebbero compromettere la qualit del codice che sar generato. Notiamo che le barre degli strumenti, disposte su di ununica riga ci occultano dei pulsanti, fra i quali proprio quello del Colore di riempimento. Dal menu Visualizza\Barre degli strumenti scegliere Personalizza. Comparir la finestra di dialogo Personalizza, dalla quale sceglieremo la scheda Opzioni. Mettere il segno di spunta su Mostra barre degli strumenti Standard e Formattazione su due righe. Cliccare su OK per confermare.

Registrare la colorazione di una cella Posizioniamoci su di una cella da colorare. Lanciare il registratore di macro dal menu Strumenti\Macro\Registra nuova macro. Digitare come nome della macro Colorare e cliccare su OK per avviare la registrazione. Dal pulsante Colore riempimento, posto sulla barra degli strumenti Formattazione, scegliere il colore giallo.

Interrompere la registrazione cliccando pulsante Interrompi registrazione.

sul

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

58

Esaminare il codice della macro Colorare Nella precedente lezione abbiamo visto che per visualizzare il codice di una macro, occorre richiamare lEditor di VB: risultato ottenibile anche dalla finestra di dialogo Macro, richiamabile dal menu Strumenti\Macro\Macro. Una volta visualizzata la finestra Macro, selezionare la macro Colorare e cliccare sul pulsante Modifica, per essere immediatamente proiettati nellambiente di programmazione

ove possibile ammirare la sintassi generata per colorare una cella di giallo. Questa volta il codice si presenta meno intuitivo degli esempi precedenti, complicato dalla presenza dellenunciato Whit.
Sub Colorare() With Selection.Interior .ColorIndex = 6 .Pattern = xlSolid End With End Sub

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

59

Lenunciato Whit Lenunciato Whit, traducibile in con, serve a rendere pi veloce lesecuzione della macro, ma non indispensabile. Rivediamo la procedura Colorare senza Whit.
Sub Colorare() Selection.Interior.ColorIndex = 6 Selection.Interior.Pattern = xlSolid End Sub

Le due righe di codice cos trasformate si possono leggere: Selezione interna colora di giallo Selezione interna trama solida Mentre il codice originale cos traducibile: Con selezione interna colora di giallo trama solida Fine con Appare evidente che in presenza di molti attributi il codice racchiuso dallenunciato Whit diventa pi conciso, pi veloce.

Eliminare codice superfluo In molti casi il Registratore di macro registra tutte le possibili impostazioni, anche quando se ne modificano solo una o due. Eliminando le impostazioni non necessarie la macro risulter semplificata e pi veloce. Nella macro Colorare lunica propriet che vogliamo modificare il colore, quindi la tipologia di trama eliminabile. Il risultato della suddetta colorazione una macro estremamente leggera.
Sub Colorare() Selection.Interior.ColorIndex = 6 End Sub 6 significa giallo

Notate il commento che ricorda che al numero 6 corrisponde il giallo.

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

60

Colorare e scendere Dopo essere riusciti a far colorare di giallo una cella, unaltra azione che possiamo far compiere alla nostra macro, senza eccessive difficolt quella di scendere alla cella sottostante. Il pezzo di codice necessario a tale necessit gi disponibile nella macro Navigator. Ricordate? Il seguente codice scende di due celle
ActiveCell.Offset(2, 0).Range("A1").Select

quindi sostituendo il 2 con un 1, scenderemo di una sola cella per volta. Ed ecco il risultato di questa ulteriore modifica alla procedura Colorare, che formatta la cella di giallo e scende di una cella.
Sub Colorare() Selection.Interior.ColorIndex = 6 ActiveCell.Offset(2, 0).Range("A1").Select End Sub 6 significa giallo Scende di una cella

SeAllora E giunto il momento di dare il lume della ragione alla nostra macro! Dovr colorare sol tanto quando il valore della cella supera 9.999 .
Sub Colorare() If ActiveCell > 9999 Then Se il contenuto della cella superiore a 9999 Selection.Interior.ColorIndex = 6 6 significa giallo End If ActiveCell.Offset(1, 0).Range("A1").Select Scende di una cella End Sub

Il codice della struttura di controllo If cos traducibile. Se la cella attiva contiene un valore maggiore di 9999 allora Colorala di giallo Fine se Esaminiamo anche la sintassi di If, che si presenta molto semplice. Alla parola chiave If segue una condizione, a sua volta seguita dalla parola chiave Then. Nella riga successiva troviamo una o pi istruzioni da eseguire se una determinata condizione risulta vera. Scendendo nuovamente, la fine della struttura di controllo data da End If.
If condizione Then Istruzioni End If

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

61

Il controllo If deve essere sempre chiuso da End If, ad eccezione di macro con struttura che si sviluppa su di una sola riga.
If condizione Then istruzioni

Pur dando per acquisita la conoscenza degli operatori di confronto, se ne propone una rapida carrellata.

OPERATORI di CONFRONTO
MAGGIORE MINORE UGUALE > < = DIVERSO MAGGIORE O UGUALE MINORE O UGUALE <> >= <=

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

62

Lezione XI Ripetere le azioni


Posizioniamo la cella attiva in F5 e proviamo la macro Colorare. Sar testato il valore della cella, eventualmente formattato, in ogni caso la cella attiva scender nella cella sottostante. Volendo ripetere pi volte lesecuzione della macro, le operazioni di rovistare fra il menu Strumenti\Macro\Macro, individuare la procedura e cliccare su OK, si dimostreranno veramente noiose.

Pulsanti alternativi Si pu rimediare al problema di cui sopra, associando la macro Colorare ad un pulsante. Per i pulsanti, diciamocelo, sono proprio bruttini. Scegliamo una soluzione alternativa. Dal menu Visualizza\Barre degli strumenti scegliere Disegno. Cliccare su Casella di testo. Modellare la Casella di testo in prossimit della cella G2. Personalizzarla a piacere. Cliccarci sopra con il pulsante destro del mouse e dal menu contestuale che apparir, scegliere la voce Assegna macro. Assegnare la macro di nome Colorare e confermare cliccando su OK. Deselezionare loggetto cliccando sul foglio. Adesso risulter molto pi comodo provare la macro Colorare.

Rinominare un modulo Volendo visualizzare la macro Colorare, cliccare sul pulsante Modifica della finestra di dialogo Macro. Tale macro si trova presumibilmente nel Modulo3, in ogni caso accertarsene osservando la barra del titolo del modulo, ove riportato il nome del Modulo. Per rendere meno generico il nome del modulo, rinominiamolo.

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

63

Nella finestra delle Propriet, di fianco a (Name), selezionare Modulo3 e digitare il testo alternativo ModColorare.

I cicli Indubbiamente Colorare una macro simpatica, ma parliamoci chiaro, non serve a niente. Gi nel nostro elenco di circa 300 records testare tutti i valori sarebbe assai uggioso, figuriamoci se ci trovassimo innanzi un database di cinquemila o seimila records! Dobbiamo trovare il sistema, di far scorrere da Excel tutto lelenco automaticamente e di fermarsi, quando questi finisce. Il VBA, dopo If Then, ci mette a disposizione unaltra tipologia di struttura di controllo: i cicli. Le strutture a ciclo consentono di eseguire ripetutamente un blocco di istruzioni di una macro. Do WhileLoop Listruzione Do WhileLoop verifica una condizione allinizio del ciclo e se risulta vera (True) esegue le istruzioni, ripetendole fino a quando la condizione risulta falsa (False)
Do While condizione istruzioni Loop

Modifichiamo la macro Colorare aggiungendovi la struttura di controllo Do While Loop.

Nota: Il codice di una macro non prevede dei numeri davanti alle righe: la numerazione delle linee presente nel listato successivo e in altri seguenti, stata inclusa solo per facilitare il riconoscimento e il commento della sintassi delle procedure desempio.

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

64 1: Sub Colorare() 2: Do While ActiveCell <> "" 'esegue se vero che diverso da vuoto 3: If ActiveCell > 9999 Then 4: Selection.Interior.ColorIndex = 6 5: End If 6: ActiveCell.Offset(1, 0).Range("A1").Select 7: Loop 8: End Sub

La procedura alla riga 2 inizia testando la cella attiva ed come se recitasse: esegui fino a quando vero che la cella attiva contiene un qualche valore Se abbiamo avviato la macro con la cella attiva in F5, la cella chiaramente (vero) diversa da vuota e quindi passa ad eseguire il blocco di istruzioni successive. Nota: Il simbolo virgolette/virgolette () senza spazi vuoti significa vuoto; quindi <> significa diverso da vuoto. Dalla riga 3 alla riga 5 esegue le istruzioni di controllo del numero degli abitanti della citt e se superiori a 9999 colora la cella di giallo. Le istruzioni della riga 6 scendono nella cella F6. Arrivati alla riga 7 troviamo la parola chiave Loop e ripetiamo il ciclo partendo dalla verifica del contenuto della cella attiva, che a questo punto abbiamo visto essere F6. Il ciclo sar ripetuto sino a quando arrivati a F320 Do While non trover pi vera la condizione, poich tale cella vuota.

Do Until Loop
Sub Colorare() Do Until ActiveCell = "" 'esegue se non vero che la cella vuota

If ActiveCell > 9999 Then Selection.Interior.ColorIndex = 6 End If ActiveCell.Offset(1, 0).Range("A1").Select Loop End Sub

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

65

Do Until Loop verifica una condizione allinizio del ciclo, ed esegue il blocco di istruzioni successive fino a quando la condizione risulta falsa, per poi fermarsi quando la condizione diventa vera. Entrambi i cicli funzionano perfettamente: forse Do While pi diffuso. Almeno una volta Do While e Do Until testano sin dallinizio del ciclo il soddisfacimento della condizione e se tale non risultasse, non eseguirebbero neanche una volta la serie di istruzioni comprese nel loro corpo. Attivare una cella vuota e lanciare la macro Colorare: la procedura non scender neanche di una cella! Si dovesse presentare la necessit di eseguire linte ro ciclo di istruzioni, almeno una volta, prima di verificare il soddisfacimento della condizione, occorrer eseguire i seguenti ritocchi al codice:
Sub Colorare() Do If ActiveCell > 9999 Then Selection.Interior.ColorIndex = 6 End If ActiveCell.Offset(1, 0).Range("A1").Select Loop While ActiveCell <> "" 'esegue se vero che diverso da vuoto End Sub

Sub Colorare() Do If ActiveCell > 9999 Then Selection.Interior.ColorIndex = 6 End If ActiveCell.Offset(1, 0).Range("A1").Select Loop Until ActiveCell = "" ' esegue se non vero che la cella vuota End Sub

Nota: Le strutture cicliche a volte vanno in errore ed entrano in un loop infinito. Per uscire da una simile situazione di stallo, premere la combinazione di tasti CTRL+INTERR .

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

66

Lezione XII - Le variabili


Questa lezione dedicata a uno degli elementi fondamentali nello studio di qualsiasi linguaggio di programmazione: le variabili. Definizione di variabile Le variabili sono aree predefinite della memoria del computer, in cui vengono archiviati i dati mentre le macro sono in esecuzione. Le variabili risultano utili per tenere traccia di conteggi che cambiano continuamente, per conservare linput dellutente o di altra origine e per larchiviazione di valori destinati ad essere modificati da macro eseguite successivamente. Nota: in un certo senso possiamo paragonare le variabili alle celle di Excel. Le celle sono identificabili da un riferimento, tipo A1, o ancora meglio da un nome (cella denominata), Pippo ad esempio: nello stesso modo noi identifichiamo le variabili attribuendogli un nome. Il contenuto della cella\variabile pu variare, ma non il suo nome. Quindi ogni volta che si vuole fare riferimento al valore contenuto in una determinata cella\variabile baster usare il suo nome.

Non dichiarare le variabili In VBA, quindi in VB, a differenza di linguaggi di programmazione nobili come il C ed il Pascal, si pu decidere di non dichiarare le variabili: in realt le controindicazioni ad una simile ipotesi sono moltissime. In questo corso non prenderemo in considerazione tale opportunit. Anzi adesso ci preoccuperemo di eliminare la possibilit, che una evenienza cos scellerata, come quella di non dichiarare le variabili, possa accadere anche solo accidentalmente. Dal menu Strumenti dellEditor di VBA scegliere Opzioni, portarsi sulla scheda Editor e porre il flag (segno di spunta) sulla scelta Dichiarazione di variabili obbligatoria. Dichiarare le variabili La dichiarazione delle variabili, detta anche dichiarazione esplicita, si ottiene con la parola chiave Dim (Dimensionare), collocando la dichiarazione allinizio della procedura o del modulo.
Sub NomeMacro() Dim NomeVariabile

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

67

Denominazione di variabili Nellassegnazione di nomi alle variabili, occorre seguire alcune regole di denominazione. I nomi di variabili: Devono iniziare con una lettera. Non possono includere punti, operatori matematici o di confronto. Non possono superare 255 caratteri. Devono essere univoci, almeno allinterno della procedura, o pi correttamente nellarea di validit. Non possono coincidere con il nome di parole chiave del VBA. Non devono essere composti da pi parole. Tipo di dati delle variabili Quando si dichiara una variabile possibile assegnarle anche il tipo di dati che dovr contenere. Se non si specifica nessun tipo di dati, come nellesempio sopra esposto (Dim NomeVariabile), viene automaticamente assegnato il tipo Variant. Il tipo Variant una sorta di minestrone in grado di gestire qualsiasi tipo di dati. Ma se si desidera creare macro rapide, e si sa che in una determinata variabile saranno sempre archiviate informazioni dello stesso tipo di dati, consigliabile specificare il giusto tipo di appartenenza. Nome del Tipo TIPO Numerico Integer Numerico Long Single
Numerico

Dimensioni
2 byte 4 byte 4 byte

Intervallo
da 32.768 a 32.767 da -2.147.483.648 a 2.147.483.6477 da -3,402823E38 a -1,401298E-45 per valori negativi; da 1,401298E-45 a 3,402823E38 per valori positivi. da -1.79769313486231E308 a 4,94065645841247E-324 per valori negativi; da 4,94065645841247E-324 a 1,79769313486232E308 per valori positivi. da -922.337.203.685.477,5808 a 922.337.203.685.477,5807 True o False dal'1 gen. 100 al 31 dic. 9999 Serve ad accedere ad oggetti riconosciuti dal VBA. Pu contenere qualsiasi tipo di dato.

Double

Numerico

8 byte

Currency String Boolean Date Object Variant

Numerico Testo Logico Data Oggetto

8 byte 1 byte per carattere 2 byte 4 byte 4 byte

Universale 16 b. + 1 b. x carat.

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

68

La notazione scientifica La tabella riepilogante i tipi di dati, mostra alcuni numeri un po particolari, la loro sequenza sembrerebbe interrotta dalla vocale E. Tale particolarit conosciuta come notazione scientifica. La notazione scientifica viene utilizzata in genere per rappresentare numeri molto grandi o molto piccoli in un formato compatto. 1.12E-2 -0.012 2.4E10 24 000 000 000 5E9 5 000 000 000 33E-10 0.00000000033 4.3E1 43

Dichiarazione delle variabili e del tipo


Dim Pippo As String

Dimensioniamo la variabile di nome Pippo come tipo stringa: detta in altre parole, la variabile Pippo potr contenere del testo.
Dim Pluto As Integer

In questo secondo caso abbiamo dichiarato la variabile Pluto di tipo numerico Intero.
Dim Paperino, Archimede, Gastone As Variant

In presenza di pi variabili dello stesso tipo, possiamo dichiararle anche sulla stessa linea. Vediamo un piccolo esempio pratico sulluso di una variabile.
Sub Prova() Dim Pippo As Integer dichiaro una variabile di tipo numerico intero Pippo = 9999 assegno alla variabile il valore 9999 If ActiveCell > Pippo Then non uso pi il valore, bens la variabile Selection.Interior.ColorIndex = 6 End If ActiveCell.Offset(1, 0).Range("A1").Select End Sub

Probabilmente avrete notato, dopo aver scritto la parola chiave As, la comparsa di un menu a tendina, ospitante un lungo elenco di parole chiave. Se a quel punto avete digitato la prima vocale, nel nostro esempio la i di

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

69

integer, lelenco si sar posizionato automaticamente in corrispondenza dei termini inizianti con la i. Quindi, utilizzando il pulsante direzionale che punta verso il basso, raggiungete integer e premete sul tasto SHIFT per convalidare la scelta.

Le costanti Le procedure spesso includono valori che non variano e che ricorrono pi volte: in questo caso si utilizzano le costanti. Una costante unarea predefinita della memoria, alla quale viene attribuito un nome e che sostituisce un numero o una stringa non soggetti a modifiche. Le costanti sembrano simili alle variabili, in realt non possibile modificarle o assegnarvi nuovi valori. Portata delle variabili Portata lambito entro cui una variabile accessibile. Larea di azione di una variabile pu essere a livello di procedura o a livello di modulo. Una variabile dichiarata allinterno della macro una variabile a livello di procedura e la sua portata limitata alla macro che la contiene. Per trasformarsi a livello di modulo, quindi utilizzabile da qualsiasi macro di quel modulo, una variabile deve essere dichiarata allinizio del modulo. Dichiarare le costanti
Const Pippo = 9999 Const Paperino = Il mattino ha loro in bocca

Notate che il testo che assegniamo alla costante delimitato dalle virgolette ().
Const Pluto = #03/09/1957#

Le date devono essere delimitate dai cancelletti (#....#).

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

70

Lezione XIII Comunicazioni allutente


Poter offrire allutente la possibilit di dialogare con una nostra procedura sicuramente affascinante e molto utile. In questa lezione studieremo MsgBox, la prima delle due finestre di dialogo incorporate del VBA che incontreremo nel nostro corso. Una semplice finestra di messaggio Richiamare lEditor di programmazione dal menu Strumenti\Macro e nella finestra Progetto eseguire un doppio clic per attivare il Modulo3, che dovrebbe contenere le macro Colorare e Prova. Posizionarsi sulla prima riga vuota e dare un paio di invii per creare spazio rispetto la procedura Prova: quindi digitiare Sub Comunica() e premere il tasto INVIO. Oltre alla creazione di una riga vuota, saranno inserite le istruzioni di fine procedura End Sub.
Sub Comunica() End Sub

Posizionarsi sulla riga vuota presente fra lapertura e la chiusura della macro, premere il tasto TAB e digitare le seguenti istruzioni:
MsgBox "Il mattino ha l'oro in bocca"

Eseguire Comunica, scegliendola dallelenco delle macro presenti nella finestra di dialogo Macro: apparir limmagine riprodotta a lato. Per poter eseguire qualsiasi altra operazione in Excel o nellEditor di VBA obbligatorio cliccare sul pulsante OK. MsgBox visualizza il testo precedentemente inserito fra le virgolette (). Gli argomenti di MsgBox Ma adesso implementiamo il codice di Comunica.
Sub Comunica() Dim Titolo, Messaggio As String Titolo = "Corso on line di VBA per Excel" Messaggio = "Utilizzo di MsgBox" MsgBox Messaggio, , Titolo End Sub

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

71

MsgBox oltre ad un messaggio, permette anche di impostare la sua barra del titolo, sostituendo il generico Microsoft Excel con un titolo a nostro piacere. Mentre veniva digitato il codice, dopo la scrittura della variabile Messaggio, contenente la comunicazione per lutente, hanno fatto la loro comparsa due elementi contestuali: unetichetta descrittiva della sintassi di MsgBox e una casella combinata contenente lelenco degli argomenti inseribili in quel punto.

Ad onor del vero, letichetta (gialla) descrittiva della sintassi non molto esplicativa per un novizio del VBA: vediamo di semplificare un po, inserendo solo gli argomenti principali.
MsgBox(Prompt, [Buttons], [Title])

Fra gli argomenti presentati, solo Prompt obbligatorio. Ci facilmente deducibile dal fatto che lunico non racchiuso fra parentesi quadre []. Prompt largomento rappresentante il messaggio da inoltrare, che nel nostro esempio rappresentato dalla variabile Messaggio. Buttons, sempre nel nostro esempio non stato contemplato, per non essendo contemplata la possibilit di saltare un argomento, abbiamo lasciato a sua testimonianza la doppia virgola , , . Title il titolo che compare sulla barra del titolo della finestra messaggio, che nel nostro caso la variabile Titolo. Nota: Le parentesi tonde a questo stadio di utilizzo della funzione MsgBox non sono ancora necessarie. Aggiungiamo anche largomento Buttons, dandogli la forma di un bel punto esclamativo.

MsgBox Messaggio, vbExclamation, Titolo

Le possibili impostazioni dellargomento Buttons sono:

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

72

Visualizza solo il pulsante OK. Visualizza i pulsanti OK e Annulla. Visualizza i pulsanti Termina, Riprova, e Ignora. Visualizza i pulsanti S , No e Annulla. Visualizza i pulsanti S e No. Visualizza i pulsanti Riprova e Annulla. Visualizza l'icona di messaggio critico. Visualizza l'icona di richiesta di avviso. Visualizza l'icona di messaggio di avviso. Visualizza l'icona di messaggio di informazione. Il primo pulsante il predefinito. Il secondo pulsante il predefinito. Il terzo pulsante il predefinito. Il quarto pulsante il predefinito Finestra di messaggio a scelta obbligatoria nell'applicazione. L'utente deve rispondere alla VbApplicationModal 0 finestra di messaggio prima di poter continuare a lavorare nell'applicazione corrente. Finestra di messaggio a scelta obbligatoria nel sistema. Tutte le applicazioni vengono sospese fino a VbSystemModal 4096 quando l'utente non risponde alla finestra di messaggio. Aggiunge un pulsante della Guida nella finestra di vbMsgBoxHelpButton 16384 messaggio. Specifica che la finestra di messaggio in primo VbMsgBoxSetForeground 65536 piano. vbMsgBoxRight 524288 Il testo allineato a destra. Specifica che il testo viene visualizzato da destra a vbMsgBoxRtlReading 1048576 sinistra per i sistemi ebraico e arabo. Il primo gruppo di valori (0-5) descrive il numero e il tipo dei pulsanti visualizzati nella finestra di messaggio. Il secondo gruppo (16, 32, 48, 64) descrive lo stile dell'icona. Il terzo gruppo (0, 256, 512, 768) determina il pulsante predefinito e il quarto gruppo (0, 4096) determina se la finestra di messaggio a scelta obbligatoria nell'applicazione o nel sistema. Quando si sommano dei numeri per la creazione di un valore finale dell'argomento buttons, utilizzare soltanto un numero per ciascun gruppo.

Costante vbOKOnly VbOKCancel VbAbortRetryIgnore VbYesNoCancel VbYesNo VbRetryCancel VbCritical VbQuestion VbExclamation VbInformation VbDefaultButton1 VbDefaultButton2 VbDefaultButton3 VbDefaultButton4

Valore 0 1 2 3 4 5 16 32 48 64 0 256 512 768

Descrizione

Nota: Il contenuto di questa pagina tratto dalla guida del VBA di Excel.

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

73

Infine osserviamo la possibilit di inserire pi argomenti Buttons nella stessa finestra messaggio.
MsgBox Messaggio , vbYesNo + vbExclamation, Titolo

Ma se la finestra messaggio serve solo a fare comunicazioni allutente, perch in questo ultimo esempio rappresentata la possibilit di scegliere fra S e No ? Fra non molto affronteremo anche questo lato di MsgBox.

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

74

Lezione XIV Interazione con lutente


La finestra di input, la seconda delle due finestre di dialogo incorporate del VBA, ci consente di fare un bel passo avanti nella possibilit di interagire con i fruitori delle nostre procedure. Finestra input La funzione InputBox permette di creare e di visualizzare una semplice finestra di dialogo che consente limmissione di dati da parte dellutente. Richiamare lEditor di VB dal menu Strumenti\Macro\Visual Basic Editor. Attivare il modulo ModColorare dalla finestra Progetto. Portarsi alla fine modulo e creare delle righe vuote con degli invii. Digitare il codice seguente.
1: Sub Immissione() 2: Dim Titolo, Messaggio As String 3: Dim Contenitore As Variant 4: Titolo = "Corso on line di VBA per Excel" 5: Messaggio = "Digita il tuo nome" 6: Contenitore = InputBox(Messaggio, Titolo) 7: MsgBox Contenitore 8: End Sub

Dal menu Strumenti\Macro (Excel o Editor che sia) attivare la finestra di dialogo Macro ed eseguire la macro Immissione. Apparir InputBox ove occorrer digitare un nome a piacere. Confermare cliccando su OK.

Far la sua comparsa una finestra messaggio recante il nome appena digitato in InputBox.

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

75

La sintassi della macro Immissione, sino alla riga 5, pressoch identica a quella utilizzata per MsgBox. Anche qui dichiariamo delle variabili, che saranno poi utilizzate per il titolo e per il messaggio della nostra finestra. Abbiamo in pi la dichiarazione di una terza variabile di tipo Variant. Le differenze con le istruzioni di MsgBox, sorgono a partire dalla sesta riga, come risulta evidente dal codice delle due funzioni messe a confronto.
MsgBox Messaggio, , Titolo Contenitore = InputBox(Messaggio, Titolo)

La differenza meno rilevante la mancanza nella riga di InputBox delle due virgole (, ,) che in MsgBox possono essere occupate dallargomento Buttons, non presente in InputBox. La seconda differenza, la pi importante, la presenza di una variabile, Contenitore, ad inizio della riga relativa alla gestione di InputBox. Associamo alla variabile Contenitore loutput di InputBox, cio la variabile Contenitore conterr ci che sar digitato in InputBox. A questo punto il contenuto della settima riga della procedura Immissione , dovrebbe essere chiara: MsgBox ci presenter come messaggio il contenuto della variabile Contenitore, variabile riempita da quello che stato digitato in InputBox.

Nota: La variabile Contenitore stata dichiarata come tipo Variant, non sapendo a priori che tipo di dati potrebbero essere digitati.

Loutput verso una cella Nellesempio precedente abbiamo indirizzato il valore immesso in InputBox a MsgBox, ma volendo, possiamo anche dirigerlo verso la cella di un foglio di lavoro.
1: Sub Immissione() 2: Dim Titolo, Messaggio As String 3: Dim Contenitore As Variant 4: Titolo = "Corso on line di VBA per Excel" 5: Messaggio = "Digita il tuo nome" 6: Contenitore = InputBox(Messaggio, Titolo, Default) 7: Range("a1") = Contenitore 8: End Sub

E bastato modificare le istruzioni della settima riga: in luogo della finestra messaggio abbiamo inserito la cella A1.

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

76

Ancora sugli argomenti A volte linput dellutente abbastanza prevedibile: in tal caso pu risultare daiuto inserire un testo o un numero predefinito, che potr essere confermato o alloccorrenza sostituito. Si dimensioni una terza variabile di tipo string, denominata Default, quindi sinserisca la seguente riga di codice fra la quinta e la sesta riga
Default= Matteo, Luca e Davide

e modificare la sesta riga, che a questo punto sar diventata la settima in:
Contenitore = InputBox (Messaggio, Titolo, Default)

Metodo InputBox Il VBA, ogni tanto, presenta degli strani misteri. Uno di questi la presenza, accanto alla funzione InputBox, di un altro oggetto pressoch identico, definito metodo InputBox. Nota: Il VBA pesca i suoi oggetti da varie librerie: la funzione InputBox appartiene alla libreria di Visual Basic: il metodo InputBox fa parte della libreria di Excel. Il metodo InputBox presenta un vantaggio rispetto alla omonima funzione: in grado di filtrare il tipo di dati immesso.
1: Sub SuperImmissione() 2: Dim Titolo, Messaggio As String 3: Dim Default As Integer 4: Dim Contenitore As Variant 5: Titolo = "Corso on line di VBA per Excel" 6: Messaggio = "Digita il tuo nome" 7: Default = 10 8: Contenitore = Application.InputBox _ 8: (Messaggio, Titolo, Default, Type:=1) 9: Range("a1") = Contenitore 10: End Sub

La sintassi del metodo InputBox, come potete vedere nellesempio di fatto identica alla funzione InputBox.

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

77

Lunica differenza rilevabile alla riga 8. La parola chiave Application precede InputBox ed presente largomento Type al quale associato il valore 1, indicante laccettazione di soli valori numerici.

Nellimmagine visibile il tentativo fallito, di immettere del testo.

Nota: Application rappresenta lapplicazione Microsoft Excel.

Qui di seguito sono riportati i valori dellargomento Type, atti a specificare il tipo di dati restituito. Valore 0 1 2 4 8 16 64 A capo Il codice della macro SuperImmissione, presenta una stranezza: sono presenti due righe 8. Il VBA non permette di spezzare le righe di codice, per a volte le righe diventano eccessivamente lunghe e quindi illeggibili. Si risolve il problema mandando a capo una porzione di codice, dicendo per al VBA che si tratta di una riga di istruzioni unica. Lultima parola della riga 8.1, nel nostro esempio, InputBox dopo la quale si creato uno spazio vuoto con la pressione della barra spaziatrice. Quindi si digitato un underscore ( _ ) .
8.1: 8.2: Contenitore = Application.InputBox _ (Messaggio, Titolo, Default, Type:=1)

Significato Una formula Un numero Del testo (una stringa) Un valore logico (True o False) Un riferimento di cella, ad esempio un oggetto Range Un valore di errore, ad esempio #N/D Una matrice di valori

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

78

Lezione XV Procedura decisionale


In questa lezione daremo sostanza alla realizzazione di una procedura di interazione fra uomo e macchina. Decideremo di volta in volta qual il numero massimo di abitanti oltre il quale vogliamo formattare le celle. Variabili a portata di modulo Richiamando alla memoria la lezione sulle variabili, sicuramente non avrete dimenticato il paragrafo dedicato alla portata delle variabili. Nello svolgimento di questa lezione dovremo ricorrere, per la prima volta, ad una variabile a livello di modulo. Attiviamo il modulo ModColorare e posizioniamoci al suo inizio, ove digiteremo la seguente dichiarazione di variabile.
Dim Contenitore As Variant 'Variabile a livello di modulo

Quindi creiamo una nuova procedura, atta a raccogliere il numero di abitanti che di volta in volta porremo come limite oltre al quale si dovr colorare la cella.
1: Sub SceltaPopolazione() 2: Dim Titolo, Messaggio As String 3: Dim Default As Integer 4: Titolo = "Corso on line di VBA per Excel" 5: Messaggio = "Popolazione oltre la quale colorare di giallo" 6: Default = 9999 7: Contenitore = Application.InputBox _ 8: (Messaggio, Titolo, Default, Type:=1) 'Tipo 1, cio numerico 9: End Sub

La macro SceltaPopolazione, ricalca perfettamente la procedura vista nella precedente lezione, SuperImmissione. Lunica differenza appunto la dichiarazione della variabile Contenitore, fatta a inizio modulo. La variabile Contenitore conterr il valore digitato nella finestra di input.

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

79

Inserire una procedura dentro una procedura Sempre nel modulo ModColorare cerchiamo la macro Colorare e immediatamente sotto la prima riga, con un invio, creiamo una riga vuota ove digitare SceltaPopolazione. Il risultato non dovrebbe essere dissimile da quello visualizzato nelle righe sottostanti.
1: Sub Colorare() 2: SceltaPopolazione 'Macro in cui digitiamo la popolazione 3: Do While ActiveCell <> "" 'esegue se non vero che la cella vuota 4: If ActiveCell > Contenitore Then 'se superiore a 9999 5: Selection.Interior.ColorIndex = 6 'colora di giallo 6: End If fine condizione 7: ActiveCell.Offset(1, 0).Range("A1").Select 'scende di una cella 8: Loop ripeti 9: End Sub

Nota: Incominciando ad aumentare la complessit della procedura i commenti diventano indispensabili. Probabilmente avrete gi capito che, la prima istruzione eseguita dalla macro Colorare sar quella di eseguire le istruzioni della procedura SceltaPopolazione, posta nella seconda riga. La procedura SceltaPopolazione, tramite InputBox, richieder il valore desiderato, che una volta ricevuto memorizzer nella variabile Contenitore. Terminata SceltaPopolazione, la macro Colorare continuer a processare le sue istruzioni dalla riga 3 e passata alla riga 4 verificher se il contenuto della cella attiva superiore al valore contenuto nella variabile Contenitore. Tutto ci spiega perch abbiamo dimensionato la variabile a livello di modulo: essa viene riempita nella procedura SceltaPopolazione, ma il suo contenuto viene sfruttato allinterno della macro Colorare. Programmazione strutturata In questa lezione, inserendo una procedura allinterno di unaltra procedura, abbiamo adottato la tecnica della programmazione strutturata. Pi le procedure diventano lunghe e complesse, pi difficile diventa seguirne il comportamento, correggerle, aggiornarle, sino a diventare pressoch ingestibili. Inoltre, a volte, una piccola sottoprocedura pu essere riutilizzata pi volte allinterno della stessa procedura ospitante, o addirittura da una unaltra procedura ancora.

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

80

Decolorare Per rendere la nostra applicazione un po pi comoda, registriamo una macro per togliere il colore dalle celle precedentemente formattate. Dalla barra degli strumenti Disegno scegliere Casella di testo e modellarne le forme accanto al pulsante artigianale Verifica, denominandolo Decolora. Posizioniamoci in F5, avviamo il registratore di macro, attribuendogli il nome Decolora e clicchiamo su OK per avviare la registrazione. Premere la combinazione di tasti CTRL+SHIFT+ (tasto direzionale gi) per selezionare tutte le celle contigue della colonna contenenti dati. Sulla barra degli strumenti di Formattazione agire sul pulsante Colore riempimento per scegliere Nessun riempimento. Attivare la cella F5 per deselezionare. Interrompere la registrazione.

Sub Decolora() 'Toglie il colore 'Risultato della pressione di CTRL+SHIFT+Tasto direzionale Gi Range(Selection, Selection.End(xlDown)).Select Selection.Interior.ColorIndex = xlNone 'No colore Range("F5").Select End Sub

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

81

PARTE 3 Addentrarsi nel VBA


Il viaggio nella conoscenza del VBA, ci porter a perfezionare, approfondire e assemblare gli strumenti sino ad ora appresi. Continueremo il discorso su loutput dellutente, impareremo a convivere con gli errori, a creare finestre di dialogo, a costruire utilit atte a facilitare il nostro lavoro.

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

82

Lezione XVI Trova


In questa lezione implementeremo la nostra procedura di colorazione, con una funzione di ricerca dei comuni. Pulire lEditor di VB I moduli collegati al file Comuni incominciano ad essere un po disordinati: vediamo di fare un po di ordine. Avviare lEditor di VB. Dalla finestra Progetto attivare il modulo Modulo3 facendo un doppio clic. Con il mouse selezionare le due macro Navigator e Navigator2 e premere la combinazione di tasti CTRL+X per tagliarle. Transitare al Modulo2 e posizionarsi al fondo, creando eventualmente delle righe vuote con degli invii. Premere la combinazione di tasti CTRL+V per incollare le macro precedentemente tagliate. Nella finestra Propriet posizionarsi in corrispondenza di (Name) per rinominare Modulo2 in Varie.

Nella finestra Progetto cliccare con il tasto destro su Modulo3 e dal menu contestuale scegliere la voce Rimuovi Modulo3

Nota: I nomi, dei moduli menzionati potrebbero non corrispondere esattamente a quelli creati sul vostro PC. Tale eventualit non dovrebbe comunque rappresentare un problema.

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

83

Far la sua comparsa una finestra mes saggio, con la quale sar richiesto se si desidera esportare il modulo prima di eliminarlo. Per esportare sintende creare un file con estensione bas, contenente il codice del modulo in fase di eliminazione. Nel nostro caso possiamo tranquillamente ignorare la richiesta di esportazione e quindi cliccare su NO.

La logica conseguenza, della presenza di una opzione di esportazione, che sia disponibile anche la possibilit di importare del codice da un file esterno al nostro progetto. Gi losservazione d el menu contestuale scaturito dalloperazione di eliminazione del modulo, rileva lopzione Importa file, richiamabile anche dal menu File dellEditor. Una macro per trovare Portandosi nel foglio Comuni, si faccia partire il registratore, attribuendo alla macro il nome di TrovaComune. Nella finestra di dialogo Trova e sostituisci, richiamabile dal menu Modifica di Excel, digitare nella casella Trova: il Comune di Almese e cliccare su Trova successivo per avviare la ricerca.

Fermare la registrazione. Attivare lEditor di VB.

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

84

La conseguenza dellutilizzo del registratore, sar la creazione del Modulo1. Nella finestra Progetto dellEditor di VB effettuiamo un doppio clic su Modulo1 per visualizzare il codice test registrato.
Sub TrovaComune() Cells.Find(What:="almese", After:=ActiveCell, LookIn:=xlFormulas, _ LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _ MatchCase:=False, SearchFormat:=False).Activate End Sub

Nota: Il codice sopra riportato, probabilmente differisce da quello generato dal vostro registratore nei punti ove va a capo. La macro generata per trovare il Comune sicuramente troppo logorroica. D'altronde se osservate la finestra di dialogo Trova e sostituisci, raffigurata nella pagina precedente, si nota che riproduce tutte le opzioni in essa presenti. Troppe! Certamente mettere mano al codice di una macro non necessariamente semplice, ma possibile. Si possono eliminare dei pezzi di codice e provare a vedere cosa succede. Metodo un po empirico, ma a volte funziona. La guida in linea Per rendere loperare a tentativi un po pi consapevole, facciamoci aiutare dalla guida in linea. Si evidenzi il metodo Find e si schiacci il tasto F1 : partir la guida contestualmente alla parola selezionata. Probabilmente non sar ben comprensibile quello che la guida vi illustrer, ma con un po di attenzione potrete estrapolare dal tutto il segmento di codice qui di seguito riportato...
.Find(2, lookin:=xlValues)

dal quale si capisce che Find, tutto sommato, funziona anche con pochi argomenti. La guida, inoltre, offre la possibilit di approfondire lo studio della sintassi del metodo Find, cliccando su Metodo Find applicato alloggetto Range.

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

85

Vediamo adesso come adattare il frammento di codice prelevato dalla guida alle nostre esigenze Cells.Find, come il registratore aveva generato dovrebbe essere adatto al nostro caso. con 2 viene cercato un numero e corrisponde al What:="almese" prodotto dal registratore. Da ci si deduce che what pu essere omesso e che volendo cercare del testo lo dovremo inserire fra virgolette, ottenendo come risultato almese. questa istruzione specifica il tipo dinformazioni da cercare, che qui vediamo essere valori (xlValues), mentre nellesempio della macro formule (xlFormulas). Se per andiamo a leggere nel dettaglio la guida in linea, essa ci dice lookin un argomento facoltativo, quindi, salvo esigenze specifiche, eliminabile. Nellesempio tratto dalla guida non presente, ma Activate presente nel codice della macro che abbiamo registrato. Indubbiamente serve, poich una volta localizzato il nome cercato, si vuole anche attivare la cella che lo ospita.

Find

lookin:=xlValues

Sub TrovaComune() Cells.Find("almese").Activate End Sub

Niente da dire! Il risultato della rielaborazione della macro iniziale decisamente pi leggero, con il vantaggio di guadagnarci in velocit di esecuzione delle istruzioni e di leggibilit. Il problema che la macro TrovaComune, per quanto stringata estremamente rigida: cerca solo il Comune di Almese e per variare la ricerca occorre agire direttamente sul codice, possibilit ovviamente improponibile per un utente finale. La prossima lezione sar dedicata a come rendere pi flessibile la ricerca dei dati. Nota: Il metodo Activate applicato alloggetto Range (cella), come il metodo Select, attiva una cella. La differenza fra i due metodi che Select pu agire o su di una cella singola o si un intervallo di celle, mentre Activate ha influenza su di una sola cella.

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

86

Lezione XVII InputBox e Trova


Partendo dal codice creato nella precedente lezione, cercheremo di creare una vera e propria procedura di ricerca dati. Una variabile contro la rigidit Abbiamo visto nella precedente lezione, che la rigidit della nostra procedura deriva dal fatto di aver inserito nei suoi argomenti direttamente il valore da ricercare.
Cells.Find("almese").Activate

Se noi sostituissimo la stringa, che in questo caso indica Almese, con una variabile, avremmo risolto il problema di poter variare a piacimento loggetto della ricerca. Quindi dobbiamo trovare il modo di far assumere alla variabile il valore di volta in volta scelto. Grazie ad InputBox il problema gi praticamente risolto! Useremo la finestra di input per chiedere allutente quale Comune vuole ricercare. Adattare una macro preesistente NellEditor di VB attivare il Modulo1. Selezionare e copiare, tramite il menu di scelta rapida che compare alla pressione del tasto destro, negli Appunti la macro TrovaComune per andarla ad incollare alla fine del modulo ModColorare. Nella finestra Progetto, cliccare con il tasto destro su Modulo1 ed eliminarlo scegliendo dal menu contestuale la voce Rimuovi Modolo1. Visualizzare il contenuto del modulo ModColorare, selezionare la macro SceltaPopolazione e copiarla a sua volta negli Appunti. Incollare SceltaPopolazione al di sotto della macro TrovaComune e rinominarla in SceltaComune. Portarsi allinizio del modulo nellarea Dichiarazioni ed aggiungere una seconda variabile a livello di modulo denominata, alla faccia della fantasia, Contenitore2.
Dim Contenitore, Contenitore2 As Variant

Tornare alla fine del modulo e modificare la macro SceltaComune come di seguito riportato.

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

87 Sub SceltaComune() Dim Titolo, Messaggio,Default As String Titolo = "Corso on line di VBA per Excel" Messaggio = "Digita il Comune da trovare" Default = "Torino" Contenitore2 = Application.InputBox _ (Messaggio, Titolo, Default, Type:=2) End Sub

'Tipo 2, cio stringa

Come si pu vedere le variazioni apportate sono veramente minimali. Si ovviamente variato il messaggio da comunicare, abbiamo precisato che la variabile ove appoggiare loutput Contenitore2 e che, ovviamente, i dati sono di tipo stringa. SceltaComune raccoglie, nella variabile Contenitore2, il Comune da ricercare e deve passarlo alla procedura TrovaComune. Quindi SceltaComune rappresenter la prima istruzione di TrovaComune, che a sua volta andr a cercare il contenuto della variabile Contenitore2. Largomento What del metodo Find diverr la variabile Contenitore2.
Sub TrovaComune() SceltaComune Cells.Find(Contenitore2).Activate End Sub

Una immagine come pulsante Abbiamo gi usato la Casella di testo come pulsante alternativo, ma nulla ci vieta di fare ricorso ad altri oggetti grafici, tipo una clipart.

Dal menu Inserisci\Immagine scegliere clipart.

Modellare limmagine sul foglio e cliccandoci sopra con il tasto destro, dal menu contestuale scegliere la voce Assegna macro, per attribuirgli la macro TrovaComune.

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

88

Lezione XVIII Gestione degli errori


Alcuni manuali di programmazione introducono la gestione degli errori come primo argomento da affrontare. Ci testimonia la grande importanza rivestita da tale argomento. Nel nostro corso abbiamo deciso di non assumere una posizione cos estrema, anche perch una trattazione approfondita sulla gestione degli errori, rischierebbe di diventare pi impegnativa dello stesso corso nel suo insieme. Iniziamo con una presentazione teorica delle tre diverse famiglie di errori

Errori di linguaggio o di sintassi Derivano da errori di digitazione, tipo lomissione di segni di punteggiatura, la mancanza di parentesi, o per dimenticanza di una delle parti dei blocchi di istruzione, quali If senza End If e cos via. Questi errori possono essere individuati abbastanza facilmente. Errori di runtime Si verificano e vengono individuati quando unistruzione tenta di eseguire unoperazione che non possibile completare in fase di esecuzione. Un esempio la divisione per zero. Vediamo un esempio:
Densit = Popolaz \ Superfic

Ove la variabile Superfic assume il valore zero, loperazione diventa impossibile anche se la sintassi dellistruzione corretta. Si dice errore di runtime perch viene individuato solo se il codice in esecuzione. Questo genere di errori non sempre facilmente individuabile. Errori logici In questo ultimo caso, pur in presenza di codice sintatticamente corretto, che esegue operazioni valide, abbiamo risultati non desiderati. Visual Basic non individua gli errori logici, pertanto occorre effettuare un controllo funzionale del codice. Chiaramente questi tipi di errori risultano essere decisamente infidi.

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

89

Il primo errore Iniziamo subito in salita, affrontando un errore logico, in cui siamo caduti nellultima lezione con la procedura di ricerca. Se avete provato a cercare un Comune, la macro TrovaComune ha sicuramente dato dei buoni risultati, a meno che la scelta sia caduta su Torino. In tal caso, abbastanza inspiegabilmente, la cella si posiziona sempre in B2. Guardando con pi attenzione il contenuto della cella, Comuni Provincia di Torino, scopriamo larcano: La nostra procedura per default non Confronta intero contenuto della cella, quindi si ferma in B2 contenente una frase con la parola Torino. Capito linghippo, per trovare il giusto argomento, che imponga a Find, di cercare una esatta corrispondenza ai caratteri specificati in InputBox, andiamo a consultare la guida in linea, che purtroppo non si rivela molto chiarificatrice. Questo uno di quei casi, ove simpara ad apprezzare in pieno il Registratore di macro. Registriamo le azioni di cercare un valore, qualunque esso sia, con Trova del menu Modifica, senza attivare lopzione Confronta intero contenuto della cella, quindi ripetiamo la registrazione, questa volta spuntando Confronta intero contenuto della cella. Confrontiamo il risultato delle due registrazioni per individuare ove si differenziano ed ecco le due istruzioni di nostro interesse.
LookAt := xlPart LookAt := xlWhole

Anche con un inglese deboluccio si comprende che Part parte e Whole intero, quindi listruzione che ci necessita LookAt := xlWhole. Pertanto la macro TrovaComune assumer questa nuova forma.
Sub TrovaComune() SceltaComune Cells.Find(Contenitore2, LookAt:=xlWhole).Activate End Sub

Ancora logica Rimanendo sempre in tema di errori logici, anche la procedura Colorare presenta un inconveniente piuttosto fastidioso. Se vogliamo che colori le celle desiderate, essa ci obbliga a posizionarsi sulla giusta cella di partenza prima di avviare la macro. Fortunatamente la soluzione estremamente semplice: nel modulo ModColorare posizionarsi in corrispondenza della macro Colorare, creare una riga vuota fra le righe con le istruzioni SceltaPopolazione e Do While

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

90

e digitarvi Range(F5).Select. In tal modo, indipendentemente dalla cella di partenza, la macro Colorare si posizioner sempre nel punto giusto ove iniziare a testare i valori delle celle. Un ultimo ritocco, sempre a Colorare, consiste nel non disorientare lutente che utilizzer il nostro prodotto. Se d opo aver formattato le giuste celle, il foglio rimane visualizzato intorno alla trecentesima riga, il che non un bello spettacolo, oltre ad essere una potenziale fonte di confusione per utenti non esperti, occorre riposizionarlo allinizio. Dopo listruzione Loop e prima, ovviamente, di End Sub, inserire Range(A1).Select. Un errore da runtime Molto spesso gli errori di runtime sono il frutto di pasticci effettuati con la tastiera. Prendiamo sempre la macro Colorare ad esempio e simuliamo linavvertita cancellazione dellistruzione Loop, quindi proviamo ad eseguire suddetta procedura. Vedremo comparire lavviso di errore a lato raffigurato, che molto chiaramente spiega lorigine del guasto. Dopo aver fatto clic sul pulsante OK sar visualizzata la macro Colorare, evidenziata in giallo, ad indicare lo stato di errore della procedura. E importante ripristinare la macro andando a cliccare sul pulsante Ripristina della barra degli strumenti Standard dellEditor di VB. Naturalmente occorrer anche ins erire nuovamente listruzione Loop. Un caso ambiguo Insistiamo con Colorare e questa volta la nostra sbadataggine ci fa eliminare If finale, lasciando vedovo End. Provando ad eseguire la macro sar nuovamente comunicato un errore: il problema che il VBA, prendendo farfalle, ci dir Loop senza Do. Cos un piccolo refuso da tastiera rischia di diventare un tormentone, contro il quale lunica cura leggersi con cura il listato.

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

91

Un errore ortografico Per ultima affrontiamo la prima tipologia di errori: gli errori di linguaggio o di sintassi. Un po sgrammaticati digitiamo While senza H e facciamo clic sulla riga successiva. Immediatamente saremo ammoniti del nostro erroraccio.

Un errore spaziale Induciamo la macro Colorare a commettere un errore grossolano, modificando il secondo valore di Offset da 0 a -10, cio da nessun movimento in orizzontale a dieci celle a sinistra.
ActiveCell.Offset(1, -10).Range("A1").Select

Ecco una nuova finestra di segnalazione errori, ove dovremo cliccare sul pulsante Debug.

Non finiscono mai Il problema che non cos semplice: la casistica degli errori ben pi ampia di quella illustrata in queste poche pagine. Molte volte le varie categorie di errori sembrano mescolarsi fra di loro e pi i programmi diventano grandi, pi diventa complicato venirne a capo. Fortunatamente il VBA possiede degli strumenti in grado di darci una mano in questi frangenti. La prossima lezione sar appunto dedicata ad approfondire le tematiche sulla gestione degli errori e il controllo sul flusso delle procedure.

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

92

Lezione XIX Debug


In VBA sono disponibili strumenti di debug che consentono di analizzare il funzionamento delle macro e che risultano particolarmente utili per individuare le cause degli errori. Questi strumenti possono inoltre essere utilizzati per provare, capire e modificare le procedure create da altri sviluppatori. Punti di interruzione Per riuscire a rintracciare la causa di errori, molte volte si dovr scorrere le istruzioni di una procedura passo per passo. Lesecuzione a passo singolo di tutte le istruzioni di una procedura pu diventare decisamente faticosa, ma solo in alcuni casi veramente necessario scorrere tutte le righe del programma. Fortunatamente, il VBA consente di eseguire la maggior parte del codice a velocit normale e passare in modalit Interruzione, cio a processare una riga per volta, solo quando vengono eseguite particolari istruzioni allinterno del codice. Un punto di interruzione una riga allinterno del codice evidenziata da una striscia di colore marrone, con al suo fianco un pallino dello stesso colore. Quando incontra un punto dinterruzione, il VBA passa dalla normale esecuzione del codice alla modalit Interruzione. Usando i punti di interruzione possibile seguire la maggior parte di una procedura a velocit piena e passare in modalit I nterruzione solo quando il VBA raggiunge listruzione che occorre esaminare con attenzione. Effettuare il debug Per effettuare il debug di una procedura occorre visualizzare la barra degli strumenti Debug, richiamabile dal menu Visualizza\Barre degli strumenti dellEditor VB.

Attiviamo il modulo ModColorare e cerchiamo la macro Colorare, quindi in corrispondenza della terza riga della suddetta procedura fare clic allinterno del margine sinistro per impostare il punto di interruzione.

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

93

Quindi fare clic sul pulsante Esegui Sub, posto sulla barra degli strumenti Debug. Saranno immediatamente eseguite le istruzioni della sotto procedura SceltaPopolazione, per poi fermarsi in corrispondenza della riga con il punto dinterruzione. A questo punto fare clic sul pulsante Esegui Istruzione, posto sulla barra degli strumenti Debug per eseguire un passo alla volta.

Dopo il clic sul pulsante Esegui Istruzione la riga gialla si sposta nella riga in basso. In questa fase stata eseguita listruzione della riga iniziale (quella marrone) e il VBA in attesa di eseguire listruzione della riga colorata di giallo. Eseguendo nuovamente clic sul pulsante Esegui Istruzione, viene controllato il valore contenuto nella variabile Contenitore che, nel caso illustrato nellimmagine sottostante, deducibile essere inferiore al valore della cella, perch invece di passare allistruzione successiva, ove avrebbe colorato la cella, salta immediatamente a End If.

Continuando a cliccare su Esegui Istruzione processeremo riga per riga, sino a quando, terminate le esigenze di indagine del codice, interromperemo il debug cliccando sul pulsante Ripristina. E importante ricordarsi di togliere il punto dinterruzione, risultato ottenibile eseguendo le stesse operazioni richieste per definirlo, cio cliccando sopra il pallino marrone. Nota: Il pulsante Esegui Sub, utilizzato senza lintermediazione del punto dinterruzione esegue il flusso della procedura tutto di un fiato.

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

94

E possibile eseguire il debug anche senza lausilio del punto dinterruzione. In tal caso posizioniamo il cursore in corrispondenza della procedura che si desidera verificare e cliccando sul pulsante Esegui istruzione sar eseguita una istruzione alla volta, partendo dallinizio della macro. Per interrompere il debug, anche in questo caso, ricorrere al pulsante Ripristina, oppure, per far scorrere velocemente tutto il codice, fare clic sul pulsante Esegui Sub. Intercettare gli errori di runtime Per quanti sforzi si facciano in fase di sviluppo di un programma, non sar possibile sterminare tutti gli errori, specie se linput dei dati dipende dagli utenti. Citando lesempio della precedente lezione, pu accadere che lutente, perfido, immetta in InputBox uno 0 come divisore. Il VBA dotato di un sistema di rilevazione degli errori che permette di evitare la visualizzazione dei messaggi di errore. Tale risultato ottenibile dalla seguente sintassi:
On Error GoTo SaltaErrore

Specificando che SaltaErrore un nome di fantasia, definito etichetta (label), possiamo tradurre il codice in: In caso di errore salta alletichetta SaltaErrore.
Sub StudioErrori() Dim Popolaz, Densit, Superfic As Long Popolaz = 2000 Superfic = 0 On Error GoTo SaltaErrore Densit = Popolaz \ Superfic MsgBox "Ogni abitante dispone di " & Densit & " metri quadri" Exit Sub SaltaErrore: MsgBox "Impossibile dividere per zero", vbCritical End Sub

Dallesempio si pu vedere che letichetta SaltaErrore: stata posizionata per entrare in azione in caso di errore, al termine delle normali istruzioni. Si dovuto, inoltre, aggiungere listruzione Exit Sub per terminare in anticipo la macro, in modo che non esegua le istruzioni relative agli errori, se errori non ci sono.

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

95

Lezione XX I Forms
Fino a questo momento abbiamo preso confidenza con le due finestre di dialogo incorporate del VBA: la funzione MsgBox e la funzione/metodo InputBox. Sebbene questi due oggetti possano garantire ad un programma una buona dose di interattivit, il loro utilizzo non permette di raggiungere un elevato grado di flessibilit e di personalizzazione. Fortunatamente il VBA permette di creare delle finestre di dialogo personalizzate, conosciute con il nome di Forms. Il primo form Dal menu Inserisci, dellEditor di VB, scegliere la voce UserForm.

Faranno la loro comparsa due nuovi elementi: un form denominato UserForm1 e la barra degli strumenti Casella degli strumenti.

A seguito dellinserimento del Form, la finestra Progetto visualizza una ulteriore ramificazione con la cartella Form e al suo interno, il Form appena generato UserForm1.

Osservando la finestra delle Propriet , con il Form selezionato, si nota come siano decisamente aumentati gli elementi, le propriet appunto, in essa presenti . Modifichiamo la propriet nome ( Name) in Dialogo, quindi modifichiamo anche la propriet Caption in Form di Studio.

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

96

Potremo osservare che a seguito della modifica della propriet Caption cambiato il nome presente sulla barra del titolo del Form. A questo punto occorre fare un po di chiarezza sulla differenza fra le propriet Name e Caption, che probabilmente, non risulta immediatamente comprensibile. Name il nome delloggetto, tramite il quale identificabile tra altri oggetti. Caption una semplice etichetta descrittiva. Forms e pulsanti Il foglio di lavoro Comuni, incomincia ad essere un po troppo affollato da pulsanti di vario genere. Spostiamo questi controlli sulla finestra di dialogo. Selezionare Pulsante di comando dalla barra degli strumenti Casella degli strumenti e modellarlo nel Form Dialogo. Notate che con il Pulsante di comando selezionato, la finestra delle Propriet si aggiorna automaticamente alloggetto selezionato.

Personalizzare il pulsante tramite la finestra delle Propriet. In un Form, per modificare laspetto di un Pulsante di comando, o di un altro controllo, occorre agire sulle sue propriet. Cambiare la descrizione del pulsante in Verifica agendo sulla propriet Caption. Cambiare il colore della scritta grazie alle tavolozze dei colori della propriet ForeColor. Infine grassettare la scritta agendo sulla propriet Font. Agendo sulla propriet Font stato visualizzato il pulsante Genera (quello con i tre puntini), sul quale occorre fare clic per visualizzare una finestra di dialogo con le relative propriet.

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

97

Evento clic Ora dovremmo associare al pulsante il listato della procedura Colorare, ma ormai, non siamo pi in un foglio di lavoro: quindi se nel menu contestuale, richiamato con il clic del tasto destro sul pulsante, cercheremo la voce Assegna macro, non ne troveremo traccia. Siamo entrati nella logica della programmazione ad eventi. Un evento un azione riconosciuta da un oggetto, per la quale possibile definire una risposta. Esempi di eventi possono essere: il clic del mouse o la pressione su di un tasto. Un evento pu essere originato dallintervento di un utente o da una macro. Nella finestra Progetto fare doppio clic su ModColorare. Selezionare il codice della macro Colorare, escludendo le righe di inizio e fine procedura e copiarlo negli Appunti (Modifica\Copia). Attivare il form Dialogo. Posizionare il puntatore del mouse sopra il pulsante di comando ed eseguire un doppio clic. Apparir un modulo relativo al Form Dialogo, impostato sullevento Click del pulsante.

Posizionarsi nel corpo della procedura CommandButton1_Click( ) e incollare il contenuto degli Appunti, cio il listato della macro Colorare.
Private Sub CommandButton1_Click() SceltaPopolazione 'Macro in cui digitiamo la popolazione Range("F5").Select Do While ActiveCell <> "" 'esegue se non vero che la cella vuota If ActiveCell > Contenitore Then 'se superiore a xxxx Selection.Interior.ColorIndex = 6 'colora di giallo End If ActiveCell.Offset(1, 0).Range("A1").Select 'scende di una cella Loop Range("a1").Select End Sub

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

98

Verifichiamo il funzionamento del nostro operato assicurandoci che il form Dialogo sia attivo e clicchiamo sul pulsante Esegui Sub/User Form.

La finestra di dialogo Dialogo, per quanto un po sgraziata, far la sua comparsa nel foglio di lavoro. Ma amara la sorpresa nel constatare che cliccando sul pulsante Verifica, dopo aver diligentemente digitato il valore richiestoci da InputBox, otteniamo un'unica uniforme pennellata di giallo.

Perch questo errore? Ricordate il discorso delle variabili con la portata estesa a livello di modulo? Bene, dichiarando la variabile Contenitore nellarea di dichiarazione dei moduli labbiamo resa disponibile a livello di tutto il modulo, ma non disponibile fra moduli diversi, come invece necessita in questo caso. Occorre rendere la variabile Contenitore disponibile per tutti i moduli della Cartella, risultato ottenibile sostituendo, nellarea di dichiarazione del modulo ModColorare, la parola chiave Dim con Public.
Public Contenitore, Contenitore2 As Variant

Pubbliche e Private Presentando la parola chiave Public, balzer allocchio per analogia che, la macro CommandButton1 preceduta da Private. Le procedure in VBA per default sono Public, cio accessibili per tutte le altre routine in tutti i moduli. Si utilizza la dichiarazione Private per rendere una procedura accessibile alle sole routine incluse nel modulo di appartenza. Si dichiarano le procedure come Private quando si vogliono evitare indesiderate interferenze fra routine di vari moduli e per risparmiare preziosa memoria.

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

99

Lezione XXI Forms: atto II


Nella precedente lezione abbiamo lasciato il nostro Form un po incompiuto. Per poterlo vedere in azione, dallEditor abbiamo agito sul pulsante Esegui Sub/User Form, prospettiva improponibile per un utente finale. Dare vita ad un Form Attivare il foglio di lavoro Comuni. Eliminare i pulsanti che richiamano le procedure TrovaComune (il microscopio) e Decolora, cliccandoci sopra con il tasto destro e scegliendo Taglia. Fare clic sul pulsante Verifica tenendo premuto il tasto CTRL e modificare il testo descrittivo in Scegli opzioni . Attivare lEditor, visualizzare il modulo ModColorare e posizionarvisi alla fine digitando la seguente procedura:
Sub LanciaDialogo() Dialogo.Show End Sub

Ritornare sul foglio Comuni e cliccando con il tasto destro sullo unico pulsante rimasto, associargli la macro test creata: LanciaDialogo.

La sintassi per eseguire una finestra di dialogo, come si pu vedere, estremamente sintetica: nome oggetto, che nel nostro caso il Form Dialogo, seguito dal metodo Show.

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

100

Chiudere un Form Il Form Dialogo per essere chiuso ci obbliga ad agire sulla X posta sulla barra del titolo. Volendo porre un pulsante espressamente adibito alla chiusura del Form, seguiamo i seguenti passi. NellEditor di VB attivare il Form Dialogo. Generarci sopra un nuovo pulsante e denominiamolo Chiudi. Fare doppio clic sul pulsante test creato. Digitare listruzione END nel corpo della procedura, per ottenere il risultato visualizzato nel sottostante codice di esempio.

Private Sub CommandButton2_Click() End End Sub

Se poi si vuole che la finestra di dialogo venga chiusa immediatamente dopo aver eseguito la procedura Colorare, connessa al pulsante Verifica, aggiungere listruzione End prima dellultima riga.
End End Sub

Verificate il funzionamento dei due pulsanti. Aggiungere un altro pulsante Aggiungiamo un terzo pulsante al Form Dialogo per gestire la decolorazione. Nella finestra Progetto dellEditor VB eseguire un doppio clic sul modulo ModColorare per visualizzarlo. Selezionare il codice della routine Decolora escludendo la prima e lultima riga e copiarlo negli Appunti. Nella finestra Progetto dellEditor VB eseguire un doppio clic sul Form Dialogo per visualizzarlo.

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

101

Nella Casella degli strumenti cliccare sul Pulsante di comando e modellarlo sul Form. Variare la propriet Caption del nuovo pulsante in Decolora. Fare doppio clic sul pulsante etichettato Decolora, per visualizzare un modulo relativo al Form Dialogo, impostato sullevento Click del pulsante. Posizionarsi nel corpo della procedura CommandButton3_Click() e incollare il contenuto degli Appunti, cio il listato della macro Decolora. Aggiungere End come ultima istruzione della procedura, cio prima dellutima riga, per chiudere il Form.

Duplicare i pulsanti I pulsanti di un Form, in linea di massima, devono avere tutti le stesse dimensioni, tipo di carattere e cos via. Loperazione di generare il pulsante etichettato Decolora stata piuttosto lenta e imprecisa, costringendoci a reimpostare tutte le propriet sul modello del precedente pulsante etichettato Verifica. Per evitare una simile trafila, selezionare il pulsante da usare come modello ciccandoci sopra, quindi premere la combinazione di tasti CTRL+C per copiarlo negli Appunti, infine cliccare in un punto vuoto qualsiasi del Form e premere la combinazione di tasti CTRL+V per incollare un clone del primo pulsante. A questo nuovo pulsante si dovr cambiare la propriet Caption e a seguito del doppio clic associare il codice di pertinenza. E abbastanza intuitivo che con questo sistema riprodurre anche un gran numero di pulsanti tutti uguali, non rappresenterebbe un problema.

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

102

Lezione XXII Allora Se


Questa lezione, grazie anche allapprofondimento della struttura decisionale If, dedicata a rendere pi flessibile ed interattiva la procedura di colorazione delle celle. Chiedere conferma Prima di eseguire delle modifiche, molte volte, le procedure chiedono conferma allutente tramite una finestra messaggio. Per implementare la suddetta modifica seguire i seguenti passi. Attivare il modulo ModColorare, e portarsi allinizio nellarea Dichiarazioni ed aggiungere una terza variabile a livello di modulo, denominata Risul.
Public Contenitore, Contenitore2, Risul As Variant

Successivamente digitare la seguente procedura.


Sub Messaggi1() Dim Mess, Titolo As String Mess = "Sei sicuro di voler procedere." Titolo = "Corso on line di VBA per Excel" Risul = MsgBox(Mess, vbYesNo + vbQuestion, Titolo) End Sub

Abbiamo creato una procedura espressamente dedicata alla gestione di messaggi per lutente. Posizionando il cursore in corrispondenza di una riga della procedura Messaggi1, cliccate sul pulsante Esegui Sub/ User Form per visualizzare questa nuova finestra messaggio. Notate la presenza di due pulsanti in luogo dellunico esemplare presente negli altri esempi con MsgBox. Chiaramente i due pulsanti sono generati dallistruzione vbYesNo. Un altro particolare da non trascurare la variabile, a livello di modulo, Risul che ricever loutput del pulsante sul quale lutente avr fatto clic. Portarsi nel Form Dialogo e cliccare due volte sul pulsante etichettato Verifica.

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

103

Apportare alla Sub CommandButton1_Click le variazioni evidenziate in grassetto visibili nel codice sottostante.
Private Sub CommandButton1_Click() SceltaPopolazione Range("F5").Select Messaggi1 procedura di visualizzazione messaggio If Risul = vbNo Then Exit Sub se cliccato sul pulsante No esce Do While ActiveCell <> "" If ActiveCell > Contenitore Then Selection.Interior.ColorIndex = 6 End If ActiveCell.Offset(1, 0).Range("A1").Select Loop Range("a1").Select End End Sub

Se in seguito alla visualizzazione della finestra messaggio, generata dalla procedura Messaggi1, si clicca sul pulsante NO, la procedura viene subito terminata. Altrimenti saranno eseguite tutte le istruzioni per colorare le celle che contengono pi di tot abitanti. Scegliere un colore Nella creazione del messaggio di conferma, abbiamo fatto ricorso alla struttura decisionale If, nella sua forma pi semplice: in realt If pu esprimere ben altri livelli di strutturazione. Poniamo il caso di voler dare allutente della nostra applicazione, la possibilit di attingere il colore con cui formattare le celle da una tavolozza di almeno tre colori: il giallo, il rosso e il verde. Sappiamo che nellindice della tavolozza dei colori il giallo corrisponde al 6. Per conoscere il valore corrispondente al rosso e al verde, registrare una macro che colora due celle rispettivamente dei due colori desiderati. Il rosso corrisponde al 3 ed il verde al 4. I Pulsanti di opzione Ma come fare a dare allutente la possibilit di comunicare alla procedura il colore da lui preferito? Usando i Pulsanti di opzione! Attivare il Form Dialogo. Eventualmente ingrandirlo per facilitare lintroduzione di nuovi oggetti. Sulla Casella degli strumenti fare clic sul pulsante Cornice e modellare il controllo sul Form, tenendo conto che dovr contenere tre Pulsanti di opzione.

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

104

Dalla Casella degli strumenti scegliere il Pulsante di opzione e modellarlo allinterno delloggetto Cornice teste introdotto nel Form. Ripetere le operazioni del paragrafo precedente per altre due volte. Modificare, nella finestra Propriet, la propriet Caption del Pulsante di opzione OptionButton1 in Giallo, ricordando che il controllo in oggetto deve essere selezionato.. Procedere nel modificare la propriet Caption degli altri due Pulsanti di opzione, in Rosso e Verde. Modificare la propriet Caption della Cornice in Colore. Fare clic sul pulsante Esegui Sub / User Form per verificare il funzionamento dei Pulsanti di opzione. I Pulsanti di opzione si escludono reciprocamente, quindi il loro funzionamento corretto quando uno solo di essi rimane selezionato. Sono stati introdotti allinterno di una Cornice poich in caso contrario non funziona lesclusione vicendevole. Nelleventualit si riscontrassero dei problemi nel rendere uniforme laspetto dei Pulsanti di opzione agire sulla propriet Height (altezza) ed uniformarne il valore. Occorre poi definire qual il colore predefinito, che nel caso dellimmagine a lato il giallo. Per ottenere suddetto risultato, impostare la relativa propriet Value su True, controllando che la propriet Value degli altri due Pulsanti di opzione sia impostata su False. IfThenElse IfElseEnd If NellEditor di VB visualizzare il Form Dialogo e dal menu Visualizza scegliere la voce Codice, per accedere al modulo del Form. Nellarea di dichiarazione, cio allinizio del modulo, dimensionare una variabile denominata Pennello con portata a livello di modulo.
Dim Pennello As Integer

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

105

Quindi digitare la seguente procedura.


Sub ScegliColore() If OptionButton1.Value = True Then 'se il primo pulsante Pennello = 6 'giallo ElseIf OptionButton2.Value = True Then 'altrimenti se il secondo Pennello = 3 'rosso Else 'altrimenti il terzo Pennello = 4 'verde End If End Sub

Questa volta la struttura decisionale If ha scelto fra tre possibilit. Dopo la prima possibilit IfThen passato alla seconda ElseIfThen, infine lultima con Else senza il Then. Se invece di avere tre scelte, ne avessimo avute quattro, la terza sarebbe stata ElseIfThen e la quarta Else. Infine modificare la procedura CommandButton1_Click legata alla formattazione delle celle come di seguito riportato.
Private Sub CommandButton1_Click() SceltaPopolazione 'Macro in cui digitiamo la popolazione ScegliColore Macro per scegliere il colore Range("F5").Select Messaggi1 Macro per scegliere se controllare If Risul = vbNo Then Exit Sub Do While ActiveCell <> "" ' esegue se non vero che la cella vuota If ActiveCell > Contenitore Then 'se superiore a 9999 Selection.Interior.ColorIndex = Pennello 'colora End If ActiveCell.Offset(1, 0).Range("A1").Select 'scende di una cella Loop Range("a1").Select End End Sub

Dopo la procedura SceltaPopolazione, abbiamo introdotto la procedura ScegliColore adibita a raccogliere la scelta del colore dai Pulsanti di opzione. Per lindicazione del colore da usare con Selection.Interior.ColorIndex = abbiamo introdotto la variabile Pennello contenente il valore del colore scelto.

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

106

Case La struttura If ElseIf, consente di nidificare al suo interno altre strutture If o anche If ElseIf, un po come in Excel nidifichiamo la funzione Se, con la differenza che in VBA le possibilit sono enormemente pi elevate. Per se la scelta dovesse avvenire fra molti elementi, una decina per esempio, la struttura If EsleIf, pur funzionando, non rappresenterebbe lideale. Se ciascuna istruzione ElseIf esegue un confronto della stessa espressione con valori diversi, questo approccio risulta complicato. In tal caso, consigliabile utilizzare listruzione Select Case.
Sub StudioCase() Dim Numero As Integer Number = 7 ' Inizializza la variabile Select Case Number Case 1 ' Numero 1 MsgBox "S uno", vbExclamation Case 6, 7, 8 ' Numeri tra 6 e 8 MsgBox "S da 6 a 8", vbExclamation Case 9 To 12 ' Numeri da 9 a 12 MsgBox "S da 9 a 12", vbExclamation Case Else 'Gli altri numeri MsgBox "Altro", vbExclamation End Select End Sub

Per verificare il funzionamento di questultima procedura, sostituire il contenuto della variabile Number.

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

107

Lezione XXIII Ciclo For Next


Il ciclo For Next (Per Successivo), consente di eseguire un determinato gruppo di istruzioni, un certo numero di volte. Un ciclo For un modo sintetico per scrivere un gran numero di istruzioni che fanno sostanzialmente la stessa operazione. Osserviamo questo semplice esempio.
Sub Saluti() Dim Conta As Integer For Conta = 1 To 5 MsgBox "Ciao" Next End Sub

Eseguite questa macro e la finestra messaggio vi saluter per cinque volte. Se non avessimo usato il ciclo For per ottenere lo stesso risultato avremmo dovuto scrivere la procedura nel seguente modo.
Sub Saluti() MsgBox MsgBox MsgBox MsgBox MsgBox End Sub

"Ciao" "Ciao" "Ciao" "Ciao" "Ciao"

Forse lesempio illustrato non rende ancora giustizia alle potenzialit del ciclo For, ma osservate questaltro listato.
Sub ProvaFor() Dim Conta, Elabora As Long Elabora = Application.InputBox("Digita un numero", , , Type:=1) For Conta = 1 To 5 Elabora = Elabora * 2 Next MsgBox Elabora End Sub

La variabile Conta il contatore del ciclo For: ogni volta che il ciclo viene eseguito la variabile Conta aumenta di uno. Nella prima esecuzione del ciclo essa conterr uno, nellultima ripetizione, se il ciclo viene ripetuto cinque volte, conterr cinque.

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

108

Il numero di volte che il ciclo viene ripetuto dato dal valore espresso dopo la parola chiave To, cio il 5. 1 To 5, che pu essere tradotto in : dallinizio (1) alla fine (5). Quindi la variabile Elabora, che prima dellinizio del ciclo, ha assunto il valore digitato in InputBox (per facilitare lesposizione dellesempio poniamo sia 3), assume il valore di se stessa moltiplicata per 2, cio 3*2= 6. Il ciclo giunge a Next e da inizio alla seconda ripetizione con la variabile Elabora che avr un valore di 6 e gl i sar assegnato il valore di se stessa per 2, cio 6*2 = 12. E cos continuando sino alla quinta esecuzione, ove consegue il risultato di 96, visualizzato nella finestra messaggio. Ricavare dati da una cella Il ciclo For pu diventare anche pi flessibile rendendo dipendente il numero di ripetizioni da una variabile. Invece di avere 1 To 5 , possiamo proporre 1 To NomeVariabile. Preparare questo nuovo esempio, controllando che nella cartella in cui stiamo lavorando sia presente un foglio di lavoro denominato Foglio1, e digitare nella cella A1 il valore 5. Il numero di ripetizioni sar determinato dal valore presente nella cella A1 del foglio Foglio1. Nel codice sottostante possiamo vedere che nella riga 3 la variabile Raccogli, assume il valore della cella A1. Nella riga 5 il numero di ripetizioni determinato dalla variabile Raccogli.
1: Sub ProvaFor() 2: Dim Conta, Elabora, Raccogli As Long 3: Raccogli = Sheets("Foglio1").Range("a1") 4: Elabora = Application.InputBox("Digita un numero", , , Type:=1) 5: For Conta = 1 To Raccogli 6: Elabora = Elabora * 2 7: Next 8: MsgBox Elabora 9: End Sub

Verificare il funzionamento di questa procedura posizionando il cursore in un punto qualsiasi di ProvaFor e cliccare sul pulsante Esegui Sub. Noterete che cambiano il valore della cella A1 in Foglio1 cambier il risultato finale.

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

109

Errore di Overflow Ma in agguato c un errore. Provate a digitare 1020 in A1 e 20 in InputBox. Far la sua comparsa una finestra di dialogo comunicante un errore di Overflow. Un Overflow pu essere il risultato di un'assegnazione superiore al valore massimo previsto. Inseriamo nella nostra procedura la gestione degli errori, come visto nelle precedenti lezioni.
Sub ProvaFor() Dim Conta, Elabora, Raccogli As Long Raccogli = Sheets("Foglio1").Range("a1") Elabora = Application.InputBox("Digita un numero", , , Type:=1) On Error GoTo Salta For Conta = 1 To Raccogli Elabora = Elabora * 2 Next MsgBox Elabora Exit Sub Salta: MsgBox "Numeri troppo alti" End Sub

Proteggere e sproteggere Molte volte si deve lavorare con cartelle di lavoro contenenti un gran numero di fogli, che per esigenze procedurali dobbiamo consegnare allutente finale protetti. Durante la lavorazione e successivi aggiornamenti si dovr procedere alla protezione e sprotezione dei fogli di lavoro pi volte, attivit decisamente lunga e noiosa, anche perch non effettuabile in multifoglio. Le due procedure qui di seguito riportate proteggono e sproteggono tutti i fogli di una cartella di lavoro in un battibaleno, inserendo anche una password, che naturalmente pu essere variata a piacere.

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

110 Sub Proteggi() Dim spro, conta, fog As Integer fog = 1 spro = Worksheets.Count For conta = 1 To spro Worksheets(fog).Select fog = fog + 1 ActiveSheet.Protect Password:="lilli" Next Worksheets(1).Select End Sub Sub Sproteggi() Dim spro, conta, fog As Integer fog = 1 spro = Worksheets.Count For conta = 1 To spro Worksheets(fog).Select fog = fog + 1 ActiveSheet.Unprotect Password:="lilli" Next Worksheets(1).Select End Sub

Rispetto agli esempi precedenti sono presenti I seguenti elementi di innovazione.


spro = Worksheets.Count

La propriet C ount restituisce il numero di fogli di lavoro presenti in una cartella di lavoro.
Worksheets(fog).Select

Un foglio di lavoro, oltre che dal nome individuabile dalla posizione che occupa nella cartella di lavoro, quindi Worksheets(1) rappresenta il primo foglio di lavoro. Nel nostro caso Worksheets(fog) , il luogo del valore c la variabile fog . Se alla variabile fog viene associato il valore 1, indicher il primo foglio, associandogli 2, il secondo foglio e cos via.
ActiveSheet.Protect

Ovviamente protegge il foglio di lavoro attivo, mentre Unprotect lo sprotegge. E possibile omettere listruzione Password, in tal caso la protezione avverr senza nessuna parola segreta. Utilizzando InputBox anche possibile permettere allutente di personalizzare la password.

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

111

Lezione XXIV Nidificare For Next


Un ciclo ForNext pu essere inserito allinterno di un altro ciclo ForNext, operazione comunemente definita nidificazione. Per mettere in pratica questa potente possibilit offertaci dal VBA, creeremo una routine che automaticamente ordiner i fogli di lavoro di una cartella. Il codice di ordinamento Il listato sottostante, piuttosto astruso ad una prima occhiata, ordina alfabeticamente tutti i fogli di una cartella di lavoro.
Sub OrdinaFogli() Dim ordina As Integer, ordfog As Integer For ordina = 1 To Sheets.Count For ordfog = 1 To Sheets.Count 1 If Sheets(ordfog).Name > Sheets(ordfog + 1).Name Then Sheets(ordfog).Move after : =Sheets(ordfog + 1) End If Next ordfog Next ordina End Sub

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

112

For ordina = 1 To Sheets.Count

For ordfog = 1 To Sheets.Count 1

If Sheets(ordfog).Name > Sheets(ordfog + 1).Name Then

Sheets(ordfog).Move after : =Sheets(ordfog + 1) End If Next ordfog Next ordina

Esegue il ciclo For per il numero di fogli presenti nella Cartella di lavoro. Tale valore determinato dallistruzione Sheets.Count che conta il n di fogli presenti nella cartella. Count una propriet che restituisce il numero degli oggetti presenti in un insieme. Questo secondo ciclo For esegue la medesima operazione del precedente, ma una volta in meno. Nella prima esecuzione del ciclo For il Foglio(ordfog), cio il primo della cartella viene confrontato con il secondo foglio della Cartella, e se alfabeticamente successivo (>) vengono eseguite le istruzioni della riga sottostante. Nella seconda esecuzione del ciclo For, il confronto avverr fra il secondo e il terzo foglio e cos via. Queste istruzioni vengono eseguite se la condizione della riga precedente VERA. I due fogli vengono invertiti di posizione, per ordinarli alfabeticamente. Fine condizione Fine del secondo ciclo For, con l'istruzione Next (successivo) viene ripetuto. Fine del primo ciclo For, con l'istruzione Next (successivo) viene ripetuto.

La sintassi di questa procedura abbastanza semplice, quello che probabilmente risulta un po ostico da intuire il perch occorrono due cicli For, cio la loro nidificazione. Illustriamo il risultato dell'esecuzione della procedura OrdinaFogli dopo aver disabilitato il primo ciclo For.
Nell'immagine a destra la stessa Cartella dopo l'esecuzione della procedura OrdinaFogli con il primo ciclo For disabilitato.

Nell'immagine a sinistra vediamo i fogli di una cartella da ordinare di una cartella.

Un poco di ordine stato fatto, ma non a sufficienza! Praticamente con l'esecuzione del secondo ciclo For stato messo a posto solo il primo foglio della cartella. Soltanto riabilitando il primo ciclo For il secondo ciclo sar eseguito per il numero di volte corrispondente al numero dei fogli, in modo tale che ad ogni esecuzione del primo ciclo For il secondo ciclo For mette in ordine un foglio della Cartella di lavoro.

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

113

PARTE 4 Controllare Excel


Una delle grandi prerogative del VBA, la possibilit di creare nuove funzioni da affiancare alle funzioni incorporate di Excel, di manipolare e spostare dati, di determinare le opzioni di apertura di una cartella, di eliminare la comparsa di messaggi di avvertimento; insomma, di assumere il controllo di Excel.

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

114

Lezione XXV Le Function

Tipi di routine In Visual Basic, quindi VBA, possibile creare due tipi di routine, ovvero la gi ampiamente sperimentata Sub e la routine Function. La routine Sub ununit di codice racchiusa tra le istruzioni Sub e End Sub che esegue delle operazioni, senza restituire alcun valore. Una routine Function ununit di codice racchiusa tra le istruzioni Function e End Function che esegue unoperazione specifica restituendo un valore. Le routine Function possono essere utilizzate in sostituzione di formule complesse, direttamente nei fogli di lavoro, proprio come si utilizzano le funzioni incorporate di Excel. Creare una nuova funzione per Excel Grazie alle formule di Excel, riusciamo a risolvere problemi veramente complessi. Purtroppo, a volte, determinati problemi risultano essere superiori al nostro retroterra culturale. Ad esempio, personalmente non capisco assolutamente niente di finanza, quindi non sarei in grado di calcolare limporto delle singole rate mensili, derivanti dal finanziamento chiesto ad una banca per acquistare unauto. Fortunatamente Excel ci mette a disposizione la funzione Rata, cos il problema risolto in poche battute sulla tastiera.

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

115

Come si pu vedere nellimmagine, la finestra di dialogo Incolla funzione raccoglie un bel numero di Categorie, le quali a loro volta, contengono una ulteriore ricca scelta di funzioni. Ma, il destino birbone, state tranquilli, far in modo che la funzione per voi, in quel momento indispensabile, non sia contemplata nella pur ricca collezione di Excel. Ed proprio qui che entrano in ballo le routine di tipo Function.

Analisi del problema Attenzione! Si presuppone che, se pensiamo di creare una funzione per aiutare lutente, o anche noi stessi, il problema da affrontare sia dotato di una discreta complessit. E quindi, indispensabile effettuare una accurata analisi delle problematiche da affrontare e del come risolverle. Il pretesto preso per il nostro esempio, attinge la sua ispirazione da una forma di lavoro che sempre pi si sta diffondendo, soprattutto fra i pi giovani: la collaborazione coordinata e continuativa. In molti si saranno scoraggiati di fronte alla complessit del calcolo della ritenuta dacconto e delle ritenute previdenziali, cos da lasciare una parte dei propri, non gi lauti guadagni, nelle tasche di qualche commercialista.

Come trovare limporto netto Illustreremo adesso i passi occorrenti, per ricavare dallimporto lordo, la corrispondente cifra netta, utilizzando i criteri di calcolo validi sino al 31/12/2000. A titolo esemplificativo partiamo da un importo lordo di un milione. Rispetto la cifra di partenza, un milione, occorre calcolare il 20% a titolo di ritenuta dacconto. Sempre dalla cifra lorda, un milione, calcolare il 95% per ricavare limponibile (la cifra) sul quale calcolare i contributi previdenziali. Laliquota previdenziale nel 2000 era del 13% o del 10%, di cui la quota a carico del lavoratore corrispondeva ad un terzo . Nel foglio elettronico, scegliendo per semplicit la laliquota previdenziale del 10%, la formula per ottenere limporto netto la seguente.
=1000000*0,8-1000000*0,95*0,1*0,333333333333333

Teoricamente si tratta di una formula piuttosto semplice, ma ne illustriamo ugualmente alcuni passaggi salienti.

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

116

La prima parte del calcolo consiste nel calcolare il compenso epurato dal 20% della ritenuta di acconto e che i pi svolgono in questo modo:
1000000-(1000000*20%)

anche se in realt abbreviabile nel seguente a lgoritmo:


1000000*0,80

Un secondo passaggio degno di nota riguarda lo scrivere 1/3. Nella formula lo si vede rappresentato da un 0,333333333333333, ma in realt stato digitato proprio come un terzo (1/3). I pi attenti avranno sgranato gli occhi,sapendo che se in un foglio di Excel si scrive 1/3, questi viene riconosciuto come 1 marzo. Per far metabolizzare ad Excel un valore frazionario si deve procedere nel seguente modo: Digitare uno zero (0), premere spazio (barra spazio) , infine digitare 1/3. Se qualcuno si stupito per lassenza di parentesi nella formula, non dimentichi la regola della precedenza fra operatori aritmetici. CompensoNetto Passiamo alla creazione della funzione. Attiviamo un modulo e digitiamo il seguente codice.
Function CompensoNetto(Lordo, Ritenuta, CTR) Dim Netto, LordoXCTR, CTRLavor As Long Netto = Lordo - Lordo * Ritenuta LordoXCTR = Lordo * 0.95 CTRLavor = LordoXCTR * CTR / 3 CompensoNetto = Netto - CTRLavor CompensoNetto = Round(CompensoNetto, 0) End Function

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

117

Function CompensoNetto(Lordo, Ritenuta, CTR)

Netto = Lordo - Lordo * Ritenuta

LordoXCTR = Lordo * 0.95

CTRLavor = LordoXCTR * CTR / 3

CompensoNetto = Netto - CTRLavor

CompensoNetto = Round(CompensoNetto, 0) End Function

CompensoNetto il nome della funzione. I nomi inseriti fra le parentesi sono gli argomenti della funzione, utilizzabili allinterno della funzione come variabili predefinite. Lordo = corrisponde al compenso lordo Ritenuta = corrisponde alla ritenuta d'acconto (20%) CTR = corrisponde al CTR del 10% o del 13 %. Netto il nome della variabile che assume il valore ottenuto dalla sottrazione della variabile Lordo, meno il valore ottenuto dalla variabile Lordo per la variabile Ritenuta. Es. Se Lordo = 1.000.000 e Ritenuta 20% sar eseguito il seguente calcolo: 1.000.000 - 1.000.000 * 20% = 800.000 LordoXCTR la variabile che assume il valore ottenuto dalla variabile Lordo * 95%, cio l'imponibile sul quale calcolare i CTR Es. Sar eseguito il seguente calcolo: 1.000.000 * 95% = 950.000 CTRLavor la variabile che assume il valore ottenuto dalla variabile LordoXCTR moltiplicato per il valore della variabile CTR diviso per 3, cio la quota di CTR a carico del consulente. Es. Se CTR = 10% sar eseguito il seguente calcolo: 950.000 * 10% / 3 = 31.666 CompensoNetto la variabile e il nome della funzione che assume il risultato finale, ottenuto sottraendo dalla variabile Netto la variabile CTRLavor . Es. Sar eseguito il seguente calcolo: 800.000 - 31.666 = 768.334 In questa riga viene arrotondato il risultato con lausilio della funzione Round. Fine della funzione.

A questo punto siamo pronti ad utilizzare CompensoNetto in un foglio di lavoro, come una qualsiasi funzione. Ad esempio se nella cella A1 contenuto il valore 1.000.000 corrispondente al compenso lordo, in A2 troviamo 20% equivalente alla ritenuta d'acconto e in A3 10% corrispondente al CTR previdenziale, si potr in una cella libera qualunque inserire le seguenti istruzioni: =CompensoNetto( A1; A2; A3 ) per ottenere il compenso netto del collaboratore. Ricordatevi, se volete rendere la funzione utilizzabile in tute le cartelle di lavoro, di collocarla nella cartella di lavoro speciale Personal.xls.

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

118

Lezione XXVI Manipolare i dati


Molte volte, siamo chiamati ad operare elaborazioni su dati, provenienti da altre applicazioni, che si presentano, come dire, inquinati. Diventa fondamentale bonificarli togliendo caratteri superflui, spazi e altre eventuali imperfezioni. Costruire lesempio In tutte le celle, relative alla colonna dei Comuni, inseriamo uno spazio vuoto e il CAP. Per realizzare tali condizioni attenersi ai seguenti passi. Innanzi tutto, per sicurezza, duplichiamo il foglio Comuni. o Con il puntatore del mouse portarsi sulla scheda del foglio Comuni, tenere premuto CTRL, tenere premuto il tasto sinistro del mouse e spostarsi un po pi a destra per generare il foglio Comuni(2), clone perfetto di Comuni. Nel foglio Comuni(2) attivare la cella G5, digitarvi la formula =A5& &B5 trascinandola sino alla corrispondenza dellultima riga con dati, la 319. Premere la combinazione di tasti CTRL+C per copiare negli Appunti la colonna, ancora selezionata, di dati test generata. Posizionarsi in A5 e dal menu Modifica scegliere Incolla speciale. Dalla finestra di dialogo Incolla speciale scegliere Valori e confermare ciccando su OK. Cancellare i dati della colonna G ed eliminare la colonna B, quella del CAP, sino ad ottenere il risultato illustrato nellimmagine.

Naturalmente, anche senza ricorrere al VBA, sarebbe possibile con le funzioni di Excel, ripulire i nomi dei comuni dallo spazio vuoto e dal CAP: ma occorre ricordarsi che un utente avanzato opera per creare agli altri utenti un ambiente software pi amichevole, dotato di tutti gli agi portati dallautomatismo.

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

119

Funzioni Len e Left NellEditor di VBA, agendo sul menu Inserisci, aggiungere un nuovo modulo, quindi digitarvi il codice di seguito illustrato.
1: Sub Pulisci() 2: Dim aa As String 3: Dim bb As Integer 4: Range("a5").Select 5: Do While ActiveCell <> "" 6: bb = Len(ActiveCell) 6 7: aa = Left(ActiveCell.Cells, bb) 8: ActiveCell.Offset(0, 6).Range("A1").Select 9: ActiveCell = aa 10: ActiveCell.Offset(1, -6).Range("A1").Select 11: Loop 12: Trasporta 13: Range("a1").Select 14: End Sub
Range("a5").Select Do While ActiveCell <> ""

bb = Len(ActiveCell) 6

aa = Left(ActiveCell.Cells, bb)

ActiveCell.Offset(0, 6).Range("A1").Select ActiveCell = aa ActiveCell.Offset(1, -6).Range("A1").Select Loop Trasporta

Si posiziona sulla prima cella con dati Ripete le istruzioni successive per fermarsi quando incontra una cella vuota. La variabile bb assume il risultato della funzione Len che conta il numero di caratteri del testo inserito nella cella attiva meno 6. Sei composto dai 5 caratteri del CAP + lo spazio. Quindi sottraendo alla lunghezza complessiva della stringa 6, veniamo a sapere di quanti caratteri composto il nome del comune contenuto in quella cella. La variabile aa assume il valore della funzione Left, che restituisce un numero specificato di caratteri partendo da sinistra, contenuti nella cella attiva. Il numero di caratteri che preleva dato dalla variabile bb. Si sposta a destra di 6 celle. La cella attiva assume il valore della variabile aa. Scende di una cella e torna a sinistra di sei celle. Ripetere. Finito il ciclo Do While, esegue il listato della procedura Trasporta.

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

120 Sub Trasporta() Range("G5").Select Range(Selection, Selection.End(xlDown)).Select Selection.Cut Range("A5").Select ActiveSheet.Paste End Sub

Si posiziona sulla cella G5, la prima Range("G5").Select della nuova colonna, appena creata da Pulisci. Range(Selection, Selection.End(xlDown)).Select Seleziona tutte le celle contenenti dati. Taglia. Selection.Cut Seleziona la cella A5. Range("A5").Select Incolla il contenuto della colonna G. ActiveSheet.Paste

Riepiloghiamo lazione della procedura Pulisci, coadiuvata dalla procedura Trasporta. La procedura Pulisci, grazie allausilio del ciclo Do..While passa in rassegna tutte le celle contenenti i nomi dei comuni, sporcati dal CAP. Quindi avvalendosi delle funzioni Len e Left estrae il nome pulito del comune che sposta sei celle a destra, cio nella colonna G. A questo punto entra in azione la procedura Trasporta che seleziona lintero intervallo di nomi ripuliti, li Taglia via, per andare ad incollarli in sostituzione dei dati originali. Ottimizzare Ma vediamo che con un po di spirito dosservazione possiamo ottimizzare il codice della procedura Pulisci.
1: Sub Pulisci2 () 2: Dim aa As String 3: Dim bb As Integer 4: Range("a5").Select 5: Do While ActiveCell <> "" 6: bb = Len(ActiveCell) - 6 7: aa = Left(ActiveCell.Cells, bb) 8: ActiveCell = aa 9: ActiveCell.Offset(1, 0).Range("A1").Select 10: Loop 11: Range("a1").Select 12: End Sub

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

121

Sino al punto 7 la procedura Pulisci e la procedura Pulisci2, sono identiche, ma nel punto 8 abbiamo la svolta! In realt basta associare subito il risultato della variabile aa alla cella attiva. Avendo entrambe le procedure sotto gli occhi pu sembrare evidente lerrore commesso con la prima routine: in realt estremamente facile commettere simili sviste e creare procedure che, vero, funzionano, ma con mille contorcimenti, creando alla lunga dei rallentamenti nellesecuzione del codice non indifferenti. Passare i dati ad un nuovo foglio La procedura PulisciSposta, qui di seguito riportata, pressoch identica a Pulisci2 sino al punto 12, salvo alla riga 4, ove per essere sicuri che la macro sia eseguita nella giusta locazione, stato indicato il foglio sul quale eseguire le operazioni di pulizia.
1: Sub PulisciSposta() 2: Dim aa As String 3: Dim bb As Integer 4: Sheets("Comuni").Select 5: Range("a5").Select 6: Do While ActiveCell <> "" 7: bb = Len(ActiveCell) - 6 8: aa = Left(ActiveCell.Cells, bb) 9: aa = LTrim(aa) 10: ActiveCell = aa 11: ActiveCell.Offset(1, 0).Range("A1").Select 12: Loop 13: Range("a4").Select 14: Range(Selection, Selection.End(xlDown)).Select 15: Selection.Copy 16: Sheets.Add 17: On Error GoTo salta 18: ActiveSheet.Name = "Arrivo" 19: Range("a4").Select 20: ActiveSheet.Paste 21: Columns.AutoFit 22: Range("a1").Select 23: Exit Sub 24: salta: 25: MsgBox "Il foglio Arrivo " & vbCr & _ 26: " gi presente", vbCritical 27: End Sub

Commentiamo le successive istruzioni.

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

122

Range("a4").Select Range(Selection, Selection.End(xlDown)).Select Selection.Copy Sheets.Add On Error GoTo salta ActiveSheet.Name = "Arrivo" Range("a4").Select ActiveSheet.Paste Columns.AutoFit Range("a1").Select Exit Sub salta:

MsgBox "Il foglio Arrivo " & vbCr & _

" gi presente", vbCritical

Si posiziona sulla prima cella della colonna dati. Seleziona lintera colonna di dati: corrisponde alla combinazione di tasti CTRL+SHIFT+ . Copia la selezione negli Appunti. Aggiunge un foglio di lavoro. In caso di errore si sposta alletichetta salta. Rinomina il foglio appena inserito. Seleziona A4 del foglio Arrivo. Incolla dagli Appunti la selezione precedentemente copiata. Autodimensiona la larghezza della colonna alla cella contenente il nome di comune pi lungo. Seleziona la cella A1. Esce dalla procedura per evitare di eseguire le istruzioni relative allerrore. Etichetta a cui saltano le istruzioni in caso di errore, Messaggio di avvertimento, basato sul pi probabile errore che potrebbe capitare, cio il foglio Arrivo gi presente nel momento che la procedura nella riga 18 cerca di rinominare il foglio appena aggiunto in Arrivo. E interessante notare come nella riga precedente stata usata la costante vbCr per mandare a capo in un punto determinato il testo del messaggio.

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

123

Pulire solo se Ipoteticamente potremmo voler applicare la bonifica dei nomi soltanto se questi rientrano in determinate condizioni: ad esempio, solo quando hanno una popolazione inferiore ai 1000 abitanti o superiore ai 10000.
1: Sub Pulisci3() 2: Dim aa As String 3: Dim bb As Integer 4: Range("a5").Select 5: Do While ActiveCell <> "" 6:: ActiveCell.Offset(0, 4).Range("A1").Select 7: If ActiveCell < 1000 Or ActiveCell > 10000 Then 8: ActiveCell.Offset(0, -4).Range("A1").Select 9: bb = Len(ActiveCell) - 6 e sottrae 10: aa = Left(ActiveCell.Cells, bb) 11: ActiveCell = aa 12: ActiveCell.Offset(1, 0).Range("A1").Select 13: Else 14: ActiveCell.Offset(1, -4).Range("A1").Select 15: End If 16: Loop 17: Range("a1").Select 18: End Sub

Sino al punto 5 la procedura Pulisci3 identica alla precedente.


ActiveCell.Offset(0, 4).Range("A1").Select If ActiveCell < 1000 Or ActiveCell > 10000 Then ActiveCell.Offset(0, -4).Range("A1").Select Dal punto 9 al punto 12 Else ActiveCell.Offset(1, -4).Range("A1").Select End If

Si sposta verso la quarta cella a destra, cio la popolazione. If si avvale delloperatore OR per definire le due condizioni in base alle quali operare la ripulitura. Se soddisfatte ritorna alla cella del comune. Esegue la ripulitura e scende di una cella. Altrimenti, se non soddisfatte. Scende di una cella e torna ai comuni, senza effettuare nessuna ripulitura. Fine della struttura di controllo If

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

124

Lezione XXVII Auto_Apri_Chiudi


Anche se in questo corso non stato previsto affrontare temi relativi alluso della grafica in Excel, innegabile che la creazione di un buon programma sia legato alla cura posta nella sua interfaccia grafica. In queste lezioni dedicheremo spazio a quelle istruzioni VBA che permettono di valorizzare laspetto dei nostri programmi, di personalizzarli, di renderli pi usabili, sicuri e automatizzati.

Auto_Apri Avrete notato, che se si salva una cartella di lavoro con attivo il Foglio2, posizionato nella cella Z100, alla successiva riapertura questa si presenter con il Foglio2 in Z100. Peccato! Magari avevate previsto una bella pulsantiera nel Foglio1 e per rendere guidata la navigazione allinterno della cartella , avevate anche tolto le Schede indicatrici dei fogli. Fortunatamente il VBA mette a disposizione una procedura speciale che permette di indicare con precisione le azioni che Excel deve compiere in fase di apertura della cartella di lavoro. Il trucco consiste nel dare alla procedura il nome di Workbook_Open.
Sub Workbook_open() MsgBox Ciao End Sub

E di inserirla ThisWorlbook.

nel

modulo

speciale

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

125

Auto_Chiudi E molto probabile che anche in fase di chiusura della cartella di lavoro, si vogliano eseguire automaticamente alcune operazioni, fosse solo il ripristinare i settagli modificati in fase di apertura. Tale procedura dovr assumere il nome di Workbook_BeforeClose(Cancel As Boolean). Anche in questo caso la procedura dovr dimorare allinterno del modulo ThisWorkbook.
Sub Workbook_BeforeClose(Cancel As Boolean) MsgBox Arrivederci End Sub

Un po di storia Ogni tanto si vedono delle procedure di apertura e di chiusura chiamate rispettivamente Auto_Open e Auto_Close. Si tratta di macro risalenti alle versioni 5 e 7 di Excel, ormai tollerate dal VBA per esigenze di compatibilit, ma non certamente amate: quindi non usatele. A proposito nelle versioni di Excel 5 e 7, era prevista la versione del VBA in italiano e le macro di apertura e di chiusura automatica, erano denominate Auto_Apri e Auto_Chiudi. Istruzioni varie Vengono adesso presentate una serie di istruzioni, che possono essere utilizzate sia allinterno delle due procedure di apertura, di chiusura, o di altre macro. Personalizzare la barra del titolo della cartella di lavoro.
Application.Caption = Corso di VBA on line

In chiusura, salva la cartella attiva senza chiedere conferma.


ActiveWorkbook.Save

Chiude la cartella di lavoro senza salvare le modifiche


ActiveWorkbook.Saved = True

Impostando la propriet Saved su True un po come ingannare Excel, dicendogli che la cartella gi stata salvata, anche se non vero.

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

126

Non visualizza la finestra di dialogo di conferma: per spiegarci meglio, quella che compare quando si vuole eliminare un foglio di lavoro.
Application.DisplayAlerts = False

Per ripristinarla sostituire False con True. E importante ricordarsi di ripristinare la visualizzazione del messaggio di conferma; pu essere molto pericolosa la mancanza di un elemento con il quale gli utenti sono abituati ad interagire. Disattiva laggiornamento dello schermo durante lesecuzione di una macro.
Application.ScreenUpdating = False

E importante inserire sempre listruzione di ripristino dellaggiornamento impostando la propriet ScreenUpdating siu True. Aprire un file di Excel.
Workbooks.Open FileName:="C:\Documenti\Comuni.xls"

Esempi di Auto_Apri e Auto_Chiudi Il listato illustra un esempio di utilizzo della procedura di apertura automatica, discretamente articolato.
Sub Workbook_open() With Application .ScreenUpdating = False Disattiva laggiornamento dello schermo .DisplayFormulaBar = False Toglie la barra della formula .DisplayStatusBar = False Toglie la barra di stato End With With ActiveWindow .DisplayHorizontalScrollBar = False Toglie la barra di scorrimento orizzon. .DisplayVerticalScrollBar = False Toglie la barra di scorrimento vertic. .DisplayWorkbookTabs = False Toglie le schede indicanti I fogli End With ActiveWindow.WindowState = xlMaximized Excel a tutto schermo Application.Caption = " Corso di VBA on line" Sheets("Comuni").Select Si apre sul foglio Comuni Range("a1").Select Application.ScreenUpdating = True Ripristina laggiornamento dello schermo End Sub

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

127

E importante in chiusura, ripristinare gli elementi di Excel che sono stati modificati o eliminati in fase di apertura.

Sub Workbook_BeforeClose(Cancel As Boolean) With Application .ScreenUpdating = False .DisplayFormulaBar = True .DisplayStatusBar = True End With With ActiveWindow .DisplayHorizontalScrollBar = True .DisplayVerticalScrollBar = True .DisplayWorkbookTabs = True End With Application.Caption = Empty 'Svuota la barra del titolo ActiveWorkbook.Saved = True Application.ScreenUpdating = True End Sub

Proteggere Se volete essere sicuri che nessuno modifichi il vostro lavoro, o peggio faccia dello sciacallaggio, proteggete il codice delle macro. Portarsi nellEditor di VB. Dal menu Strumenti scegliere la voce Propriet di VBAProject . Attivare la scheda Protezione. Mettere il flag su Proteggi progetto dalla visualizzazione. Inserire la password e confermare ciccando su OK.

Nota: Non fate troppo affidamento su questo tipo di protezione, nella rete sono reperibili dei programmi che decriptano facilmente le password dei progetti VBA.

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

128

Lezione XXVIII I macro virus


I virus informatici, "grazie al cielo", non sono mai stati una razza che ha corso il rischio di estinguersi, ma in questi ultimi tempi, con il proliferare incontrollato dei macro virus, incominciamo a sentire il bisogno di effettuare un abbattimento "selettivo", per evitare danni eccessivi all'ambiente dei nostri pc.

Come difendersi La prima regola in assoluto quella di essere dotati di un antivirus aggiornato. Si noti che un aggiornamento efficace deve avere una cadenza minima mensile, meglio se settimanale. Scandire sempre i nuovi documenti di Word, Excel, Power Point ed Access, sia che provengano da supporti magnetici tipo floppy o CD-ROM, che da posta elettronica. Pu essere brutto a dirsi, ma non fidatevi di nessuno. Word ed Excel sono dotati di una procedura che riconosce e segnala in fase di apertura l'eventuale presenza di una macro nel documento. Alcuni utenti infastiditi da tale segnalazione, che avviene anche per macro non infette, la disabilitano. Non fatelo assolutamente! Per ripristinare la procedura di protezione da macro virus, dal menu Strumenti di Excel, scegliere Macro\Protezione e impostarla su Media. Nota: La protezione da macro virus stata introdotta con Office 97 e a seconda della versione e dellapplicativo, pu presentare delle piccole differenze nelle impostazioni di disabilitazione e riabilitazione.

Scrivere una macro, abbiamo visto nel nostro corso, non molto difficile, ma sono ugualmente pochi quelli che sono capaci di farlo e anche quelli in grado di scriverne non necessariamente le creano: quindi se all'apertura di una cartella di Excel, o peggio di un documento di Word, vi viene segnalata la presenza di una macro e non vi stato comunicato che effettivamente doveva esserci, non attivatela. Se avete attivato una macro, dopo l'avvertimento della sua presenza e al successivo riavvio di quel documento, l'avviso non vi viene pi proposto, siete sicuramente "infetti".

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

129

Difesa artigianale Dalle osservazioni del paragrafo precedente si ricava una idea semplice, ma abbastanza efficace per trovare i macro virus. Reperire un file di Excel contenente una macro, possibilmente non infetta, e copiarlo su un dischetto protetto da scrittura. Inserire il floppy nel lettore del PC sospetto e lanciare il file di Excel. Se la procedura di rilevamento macro entra in funzione, probabilmente la macchina sana, altrimenti il dado tratto, siete infestati. Per toccare con "mano" l'entit virale r ichiamate dal menu Strumenti\Macro l'Editor di Visual Basic e qui se siete abbastanza smaliziati, potete anche provare a estirpare a "mani nude" il maligno.

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

130

Appendici
In questa sezione finale del corso, presentiamo alcune realizzazioni probabilmente ritenute inconsuete per Excel. Probabilmente dopo averle visionate vi chiederete che cosa non possibile fare con il nostro foglio elettronico.

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

131

Unanimazione con Excel


Una delle idee pi deleterie che pu circolare su Excel, quella di crederlo un programma per rigidi contabili. Nulla di pi falso! In piena era internettiana imperversano programmi tipo Flash, che sembrano gli unici a poter offrire grafica ed animazioni. In realt anche il nostro foglio elettronico in grado, anche se un po timidamente, di dire la sua in fatto di animazioni. Costruiremo una piccola animazione per misurare le prestazioni del nostro PC. Procuriamoci una piccola immagine a piacere, ad esempio un ciclista. Lidea di far scendere il ciclistino di una ventina di celle e di farlo risalire al punto di partenza, dando limpressione della pedalata. Per ottenere un simile effetto occorre una seconda immagine speculare del ciclista, facilmente ottenibile con un programma di grafica, tipo Paint Shop Pro. La nostra procedura dovr fare in modo che mentre le due immagini scendono lungo il foglio, siano alternativamente visibili per dare appunto limpressione della pedalata. Inseriamo le due immagini allinizio di un foglio, facendo attenzione a sovrapporle con precisione, quindi, se le immagini sono su sfondo bianco, come quelle del nostro esempio, colorare il foglio di lavoro di bianco. Passare nellEditor Di VB e digitare il codice della procedura CorsaCiclista.

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

132

Il codice
1: Sub CorsaCiclista() 2: Dim VarDisegno As Picture 3: Dim ContCorsa, Contatore, risul As Integer 4: Dim VelocitPc As Variant, Mess, tit As String 5: Sheets("Corsa").DrawingObjects("Picture 1").BringToFront 6: Mess = "Confermando verr eseguita un'animazione la" & Chr(13) & _ 7: "cui esecuzione potrebbe risultare eccessivamente" & Chr(13) & _ 8: "lunga con PC non molto potenti." 9: tit = "Corso di VBA on line" 10: risul = MsgBox(Mess, vbYesNo, tit) 11: If risul = vbNo Then 12: Range("a1").Select 13: Exit Sub 14: End If 15: VelocitPc = Timer 16: For ContCorsa = 1 To 144 17: With Sheets("Corsa").DrawingObjects("Picture 1") 18: .Visible = True 19: .Top = .Top + 2 20: .Visible = False 21: End With 22: With Sheets("Corsa").DrawingObjects("Picture 2") 23: .Top = .Top + 2 24: .Visible = True 25: End With 26: Next 27: For ContCorsa = 1 To 73 28: With Sheets("Corsa").DrawingObjects("Picture 1") 29: .Visible = True 30: .Top = .Top - 2.5 31: .Visible = False 32 End With 33: With Sheets("Corsa").DrawingObjects("Picture 2") 34: .Visible = True 35: .Top = .Top - 2.5 36: End With 37: Next 38: With Sheets("Corsa").DrawingObjects("Picture 1") 39: .Visible = True 40: End With 41: MsgBox (Timer - VelocitPc) & " Secondi" 42: End Sub

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

133

Sheets("Corsa").DrawingObjects("Picture Nel foglio Corsa, la prima immagine del ciclista, Picture 1, deve essere in primo piano. 1").BringToFront Dal punto 6 al punto 14 VelocitPc = Timer For ContCorsa = 1 To 144 With Sheets("Corsa").DrawingObjects ("Picture 1") .Visible = True .Top = .Top + 2 .Visible = False End With With Sheets("Corsa").DrawingObjects ("Picture 2") .Top = .Top + 2

Con una finestra messaggio chiediamo conferma per continuare o meno la procedura. Associa alla variabile la misurazione del tempo data dalla funzione Timer. Ripete le operazioni successive per 144 volte. Con loggetto Picture 1 Imposta la propriet di visibile su vero. Sposta in basso loggetto di due punti. Rende invisibile limmagine del primo ciclista e cos rimane visibile la seconda immagine. Fine enunciato Con. Passa alla seconda immagine.

E la sposta in basso di due punti. Confermandone la visibilit. .Visible = True Fine enunciato Con. End With Ripete da capo il ciclo. Quindi, mentre visibile , fa scendere di due punti il primo ciclista e lo nasconde. A questo punto passa al secondo Next ciclista, che non pi coperto dal primo ciclista, scende a sua volta di due punti. Ricompare il primo ciclista e per 144 volte. Esegue le operazioni di risalita, che avendo un ciclo ripetuto meno volte e spostamenti pi Dal punto 27 al punto 37 lunghi pi rapido della discesa. Terminata lanimazione rende visibile la prima With Sheets("Corsa").DrawingObjects immagine. ("Picture 1") Visualizza il tempo impiegato a percorrere il MsgBox (Timer - VelocitPc) & " Secondi" giro del foglio.

Nota: Ad essere scrupolosi, DrawingObjects un oggetto nascosto, perch ormai considerato obsoleto.

Certo, i ragionieri continueranno ad usare Excel per la grigia contabilit aziendale, ma magari, con langolo della bocca piegato verso lalto, ad abbozzare un tiepido sorriso.

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

134

Controllare la risoluzione dello schermo


Quando si realizza un applicazione con Excel, si predispone con cura anche il suo layout grafico: cos pu succedere, che dopo averlo impostato su una risoluzione di 800x600, scopriamo che la met dei potenziali utilizzatori del nostro lavoro imposta il suo video a 1024x768 pixel. Quindi, non sarebbe male verificare in fase di avvio della procedura, quale risoluzione utilizzata dallutente e regolare conseguentemente la modalit di visualizzazione. Il problema che, il VBA, come anche il Visual Basic, non sono in grado di effettuare operazioni di cos basso livello; per tale ragione si dovr effettuare delle chiamate direttamente alle API di Windows. Nota: Occorre tenere conto che un uso maldestro delle API pu di bloccare il sistema. Per utilizzare lAPI di Windows allinterno del VBA occorre usare listruzione Declare che permette di accedere alle DLL non appartenenti allinsieme di quelle messe a disposizione di Excel. Listruzione Declare v usata nellarea di dichiarazione del modulo, cio allinizio. Impostazioni La nostra procedura sar visualizzata a tutto schermo, impostazione di default, in presenza di una risoluzione video di 800 x 600 pixel. Se la risoluzione fosse di 1024 x 768 la finestra andr disegnata con proporzioni che rispecchino la risoluzione di 800 x 600, per non perdere il layout grafico. Naturalmente una risoluzione di 640 x 480 pixel dovr essere ritenuta fuori standard.

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

135

Listato
1: Public Declare Function GetSystemMetrics Lib "user32" _ 2: (ByVal asIndex As Long) As Long 3: Public Const risx = 0 4: Public Const risy = 1 --------------------------------------------------------------------------------------------------------------------5: Function Risoluzione() 6: Dim aaa As Variant, bbb As Variant 7: Dim parole1 As String 8: Dim opzioni1 As Byte, scelta1 As Byte 9: aaa = GetSystemMetrics(risx) 10: bbb = GetSystemMetrics(risy) ----------------------------------------------------------11: If aaa = 800 Then 12: Application.WindowState = xlMaximized 13: ElseIf aaa = 1024 Then 14: Application.WindowState = xlNormal 15: Application.Left = 78 16: Application.Top = 63 17: Application.Width = 605 18: Application.Height = 437 19: ElseIf aaa = 640 Then 20: parole1 = "La risoluzione del monitor impostata a " & aaa & " x " & bbb & _ 21: " - si consiglia di cliccare su SI per uscire dalla procedura" & _ 22: "e cos impostarla a800 x 600 per consentire una corretta visualizzazione " 23: opzioni1 = vbQuestion + vbYesNo 24: scelta1 = MsgBox(parole1, opzioni1) 25: If scelta1 = vbYes Then Application.Quit 26: Else 27: parole1 = "La risoluzione del monitor impostata ad una risoluzione non" & _ 28: " prevista - si consiglia di cliccare su SI per uscire dalla procedura" & _ 29: "e cos impostarla a800 x 600 per consentire una corretta visualizzazione " 30: opzioni1 = vbQuestion + vbYesNo 31: scelta1 = MsgBox(parole1, opzioni1) 32: If scelta1 = vbYes Then Application.Quit 33: End If 34: End Function

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

136

Il commento del codice


Public Declare Function GetSystemMetrics Lib "user32" _ (ByVal asIndex As Long) As Long Public Const risx = 0 Public Const risy = 1 aaa = GetSystemMetrics(risx) bbb = GetSystemMetrics(risy) If aaa = 800 Then Application.WindowState = xlMaximized ElseIf aaa = 1024 Then

La gi citata istruzione Declare, che fa riferimento alla libreria (file) user32.dll , presente nella cartella Windows\System. Dichiarazione delle costanti necessarie alle API per riconoscere la risoluzione. I valori sono desumibili nella documentazione Microsoft relativa allinterfaccia API di Windows. Si associa alla variabile il valore della risoluzione orizzontale. Si associa alla variabile il valore della risoluzione verticale. Se la risoluzione orizzontale uguale a 800 pixel manda la finestra di Excel a tutto schermo Altrimenti se 1024 pixel posiziona la distanza dal margine sinistro dello schermo al margine sinistro della finestra principale di Microsoft Excel, espressa in punti. posiziona la distanza tra il margine superiore dello schermo e il margine superiore della finestra principale di Microsoft Excel. determina la distanza tra il margine sinistro e il margine destro della finestra dell'applicazione. In altre parole la larghezza. determina laltezza della finestra principale dell'applicazione. Altrimenti se 640 pixel Imposta un MsgBox. Se si clicca su OK di MsgBox viene chiuso Excel. Altrimenti Imposta un MsgBox Se si clicca su OK di MsgBox viene chiuso Excel. Fine If, fine funzione.

Application.Left = 78

Application.Top = 63

Application.Width = 605

Application.Height = 437 ElseIf aaa = 640 Then Dalla riga 20 alla riga 24 If scelta1 = vbYes Then Application.Quit Else Dalla riga 27 alla riga 31 If scelta1 = vbYes Then Application.Quit Dalla riga 33 alla riga 34

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

137

Nota: Una funzione come Risoluzione chiaramente da eseguire automaticamente allavvio di Excel e quindi si pu essere portati ad individuare la sua collocazione allinterno del modulo speciale ThisWorkbook. In realt se il codice di Risoluzione, o meglio la dichiarazione di Declare, fosse collocata allinterno di suddetto modulo, la nostra procedura non funzionerebbe. Quindi per fare in modo che la funzione Risoluzione venga eseguita in fase di avvio di Excel, bisogna inserire il solo riferimento ad essa allinterno di Workbook_Open, come nellesempio sottostante.
Sub Workbook_open() ActiveWindow.WindowState = xlMaximized Application.Caption = " Corso di VBA on line" Risoluzione End Sub

Il bello della procedura Risoluzione, o meglio del VBA, che il suo codice, con poche variazioni, pu essere utilizzato anche per le altre applicazioni della suite Microsoft Office. Ad esempio, io ho appreso gli strumenti per il controllo delle impostazioni del video, studiando Access.

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

138

File allegato
Oltre al file di Excel Comuni.xls, da utilizzare per le esercitazioni previste nel corso, questo CD contiene un secondo file, denominato ComuniCD.xls, contenente il codice di alcuni esempi. Nel dettaglio, sono presenti le seguenti procedure: CompensoNetto; CorsaCiclista; Proteggi; Risoluzione; Sproteggi. Inoltre sono presenti due semplici macro di navigazione fra i fogli.

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

139

Conclusioni
Questo corso di programmazione, avrete letto nella presentazione, stato allestito, non per i programmatori professionisti, ma per utenti avanzati (power user), che volevano estendere le potenzialit, gi ampie, offerte da Excel. Con questo non si inteso dare adito ad una interpretazione riduttiva, del tipo: i corsi per programmatori sono di serie A, gli altri di serie B. In realt sono due aspetti dellinformatica costellati da molte diversit. Il programmatore, molte volte, appartiene ad un team, sviluppa una porzione specifica dellintero progetto, in taluni casi non conosce neanche molto bene quali sono le finalit del software su cui sta lavorando e sicuramente non ha esperienza diretta in quello specifico ambito lavorativo. A lui si chiede di costruire una struttura solida, sicura e magari duratura nel tempo. Lutente avanzato generalmente inserito nel contesto lavorativo ove le sue applicazioni dovranno funzionare e molte volte dovr realizzarle nei ritagli di tempo. Dovr allestire piccole e agili procedure in pochi giorni per far fronte a problemi imprevisti, magari in attesa del rilascio della procedura ufficiale, che dovr uscire da l a poco. Questo non vuol dire che le due figure siano inavvicinabili, anzi a volte gli utenti avanzati crescono cos tanto a livello di conoscenze tecniche da diventare dei veri e propri programmatori. Purtroppo pi difficile il processo inverso. E raro che un programmatore puro riesca a stabilire un punto di contatto, o meglio a comunicare con i fruitori del suo software. Se avete fatto vostri i concetti espressi da questo corso, sarete sicuramente in grado di realizzare applicazioni professionali di tutto rispetto. Per, non dimenticatevi che in realt abbiamo solo scalfito limmenso universo del VBA. Non stato neppure preso in considerazione un blocco di costruzioni fondamentali come gli Oggetti, per non parlare dellassoluta assenza di riferimenti allintegrazione con altre applicazioni Office. Poi, per chiunque lavori in una azienda di medie o grandi dimensioni, non da trascurare la tematica legata alle intranet e alla interazione fra pagine WEB e applicativi Office.

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

140

Indice rapido

Voce
Costanti Debug Declare Do UntilLoop Do WhileLoop Editor di VB Errori ForNext Forms IfThen IfThen ElseIfElseEnd If InputBox Left Len Macro virus Moduli MsgBox Notazione scientifica On Error GoTo Personal.xls Registrare una macro Select Case ThisWorkbook Variabili Workbook_BeforeClose(Cancel As Boolean) Workbook_Open

Pagina
69 92 134 64 63 - 119 - 123 47 88 107 - 111 - 132 95 - 99 60 - 132 104 - 135 74 119 119 128 34 40 70 68 94 27 15 106 48 - 125 66 125 - 127 124 126

Enrico Cannoni - Manuali.Net Tutti i diritti riservati

You might also like