Paolo Guccini

"Impossibile" non è mai la risposta giusta

VBA: VISUAL BASIC FOR APPLICATION

Un’introduzione al nuovo linguaggio disponibile in winword ed excel per vederne le caratteristiche di base e le relative potenzialità anche attraverso piccoli ma utili esempi


La Microsoft ha introdotto nel WinWord e nell’Excel un nuovo linguaggio di programmazione orientato all’automazione di compiti ripetitivi e sviluppo di piccole procedure. Si tratta di uno strumento che sicuramente nel breve futuro presenterà interessanti sorprese nonostante che per adesso risenta di piccoli problemi di gioventù.
Il vecchio meta linguaggio delle macro è ancora utilizzabile, ma è comunque consigliabile spostarsi sul VBA in quanto costituirà probabilmente lo strumento preferenziale (se non unico) per la programmazione del software Microsoft per l’Office Automation. Infatti VBA significa Visual Basic for Application, cioè il linguaggio Visual Basic destinato alla programmazione sotto i vari programmi applicativi. La terminologia però non è cambiata: i programmi in VBA vengono ancora chiamati macro, quasi ad evidenziare la ricerca di una transizione il più indolore possibile.
Ma uno degli aspetti più rilevanti per sviluppatori consiste nel poter disporre di un linguaggio strutturato con i conseguenti e ben immaginabili vantaggi che esso può offrire.

VBA: dove e come

Nel WinWord 6 e nell’Excel 5.0 (d’ora in poi faremo implicito riferimento a queste versioni in lingua italiana per il Word e in inglese per l’Excel in ambiente Windows 3.xx) i programmi in VBA possono venire creati esattamente come si faceva con le vecchie macro:

  • avviando il registratore interno delle macro ed eseguendo le varie operazioni che vengono poi da esso memorizzate;
  • creando la macro manualmente esattamente come si procederebbe nello scrivere un programma mediante un qualsiasi linguaggio.

Il primo metodo è estremamente interessante sotto l’aspetto didattico perché permette di studiare alcuni aspetti del VBA osservando come il registratore ha creato il sorgente. In altre parole, se si lancia il registratore di macro e si eseguono varie operazioni quali la formattazione o spostamenti, sarà possibile aprire la macro appena registrata e vedere cosa contiene. Ovviamente non potranno mai essere analizzate e studiate con questa tecnica le strutture condizionali o di controllo del VBA in quanto non possono essere realizzate mediante il registratore. Facciamo un esempio di come operare con WinWord.

  • aprire un documento contenente del testo e selezionate un paragrafo;
  • tramite i menu Strumenti/Macro/Registra mettere in esecuzione il registratore di macro;
  • applicare la formattazione grassetto, sottolineato e corsivo;
  • tagliare quanto precedentemente selezionato;
  • premere ctrl -freccia giù per spostarvi ù basso di un paragrafo:
  • incollare.

Così facendo dovreste aver spostato un paragrafo sotto quello successivo e dovrebbe comparire in grassetto, sottolineato e corsivo, altrimenti riprovate.
Nel listato 1 si può vedere cosa il generatore ha memorizzato. In esso vediamo subito una cosa importante: ogni macro deve essere racchiusa fra Sub ed End Sub che sono le istruzioni che costituiscono il punto di inizio e fine della macro.
La sintassi delle istruzioni è semplicissima Grassetto, Corsivo e Sottolineato operano la formattazione dei caratteri come il loro stesso nome illustra. Segue l’istruzione ModificaTaglia che provvede a memorizzare la selezione nella clipboard; ParagrafoGiù sposta il cursore in giù di un paragrafo e Modificalncolla completa l’operazione di spostamento.
Come potete vedere la sintassi è autoesplicativa, inoltre più di un mega byte compresso di help in linea aiuta sensibilmente a muoversi nei meandri del VBA: selezionando dal menu punto interrogativo la voce Sommario (oppure Help e Contents) è possibile accedere alla reference guide. L’inconveniente principale consiste nel fatto che purtroppo non è possibile stamparla (se non parte per parte, esempio per esempio) e, avendo la struttura tipica di un manuale di reference, non è destinato all’apprendi mento del linguaggio. Non di meno, utilizzando il manuale di introduzione al VBA accluso alla confezione del prodotto, osservando attentamente i vari esempi prodotti dell’help e quelli creabili mediante il registratore di macro, sfruttando le propria esperienza col linguaggio Basic, è comunque possibile cominciare a muovere i primi passi nella programmazione in VBA.
Altro modo per creare una macro in VBA consiste nello scriverla direttamente. I menu e le relative voci cambiano nei due programmi: con il WinWord è necessario:

  • aprire il menu Strumenti e seleziona re la voce Macro;
  • digitare il nome della macro (passo fondamentale altrimenti il tasto Crea non si rende disponibile);
  • remere il tasto Crea;

