Appunti su Visual Basic for Application
Il problema
Tutti gli utenti di computer in ambiente Microsoft e non utilizzano per la produttività personale delle applicazioni di “office automation” per scrivere testi, elaborare fogli elettronici, presentazioni e altro.
Tutti però non usano le funzionalità avanzate del programma che conoscono. Ciò avviene per vari motivi alcuni dei più significativi sono:
1-Personalizzazione spinta dei documenti complessa e spesso non ben documentata:
2-Prerequisiti richiesti per la conoscenza e la costruzione di vere e proprie applicazioni custom in ambiente office sono la conoscenza del linguaggio di programmazione supportati dalla particolare applicazione;
3-La manipolazione di poche informazioni di qualsiasi tipo;
Per l’ambiente Microsoft Office indipendentemente dalla versione utilizzata il linguaggio di programmazione supportato è il “Visual Basic for Application” versione ridotta del linguaggio “Visual Basic” ben noto per la piattaforma Microsoft.
Attraverso questo codice è possibile creare macro ovvero veri e propri frammenti di codice Visual Basic che permettono di eseguire dei compiti personalizzati nel documento in cui vengono scritte.
Per imparare a scrivere le macro è necessario conoscere almeno in modo minimale i fondamenti per la programmazione strutturata e un minimo di conoscenza sulla programmazione ad oggetti,
Ambiente di sviluppo Visual Basic for Application
Per prima cosa occorre attivare la scheda Sviluppo nella barra multifunzione (questa procedura vale a partire dalla versione 2007 di Office e vale tutt’oggi).
Per visualizzare la scheda sviluppo devi, attivare il menù File scegliere Opzioni, nella finestra successiva “Personalizza barra multifunzione” e attivare la voce “Sviluppo come ti sto mostrando nell’immagine.
In questo modo la scheda “Sviluppo” sarà visualizzata nell’Applicazione Excel.
Per scrivere quindi una Macro che altro non è che un frammento di codice “Visual Basic”, L’ambiente di sviluppo di Visual Basic for Application si può attivare nel Menù Sviluppo voce Visual Basic r dell’applicazione in cui si lavora.
La colonna di sinistra visualizza il documento aperto sul quale opera la macro. Nel nostro caso parleremo in modo più approfondito di “Microsoft Exce”l. Laddove la colonna di sinistra non fosse visibile basterà attivare il menù Visualizza – Gestione Progetti.
E’ utile notare che il riquadro gestione progetti si divide nell’insieme dei documenti aperti nella applicazione e nelle relative proprietà degli stessi.
In particolare un file di Excel contiene una cartella di lavoro e tre fogli di lavoro. Ognuno di questi oggetti viene nominato in modo diverso nella gestione progetti di VBA.
Questo concetto è legato anche al fatto che nella strutturazione della cartella di lavoro “ThisWorkbook” (“Questa_cartealla” in italiano) contiene i tre fogli.
Come prima prova apriamo il codice relativo a foglio1 cliccando due volte su “Foglio1” e scriviamo:
Sub cambia_nome()
Foglio1.Name = “Bilancio”
End Sub
In questo caso questa semplice macro cambia il nome al foglio1. Abbiamo richiamato una proprietà dell’oggetto foglio di Excel e abbiamo rinominato mediante programma in “Bilancio”.
Da questa prima macro alcuni spunti:
Sub indica l’inizio di un programma con un nume assegnato dall’utente; End Sub termina il programma.
All’interno del costrutto Sub .. End Sub inseriamo le istruzioni di programma.
Complichiamo un po’ la macro e proviamo a chiedere all’utente il nome del foglio il codice da scrivere è:
Sub cambia_nome()
Foglio1.Name = InputBox(“Inserisci nome foglio”, “Avviso”, “digita un valore”)
End Sub
In questo caso viene chiesto all’utente mediante una finestra di dialogo e digitiamo il nome del foglio che vogliamo dare.
Abbiamo introdotto l’istruzione Inputbox che permette di richiedere tramite finestra di dialogo il nome del foglio e in generale un Input.
Se vogliamo inserire dei dati nel foglio1 basterà scrivere
Sub cambia_nome_inserisci()
Foglio1.Name = InputBox(“Inserisci il nome del foglio di lavoro”, “Richiesta dati”, “digita un valore”)
Cells(1, 1) = InputBox(“Inserisci il nome”, “Richiesta inserimento”, “Digita un valore..”)
Cells(1, 2) = InputBox(“Inserisci il cognome”, “Richiesta input”, “digita un valore..”)
Cells(1, 3) = InputBox(“Inserisci indirizzo”, “Richiesta input”, “digita un valore”)
End Sub
L’esecuzione di questa nuova macro
Non tiene conto dei formati opportuni che si devono definire. La proprietà cells intercetta la cella con coordinate riga colonna.
La forma corretta è:
Nome_foglio.Cells(Riga,Colonna)=valore
Si noti l’assenza del nome del foglio nella nostra macro possibile poiché stiamo operando nella macro all’interno della porzione di foglio1. Se invece scriviamo un modulo allora si dovrà citare anche il nome del foglio.
Impostare le proprietà di cella
Come è ovvio anche Cells è una collezione che ha delle proprietà.
La proprietà Numberformat permette di impostare il contenuto delle celle ai formati opportuni,
Ad esempio
Cells(1, 3).NumberFormat = “€ 0,00”
Questa istruzione aggiunta alla macro permette dalla cella C1 di impostare il formato Valuta Euro.
La proprietà per inserire testo deve essere:
Cells(1,1).NumberFormat = “ @”.
Gestione dell’Input e Output mediante finestra di dialogo
Abbiamo visto che per la gestione dell’input si possono utilizzare le finestre di dialogo nel che si richiama in VBA mediante l’istruzione
Input Box(“messaggio”, “titolo della finestra”, “valore predefinito” )
Ove titolo rappresenta il titolo da visualizzare nella finestra e valore predefinito il valore che sarà dato come input.
Per l’output si può utilizzare la Msgbox che ha una sintassi similare
Stringa=Msgbox(“messaggio”,tipo finestra,”titolo”)
dove stringa è un valore ove catturare l’output, tipo rappresenta il tipo di finestra di dialogo:
VbOkfinestra Ok, Annulla;
vbaboutfinestra OK.
Solo per citare alcuni esempi.
Vediamo come utilizzare la Message Box.
Sub cambia_nome_inserisci()
Dim stringa As String
Dim reddito As Double
Foglio1.Name = InputBox(“Inserisci il nome del foglio di lavoro”, “Richiesta dati”, “digita un valore”)
Cells(1, 1) = InputBox(“Inserisci il nome”, “Richiesta inserimento”, “Digita un valore..”)
Cells(1, 2) = InputBox(“Inserisci il cognome”, “Richiesta input”, “digita un valore..”)
Cells(1, 3) = InputBox(“Inserisci indirizzo”, “Richiesta input”, “digita un valore”)
reddito = CDbl(InputBox(“Inserisci il reddito”, “Richiesta input”, “0.0”))
Cells(1, 4).NumberFormat = “€ 0,00”
Cells(1, 4) = reddito
stringa = MsgBox(“Reddito e anagrafica”, vbabout, “messaggio”)
End Sub
Alcune note sul codice “CDbl” converte una stringa se possibile in un tipo “Double” un numero reale in precisione doppia.
Ecco il listato macro che permette di visualizzare dopo una serie di operazioni un messaggio.
Sub cambia_nome_inserisci()
Dim stringa As String
Dim reddito As Double
Dim n As Integer
n = CInt(InputBox(“Quante persone ?”, “Richiesta input”, “0”))
Dim k As Integer
Foglio1.Name = InputBox(“Inserisci il nome del foglio di lavoro”, “Richiesta dati”, “digita un valore”)
For k = 1 To n
Cells(k, 1) = InputBox(“Inserisci il nome”, “Richiesta inserimento”, “Digita un valore..”)
Cells(k, 2) = InputBox(“Inserisci il cognome”, “Richiesta input”, “digita un valore..”)
Cells(k, 3) = InputBox(“Inserisci indirizzo”, “Richiesta input”, “digita un valore”)
Foglio1.Cells(k, 3).ColumnWidth = 20
reddito = CDbl(InputBox(“Inserisci il reddito”, “Richiesta input”, “0.0”))
Cells(k, 4).NumberFormat = “€ 0,00”
Cells(k, 4) = reddito
Next k
stringa = MsgBox(“Reddito e anagrafica”, vbabout, “messaggio”)
End Sub
In questa nuova Macro è stato implementato un ciclo iterativo “For .. Next” per ripetere l’operazione un numero di volte pari a “n” variabile in Input al problema. E’ stato introdotto il metodo ColumnWidth = valore numerico, per impostare la larghezza a livello di singola colonna.
Salvataggio con nome della cartella via macro
Per salvare una cartella di lavoro basterà nella macro aggiungere
ThisWorkbook.SaveAs (“es.xls”)