mentre con l’Excel si deve:

  • selezionare il menu Insert/Macro/Module.

A questo punto, entrambi i programmi presenteranno un foglio dove poter digitare le istruzioni in linguaggio VBA. Da qui in poi il parallelismo del VBA nei due pro dotti comincia a diminuire fino a differenziarli considerevolmente a causa della diversità degli oggetti che i due programmi sono deputati a gestire: per l’Excel l’unità minima è la cella all’interno di uno sheet mentre per il Word è il carattere all’interno di un paragrafo. Cambiano gli oggetti e cambiano gli strumenti.
Ma vediamo in pratica i motivi che possono spingere a ricorrere alle macro in VBA.

VBA: perchè?

Esistono principalmente quattro motivi per cui si ricorre alle macro:

  • per automatizzare compiti ripetitivi;
  • per fornire il programma di nuove caratteristiche e funzionalità;
  • per creare veri e propri programmi;
  • per stabilire collegamenti programmati fra diversi software sfruttando la tecnica OLE (Object Linking and Embedding) quando non sia possibile realizzarli via menù.

Il primo motivo può apparire palese: spes so capita di dover ripetere determinate ope razioni più volte. Tralasciamo esempi quali il dover formattare una selezione con de terminati attributi o caratteristiche, in quan to, sfruttando con accortezza gli strumenti che vengono già forniti, il ricorso alle macro risulta spesso superfluo.
Il secondo motivo è più attinente al mon do degli sviluppatori di software. Non di rado si riscontrano alcune piccole man canze nei programmi che potrebbero es sere risolte con macro di poche istruzio ni. E il caso tipico dei dattilografi inesperti che scrivono un documento guardando la tastiera anziché il video e digitano intere frasi con i caratteri maiuscoli e minuscoli invertiti perché non si sono accorti di avere il tasto CAPS LOCK attivo.
Per gli ultimi due motivi il ricorso alle macro costituisce una necessità; più in par ticolare, lo sviluppo di software può av venire percorrendo due strade:

  • utilizzando esclusivamente il linguaggio VBA interno, creando conseguentemente una o più macro;
  • sfruttando il VBA ed un linguaggio esterno il quale si avvale di chiamate alle API fornite dal VBA stesso ed eventualmente anche di quelle forni te da Windows.

Purtroppo quest’ultima soluzione presenta alcuni inconvenienti in quanto è necessario disporre di:

  • compilatore in grado di generare dei file .DLL;
  • kit di sviluppo Microsoft o equivalente che metta a disposizione l’interfaccia dal Word o Excel verso il linguag gioesterno che si desidera adottare.

Se lo sforzo per realizzare quest’ultimo tipo di soluzione può essere realmente consistente, è altrettanto vero che il risultato sarà qualitativamente e tecnicamente migliore.


Visibilità e vista delle macro VBA

Logicamente la stessa macro può essere applicata su documenti differenti in mo menti diversi. Ma è anche possibile che una macro durante la sua esecuzione agisca su più documenti. Questo porta a prendere in considerazione il meccanismo di indirizzamento o riferimento ai vari documenti coinvolti.
Il sistema più semplice consiste nel far selezionare e rendere attivi dalla macro i documenti che via via sono oggetto del l’elaborazione, infatti le istruzioni operano per default sul documento attivo. Questo aspetto è molto importante soprattutto quando si iniziano a fare le prime prove in VBA: per esempio, una collaudatissima macro potrebbe fallire miseramente se il tipo di documento atti vo non è quello atteso, situazione che ac cade frequentemente durante le fasi i sviluppo delle macro: se si modifica la macro e non si torna sul documento, il documento attivo rimarrà il foglio della macro e conseguentemente essa segnalerà un errore che, soprattutto all’inizio, è di difficile spiegazione.
Altro metodo consiste nell’indicare il nome o il numero del documento su cui deve agire, ma siccome fra il Word e l’Excel questo sistema differisce sostanzialmente, non lo approfondiremo in questa sede. Passiamo ora a vedere alcuni esempi pratici di programmazione iniziando con il WordBasic per poi passare al Visual Basic for Excel: essi saranno utilissimi a fini didattici, propedeutici e pratici.


Wordbasic: alcuni concetti fondamentali

Innanzitutto è importante definire alcuni concetti base che sono lievemente differenti da quelli della programmazione classica.
Credo che il significato della parola se lezione in ambiente informatico sia chiara per tutti: si tratta di un sottoinsieme, di un qualcosa che è stato selezionato per poterlo manipolare. Questo concetto è importantissimo nel Word in quanto molte operazioni agiscono sulla selezione.
La selezione ha un inizio ed una fine. Essa può essere gestita in due modi:

  • acquisendola mediante la funzione Selezione$();
  • utilizzando dei Segnalibri che ne identificano la posizione di inizio e di fine ed appoggiandosi sulla clipboard.

Il primo sistema restituisce alla macro chiamante una stringa avente i seguenti limiti: non può essere più lunga di 65.000 caratteri circa e gli attributi di formattazione non vengono presi in considerazione.
Il secondo sistema non fa altro che costituire due puntatori detti segnalibro al l’interno del documento, per cui non ci sono problemi sull’estensione dell’area selezionata o sugli attributi di formattazione della medesima; ogni elemento interno alla selezione o l’intera selezione possono venire copiati o spostati nella clipboard e da essa incollati dove desiderato. Questa tecnica presenta comunque un inconveniente; non è possibile modificare quanto essa contiene.
Esistono circa quindici segnalibri specifici che il WordBasic definisce, gestisce e consente di gestire come quello indicante il carattere attivo, che ha nome \Char. Altro concetto importante è il punto di inserimento che corrisponde alla posizio ne del cursore.
Alle macro viene assegnato un nome mediante il quale viene richiamata o gestita. Al suo interno è sempre presente la subroutine MAIN, che è quella che viene eseguita al lancio della macro e dalla quale si possono richiamare altre subroutine o funzioni della macro.
Ora che sono stati sinteticamente illustrati questi concetti, possiamo passare alle macro vere e proprie.


Macro per l’inversione dl maiuscole e minuscole

Abbiamo detto che può capitare che vengano digitate inavvertitamente delle frasi invertendo le maiuscole con le minuscole e viceversa a causa del CAPS LOCK dimenticato attivo. La macro che esegue la conversione non è di immediata realizzazione in quanto il Word 6 dispone di alcune stupende funzionalità che talvolta entrano in conflitto con la logica della programmazione classica.
Vediamo l’approccio più logico al problema: acquisire la selezione mediante la funzione selezione$(), eseguirne la scansione carattere per carattere e verificare per ogni lettera se è una maiuscola o una minuscole e sostituirla di conseguenza. Gli unici problemi sono il limite dei 65.000 caratteri per le stringhe e la perdita della formattazione; ma a parte questi particolari andrebbe benissimo.
Altro approccio, decisamente più didattico, è quello riportato nel listato 2. In esso vengono compiuti i seguenti passi:

  • viene verificato mediante le funzioni GetSelStartPos() e GetSelEndPos() che l’utente abbia eseguito una selezione, altrimenti viene visualizzato un messaggio d’errore;
  • vengono creati due segnalibri di nome arbitrario UprLwrStart e UprLwrEnd per identificare le posizioni di inizio e fine della selezione sulla quale operare. Allo scopo viene usata l’istruzione CopiaSegnalibro() che, sfruttando due segnalibri del WinWord di nome \StartOfSel e \EndOfSel i quali puntano costantemente all’inizio e alla fine della selezione corrente, memorizza le posizioni iniziali e finali nei primi due segnalibri.

Il ciclo ha termine quando i puntatori UprLwrStart e UprLwrEnd sono sovrapposti, situazione verificata mediante la funzione ConfrSegnalibro() che restituisce il valore 2 in caso affermativo. La macro si conclude cancellando i due sud detti segnalibri mediante la funzione ModificaSegnalibro.
Provate questa macro di nome swapUprLwrErr. Vedrete che la macro non funziona correttamente: le parole composte da una singola lettera vengono inesorabilmente unite alla parola successiva. Il motivo di questo comportamento è da ricercarsi in una prerogativa del nuovo WinWord che è ben visibile quando si a vora come semplici utenti: selezionando una parola e spostandola o tagliandola, automaticamente il Word provvede a togliere gli spazi superflui. Così facendo, quando si toglie la parola "è" si toglie anche lo spazio che la segue e quando viene inserita, lo spazio non viene ripristinato causando l’anomalia poc’anzi descritta.
La macro InverteMaiusMinus contiene l’algoritmo corretto ed è riportata nel listato 3.
Concettualmente è identica a swapUprLwrErr, ma, per evitare la perdita dello spazio, controlla se la parola è composta da un solo carattere: in tal caso aggiunge uno spazio dopo aver inserito il carattere. Inoltre essa genera un ulteriore segnalibro di nome UprLwrWordEnd che punta alla fine della parola in esame; di conseguenza troveremo due loop nidificati: quello più esterno controlla l’elaborazione su tutta la selezione come nella macro precedente, mentre il secondo gestisce la scansione dal punto attuale fino alla fine della parola selezionata. In questa macro è possibile vedere anche come si dichiarano e richiamano le funzioni. CutReversePast$() è una funzione di sette righe che compie le seguenti operazioni:

  • taglia la selezione corrente che deve essere composta da un solo carattere;
  • verifica se il carattere è una lettera minuscola paragonandolo a se stesso dopo avergli applicato la funzione Lcase$(), la quale converte in minuscolo il parametro che riceve come argomento;
  • applica la conversione del caso;
  • inserisce nel documento il carattere convertito.

Concludendo, questa macro ha permesso di analizzare i seguenti aspetti:

  • come acquisire informazioni sulla se lezione;
  • come si effettua la scansione e si gestiscono i segnalibro;
  • come si dichiara e richiama una funzione.

Questa macro vuole avere solo uno scopo didattico, ma potete darla ai neofiti dattilografi del Word: farà certamente un grande effetto!

macro "capolettera"

Il capolettera è il primo carattere di una frase il quale ha un dimensionamento pari a qualche riga di testo e si estende verso il basso: capita saltuariamente di trovarlo nel primo paragrafo all’inizio dei capitoli in alcuni libri.
La macro capolettera vuole essere un semplice esempio di come eseguire un’operazione in tutti i paragrafi iniziando dal corrente sino alla fine del documento. Essa applica il capolettera ad ogni paragrafo ricorrendo all’istruzione FormatoCapolettera e riallinea opportunamente il paragrafo operando sui rientri mediante l’istruzione FormatoParagrafo. È da osservare che entrambe le istruzioni sono state spezzate su due righe mediante il carattere backslash posto alla fine di ogni riga non terminale. Inoltre è visibile che le istruzioni possono avere degli argomenti, i quali costituiscono delle specifiche aggiuntive che in formano l’istruzione su come operare; essi iniziano con il punto ad indicarne l’appartenenza all’istruzione (forse un retaggio del C o dei nuovi Basic) e sono fra loro separati dalla virgola. Taluni argomenti necessitano di un valore; quest’ultimo appare dopo l’argomento separato dall’uguale.
Una funzionalità di questa macro è la visualizzazione di un contatore indicante il numero di paragrafi che sono stati elaborati. Essa è ottenuta mediante l’istruzione Print che fa apparire un messaggio nella zona abitualmente occupata dalla barra di scorrimento orizzontale.
A differenza dell’istruzione MsgBox che apre una finestra contenente la stringa che riceve come parametro, Print non sospende l’elaborazione della macro permettendo di realizzare degli indicatori sull’avanzamento dell’ elaborazione.
Prendendo un documento di prova e posizionandovi su un qualunque paragrafo, applicate questa macro osservando in basso a sinistra della finestra lo scorrere del contatore man mano che i paragrafi vengono formattati: se la visualizzazione della formattazione è diversa da quanto atteso. verificare nel menu Visualizza di avere scelto la voce layout di pagina. In sintesi questa macro riportata nel listato 6 evidenzia i seguenti aspetti:

  • suddivisione di un comando macro su più righe mediante il carattere back slash<
  • gli argomenti delle istruzioni;
  • come visualizzare l’avanzamento del la macro mediante l’istruzione Print.

La macro "accentare"

Lo scopo didattico della macro è mostrare come si gestiscono gli spostamenti in avanti e indietro, mentre quello pratico è fornire uno strumento in grado di porta re determinate correzioni al testo.
Essa opera su una selezione ricercando le vocali accentate composte dalla vocale e dal carattere d’accento presenti come due distinti caratteri e li sostituisce con l’appropnato carattere accentato. Ad esempio, la parola "perche’ " diventerà "perché".
Essa si basa su due principi: i segnalibri e le funzioni.
L’aspetto più importante di questa macro è come viene spostato il segnalibro indietro per prendere la vocale a cui l’accento si riferisce. L’istruzione CarattereSinistra 2,1 sposta il punto di inserimento (e di conseguenza il segnalibro \Char) a sinistra rispetto la posizione corrente esattamente come avverrebbe se venisse premuto due volte il tasto freccia sinistra con lo shift premuto.
In dettaglio, il primo parametro indica lo spostamento indicato in numero di caratteri. mentre il secondo abilita l’attivazione della selezione; lo stesso discorso si applica anche all’istruzione CarattereDestra.
La riga contenente la if controlla se il carattere in esame è stato accentato. In tal caso le istruzioni successive provvedono a cancellare l’oramai inutile accento finale. Vi segnalo che vi sono alcune anomalie pratiche: la lingua italiana presenta paro le apostrofate che con questa macro diventano erroneamente accentate: è il caso della parola poco che si tronca in po’ e che la macro converte in pò.
Il listato 5 contiene questa macro.

Sostituzioni globali

La macro AccentoVerboEssere3Persona contenuta nel listato 4 esegue la sostituzione di un errore di battitura abbastanza comune: l’impiego della e accentata acuta (é) anziché grave (è).
Essa è estremamente semplice ed è stata creata utilizzando il registratore del le macro. L’aspetto che desidero evidenziare consiste nel fatto che bisogna cambiare prospettiva nel modo di programmare sfruttando al massimo le risorse che l’ambiente fornisce: lo scrivere una macro che operi sui segnalibro come quelle che abbiamo precedente mente visto sarebbe stato non appropriato ma soprattutto inutile.
Perciò, prima di buttarvi a capofitto nello scrivere una macro, pensate a come un semplice utente avrebbe tentato di risolvere il problema: questo vi porrà in un’ottica più consona.

Il vba di excel: alcuni concetti fondamentali

In Excel i concetti sono radicalmente differenti: esistono vari oggetti relazionati gerarchicamente fra loro, ed ognuno di essi ha caratteristiche proprie. Troviamo così la cella, il foglio, la cartella.
In realtà ne esistono molti altri, ma questi sono sufficienti a prendere contatto con il VBA. Da un’analisi di questo VBA emerge la concezione Object Oriented che è alla base dell’Excel: ogni suo oggetto definisce metodi e proprietà per essere gestito. Il metodo è assimilabile ad un comando che si impartisce all’oggetto, mentre la proprietà inerisce alle sue caratteristiche.
Sempre valutando il VBA di Excel, si notano delle strutture di controllo decisa mente più sofisticate di quelle presenti nel WordBasic. Fra le altre va citata l’istruzione For Each/Next che gestisce un loop su tutti gli oggetti contenuti in un altro; ad esempio, con una sola istruzione, si può chiedere al VBA di eseguire un ciclo su tutte le celle di una selezione.
Passiamo ora agli esempi che, a mio parare, rappresentano il sistema più semplice e veloce per apprendere.

Chiusura di tutti i workbook

La macro CloseAllWorkbooks espleta un compito semplicissimo: chiude tutte le cartelle (Workbook) aperte avvalendosi del ciclo For Each/Next. Per maggior precisione, è più corretto dire che questa macro accede ad ogni singolo Workbook e lo chiude. In essa sono presenti due oggetti: il Workbook ed il Workbooks.
Il Workbooks è un oggetto che contiene i Workbook.
Il concetto del loop è il seguente: mediante un’istruzione DIM si definisce una variabile che governa il loop il cui tipo deve essere quello gerarchicamente inferiore a quello specificato dopo la keyword In. Nel nostro caso la variabile è di tipo Workbook ed il loop viene eseguito su tutti gli oggetti contenuti in Workbooks, ovvero i Workbook.
In altre parole possiamo considerare Workbooks come un’entità che contiene tutti i Workbook e la variabile wb diventa il puntatore per accedere a loro sequenzialmente e l’istruzione

wb.close

non è altro che l’applicazione del metodo di nome Close al Workbook a cui wb sta puntando.
Il listato 1 mostra l’intera macro. Spero di essere stato abbastanza chiaro nello spiegare il concetto in quanto la gerarchia degli oggetti ed i metodi costituiscono i punti fondamentali nel VBA di Excel. Passiamo ad un altro esempio.

Conversioni di valori e formule

Sappiamo che un foglio Excel è composto da celle le quali contengono principalmente due tipi di oggetti: i valori e le formule.
Può capitare che il valore di una cella venga modificato sommandogli qualcos’ altro. Excel non consente di mettere un’espressione numerica in una cella contenente un valore in quanto i calcoli vengono eseguiti esclusivamente nel le celle contenenti le formule (quelle inizianti con l’uguale). Perciò è necessario eseguire la trasformazione del tipo di cella inserendo l’uguale come primo carattere. Dopo di che diventa possibile sommare i nuovi dati.
Questo tipo di operazione non presenta controindicazioni finché si tratta di somme. Ma può capi tare che per distrazione si commettano degli errori tragici: ad esempio, se ad una cella che contiene il valore 1000 + 1000 (ovvero è stato immesso il valore 1000, la cella è stata trasformata in funzione e le si è aggiunto un altro 1000) si decide di raddoppiarne il valore digitando il segno di moltiplicazione ed il 2, il risultato finale sarà errato.
Per risolvere questo tipo di problemi si possono utilizzare le macro DaValoreAFormula e DaFormulaAValore che sono riportate nei listati 2 e 3. Esse operano su una selezione.
La prima provvede a convertire il tipo di dato delle celle da valore a formula. La seconda svolge il compito opposto. Quindi, quando è necessario modificare i valori preesistenti di una cella si applica DaValoreAFormula; terminata l’operazione di modifica dei dati si può ripristinare il tipo mediante la seconda macro.
Se invece si vuole modificare il valore di una cella in base ad un determinato coefficiente, la macro ApplCoeff che appare nel listato 4 esegue questo lavoro.
Esaminiamole con maggiore precisione. La Macro DaFormulaAValore esegue un loop sulla selezione mediante il solito For Each/Next e la variabile di controllo è di tipo Range. Soffermiamoci a spiegare esattamente cos’è.
L’oggetto Range è costituito da una o più celle e potrebbe quindi apparire identico ad una Selection; Infatti non se ne disco sta molto, ma è comunque gerarchicamente inferiore a selezione in quanto l’Excel per mette di eseguire una serie di selezioni successive sulle quali agire in blocco; ogni selezione prende il nome di Range e la selezione nella sua globalità di Range costituisce l’oggetto Selection.
Facciamo un esempio: su un foglio selezionate le celle da B2 a D10 mediante un cick del mouse su B2 e relativo scorrimento fino alla cella D10: abbiamo costruito un Range. Selezionate ora le celle F3:H10 con lo stesso sistema: avete creato un altro Range mentre il precedente è perso. Se ora selezionate un’ altra serie di celle, ad esempio da B1 a H16, tenendo premuto il tasto CTRL, vedrete che il Range precedente non sparisce: potete quindi costruire più Range che apparterranno alla medesima Selection.
Il concetto del ciclo For Each/Next è identico in tutte e tre le macro e non merita per adesso di ulteriori approfondimenti, mentre la macro ApplCoeff introduce una nuova funzione: InputBox.
Esistono diversi sistemi affinché una macro acquisisca informazioni o parametri per operare, ma l’utilizzo di InputBox() è semplice e veloce. Essa consente di apri re una finestra con una richiesta per l’utente di immettere un valore. Suddetto valore viene acquisito come stringa e, se necessario, deve essere quindi trasformato in nu mero mediante la funzione VaI().
Al di là delle applicazioni pratiche che comunque sono reali, queste macro sono utili per capire alcuni aspetti del VBA, ovvero:

  • come immettere una formula in una cella;
  • come immettere un valore in una cella prelevandolo da un’altra cella;
  • come richiedere all’utente un valore.

introducono gli oggetti Selection e ed Range

Come indirizzare una cella

Sinora non abbiamo affrontato l’oggetto Cells che rappresenta la cella e che è uno dei più importanti. Esso necessita di due parametri: il numero di riga ed il numero di colonna e differisce quindi dallo stile classico Excel in cui una cella è identificata da una lettera e da un numero, ma ciò risulta enormemente più comodo quando si opera con indici numerici come accade nei loop.
Facciamo un esempio considerando che si debba far uso del sistema di indirizzamento classico A1, ovvero lettera e numero. La realizzazione di un loop che incrementi di i il valore delle celle dell’intervallo verticale B1:B10 è semplice in quanto è sufficiente sommare 1 al secondo indice dell’oggetto Cells.
Se l’intervallo fosse orizzontale, il problema si complicherebbe considerevolmente in quanto la cella successiva sarebbe identificata dalla lettera alfabeticamente seguente quella attuale: se la prima cella è B1, le successive sarebbero C1, D1, E1..., mentre se l’estensione del loop andasse oltre la colonna Z diverrebbe necessario gestire due lettere (AA1, AB1, AC1) complicando ulteriormente l’algoritmo.
Utilizzando il sistema di indirizzamento detto R1C1 (righe e colonne) il problema non si pone: ogni cella viene indirizzata con le sue coordinate aventi l’origine nella prima cella in alto a sinistra. La macro somma1 non fa altro che eseguire il loop sopra descritto. Sebbene non rivesta utilità pratica, ha il pregio di mostrare efficacemente come si indirizza una cella o come si possa modificarne il contenuto o anche semplicemente inserirvi un valore via macro operando con l’oggetto Cells. Essa è contenuta nel listato 6, mentre il listato 5 riporta due macro che sostituiscono con il giorno o il mese le date contenute nelle celle ricomprese dalla selezione.

Compilazione di un foglio via VBA

Un aspetto estremamente interessante del VBA nell’ Office Automation consiste nel la possibilità di scrivere una macro che crei e compili un foglio Excel esattamente come lo si farebbe manualmente. Sotto l’aspetto della programmazione non costituisce una novità in quanto si tratta di una macro più lunga delle altre e forse un po’ più complessa, ma per l’utente potrebbe divenire molto utile.
Per il programmatore, questa possibilità ha il pregio di poter fornire al committente un prodotto qualitativamente più professionale: immaginate se vi viene richiesta una macro che compili periodicamente un foglio, magari utilizzando i dati di altri fogli. Non è elegante prevedere una gestione manuale a carico dell’utente che lo obblighi a cancellare i vecchi dati per far posto ai nuovi; inoltre la possibilità che vengano commessi errori diventa considerevole.
Ma esiste anche l’aspetto negativo: codificare una macro che formatti tutto un foglio diverrebbe insostenibilmente gravoso. Da qui il semplice ma funzionale suggerimento di far un buon uso del registratore di macro: infatti, se lo si attiva e si costruisce il documento, verrà creata la relativa macro che potrà essere utilizzata su nuovi fogli che verranno di conseguenza formattati creando una copia di quello realizzato manualmente.

Conclusioni

Un aspetto che desideravo evidenziare era la sostanziale differenza che intercorre fra il Visual Basic per WinWord e quello per Excel: questo vi consentirà di fare le opportune valutazioni allorquando doveste pensare di iniziare a sviluppare software in uno di questi linguaggi o entrambi.
Gli aspetti negativi e quelli positivi vanno pesati e correlati per poter trarre una conclusione il più obbiettiva possibile. Il metro di giudizio più opportuno è valutarne l’efficienza relativa mente all’impiego per cui il VBA è nato e destinato. In quest’ottica non si può non esserne che soddisfatti, almeno in linea di principio.
Tralascio alcune piccole considerazioni inerenti gli strumenti tipici che vengono forniti agli sviluppatori quali il debugger in quanto esso è commisurabile solo alle presunte esigenze dell’utente medio ma sicuramente lontane dalle aspettative di un programmatore.
L’ultima considerazione verte sulla comprensibilità del messaggio d’errore del WordBasic: non sempre quella piccola finestra che si apre in mezzo al video segnalando un errore riesce ad essere di aiuto, né tantomeno l’help contestuale che la stessa finestra mette a disposizione. Tuttavia, come in ogni nuovo linguaggio, bi sogna fare la giusta esperienza che per mette di identificare con una certa rapidità dove si annida l’errore.
Per migliorare la comprensione del VBA potete richiamare la relativa guida in linea e confrontare quanto essa riporta in merito alle varie funzioni e concetti esposti in questo articolo. Buon lavoro!

Il testo e' stato acquisito tramite OCR dalla rivista su cui e' stato pubblicato e velocemente ricontrollato.
Le segnalazioni di errori saranno molto gradite e si possono fare alla pagina Contatti.

Tratto da:
Paolo Guccini
Rivista DEV Computer Programming
Edizioni Infomedia
1995