(pubblicato il 12 gennaio 2003)

Visual Basic for Application
(tratto dal sito: http://ennius.interfree.it/indice.htm  )

http://www.softwareplanet.net/php/mostraLezione.php?idl=17&parte=5

Significato del Visual Basic per applicazioni (VBA)

Fin dalla versione 5.0 di Excel la Microsoft ha introdotto il Visual Basic for Application – in sigla, VBA - inaugurando una strategia unificante, all'insegna del linguaggio di programmazione Visual Basic. Il Visual Basic peculiare di Excel ha soppiantato il precedente sistema di macrofunzioni (rimaste tuttora in vita, per compatibilità) e, successivamente è stato esteso agli altri membri della famiglia MS Office (Word, Access ecc.).

Ma che cos'è un Visual Basic per applicazioni? Esiste una certa confusione al riguardo, persino fra i programmatori di professione, per cui vanno subito fatte due puntualizzioni:

a)    non si tratta di un'estensione del linguaggio "padre", il Visual Basic standard, bensì di un'evoluzione del sistema di macro tradizionalmente associata ai fogli elettronici;

b)    di conseguenza, pur aderendo da vicino alla sintassi Visual Basic stadard, una routine VBA si esegue soprattutto, anche se non esclusivamente, nell'ambiente del package Excel (dalla versione 5.0 in avanti);

c)    grazie ad un avanzato "protocollo" Microsoft, l'OLE Automation, si danno però interessanti possibilità di cooperazione, in una logica Client/Server fra i vari membri del mondo Visual Basic.

Le opzioni avanzate offerte dall'OLE Automation implicano la possibilità di richiamare funzionalità di un pacchetto da parte di un programma scritto sia in Visual Basic standard sia in uno qualunque degli altri "dialetti" VBA. Per fare due esempi concreti, con OLE automation è possibile:

·     in un programma Visual Basic 5.0 o 6.0 sfruttare la libreria di funzioni finanziarie di Excel sia direttamente che tramite fogli elettronici (creati anche estemporaneamente);

·     da una macro Excel gestire documenti Word (o presentazioni PowerPoint).

In queste note introduttive al vasto mondo VBA non arriveremo a parlare di tali prospettive avanzate, tuttavia l'averne accennato è importante, se non altro per mettere in evidenza l'importanza del VBA:

Il Visual Basic per applicazioni è lo strumento principe per la creazione di veri e propri applicativi di OFFICE AUTOMATION, sulla base della più diffusa famiglia di pacchetti specifici, Microsoft Office.

Cosa è una MACRO

La MACRO è un' istruzione scritta in linguaggio Visual Basic che Excel usa per compiere determinate azioni descritte nell'istruzione stessa. L'insieme delle istruzioni si definisce CODICE. Il Codice è compilabile, cioè possiamo scriverlo, aggiungerlo, modificarlo come si farebbe con qualunque testo, solo che è necessario usare una forma di scrittura che Excel sia in grado di comprendere : il suo linguaggio, il Visual basic for Application. Excel stesso è in grado di compilare una Macro, cioè del codice : basta usare il "Registratore di Macro". (vedi sezione "Cosa è il VBA"). Quello che segue è un piccolo esempio di codice( o macro. Da notare: ogni macro ha bisogno di un nome che la identifichi. NON si può usare lo stesso nome 2 volte):

Macro di esempio (o codice)

Significato delle istruzioni

Sub Prova()
    Range("A3").ClearContents
    Range("A3").Formula = "=10*RAND()"
End Sub

Nome della macro(Prova) (e inizio istruzioni)

Pulisci la cella A3 dal contenuto

Nella cella A3 genera un numero casuale

Fine istruzioni (esce dalla macro)

La stessa istruzione poteva essere svolta da una funzione : CASUALE() da scriversi nella cella A3. Es.: =CASUALE()*10 (avrebbe generato un numero casuale compreso tra 0 e 10), però:

Considerazioni

Excel possiede quindi DUE possibilità di eseguire istruzioni:

  1. la prima, e più immediata, è l'immissione di comandi attraverso le FORMULE o le FUNZIONI, che devono essere inserite sul foglio di lavoro, scritte nelle celle interessate, e che quindi possiamo definire "RESIDENTI", agiscono cioè sempre e comunque (errori a parte). NON possono essere attivate su comando, e molto spesso, ci costringono ad usare altre celle per scambi di istruzioni e non basta, pena il famoso messaggio "Impossibile calcolare la formula, riferimento circolare", o si verificano solo ad apertura Foglio.

  2. la seconda, è la creazione di codice che esegua, su COMANDO, un'istruzione di qualunque genere, compreso ovviamente formule o funzioni, ma attivabili  nel momento in cui eseguiamo il comando. In questo caso avremo un'istruzione NON RESIDENTE, che ci consente una migliore gestibilità del nostro lavoro, e la ripetitività agendo di nuovo sul comando. Resta inoltre la versatilità di un linguaggio (codice) capace di impostare istruzioni che con le formule o le funzioni non è possibile eseguire (per esempio i cicli For ...Next, o altre amenità del genere).

Il consiglio che vivamente suggerisco, è quello, per colui che voglia avventurarsi nel mondo del "CODICE", di munirsi di libri specifici sull'argomento, oltre a quello di dare sempre un "occhiata"  alla guida in linea, raggiungibile dalla pagina dell'editor di visual basic, premendo il tasto F1. (la guida è diversa se si preme F1 in visualizzazione Foglio di lavoro)

Editor di Visual Basic

Raggiungere l'Editor di Visual Basic o Visual basic Editor (secondo le versioni di Excel) è semplice, dal Menù Strumenti/macro/visual basic editor (vedi immagine sotto), oppure premendo i tasti ALT + F11.

Con l'editor aperto dovreste avere una pagina come l'immagine sottostante

In questa pagina, oltre al menù, troviamo tre finestre :

Private Sub Worksheet_Change(ByVal Target As Range) '(Nome e inizio della Macro o Routine )

      in questo spazio va inserito il codice

End Sub  (Fine della macro e uscita)

Quando non vogliamo usare un EVENTO abbinato ad un foglio per attivare una macro, perchè vogliamo decidere noi quando attivarlo, potremo usare un MODULO e scrivere il codice nel modulo, dando un nome alla routine (macro) per poi associarla ad un pulsante usando il nome assegnato in precedenza (vedi: Associazione Macro). L'inserimento di un Modulo è semplicissima: dal menù scegliamo Inserisci/Modulo (vedi immagine sottostante).

Nella finestra degli oggetti, apparirà il simbolo di una cartella con il nome "Moduli". DoppioClick sulla cartella e si aprirà mostrando il contenuto: "Modulo1", "Modulo2", e così via. Va precisato che in un modulo, si possono inserire più macro, non occorre quindi creare un modulo per ogni macro; queste infatti saranno riconosciute dal nome assegnato, non dalla residenza in un modulo piuttosto che un altro. Attenzione a non affollare comunque troppo il modulo (quando il modulo viene letto per cercare la macro richiesta, vengono lette comunque tutte le macro presenti nel modulo stesso). La finestra che si aprirà sulla destra conterrà, nei sotto menù in alto, solo "GENERALE" e "DICHIARAZIONI", zona che servirà ad assegnare variabili utilizzabili in tutte le macro presenti nel Modulo. L'inserimento della macro è semplice, basta scrivere il nome che vogliamo, preceduto da Sub e seguito da () parentesi aperta e chiusa, e alla fine del codice, scrivere "End Sub". Esempio.

Sub Ciccio()

      in questa zona scrivere le istruzioni

End Sub

Un altro modo di inserire il codice lo vedremo nella sezione "Casella degli strumenti" ora detta "Strumenti di controllo", anche se è simile al precedente.

Associazione Macro

Una volta creata una macro inserita in un Modulo, dobbiamo poterla attivare alla bisogna. Potremo usare uno dei seguenti metodi:

L'inconveniente legato a questi metodi è palese: bisogna ripetere l'operazione tutte le volte che vogliamo attivare una macro nel primo caso, mentre con l'assegnazione di "tasti di scelta rapida" bisognerà ricordarsi, in caso di più macro presenti, quale è la lettera giusta per una determinata macro. La soluzione che consiglio è quella di crearsi un pulsante (ottenibile comunque dall'inserimento sul foglio degli "strumenti di controllo" (vedi foto sopra), usando invece la modalità "disegno". Se Clicchiamo sulla barra degli strumenti, sull'icona "Disegno" (vedi foto sottostante) indicata con la freccia  del mouse (parte alta a destra), apparirà sul piede del foglio (freccia rossa) gli oggetti utilizzabili con questa modalità: le Word Art.

e spostando il cursore del mouse in un punto qualsiasi del foglio, e tenendo premuto il pulsante del mouse, disegnare un rettangolo di cui potremo variare le dimensioni a piacere. Cliccando sul bordo del rettangolo col pulsante destro del mouse, apparirà un menù contestuale, dal quale, col sinistro del mouse, sceglieremo "ASSEGNA MACRO", si aprirà una finestra con le macro presenti e selezioneremo la prescelta dando OK. In questo modo avremo creato un comodo avvio per la nostra macro, che potremo attivare quando lo vorremo, infatti quando andremo col mouse sul pulsante associato, il cursore assumerà la forma di una mano, cliccheremo e la macro scatterà.

Per completare l'opera, tornando sul bordo del pulsante, in basso a destra, col destro del mouse, potremo scegliere "Aggiungi testo" e dare un nome per identificare a quale macro è associata, e da "Formato forme" per il "rettangolo" o da "formato casella di testo" per quest'ultima, potremo scegliere il colore di fondo, per evidenziare il pulsante.

Casella degli strumenti

Una caratteristica di molti linguaggi di programmazione, e il VBA è uno di questi, è la "programmazione ad oggetti". Per oggetti si intendono quelli strumenti che facilitano o migliorano la gestione del foglio di lavoro e dei dati in esso contenuti, attraverso l'inserimento dell'oggetto stesso sul foglio di lavoro: sono oggetti : commandbutton, casella combinata, casella di testo, option button, una form,ecc. Ogni oggetto possiede delle  proprietà,  dei  metodi,  e degli  eventi . Le proprietà sono le caratteristiche che l'oggetto possiede e che possono essere modificate nelle impostazioni.  Ogni oggetto ha le sue proprie proprietà, non necessariamente comuni ad altri oggetti. Per usare gli oggetti,una volta inseriti in un foglio, dovremo lavorare in "modalità progettazione" (si attiva automaticamente quando inseriamo l'oggetto, o si richiama cliccando sull'icona "squadra" nella casella degli strumenti); in questa modalità, con un doppio click sull'oggetto, entreremo nell'editor di visual basic che ci mostrerà nella finestra inferiore a sinistra, le proprietà dell'oggetto stesso. Sulla pagina destra troveremo invece la zona dove inserire eventuali istruzioni da far eseguire scegliendo un evento dell'oggetto stesso. Per esempio, usando un commandbotton, potremo sfruttare l'evento click, selezionandolo dalla finestrina in alto a destra, e ciò che vedremo sarà così:

Private Sub CommandButton1_Click()
    qui inseriremo l'istruzione (macro)
End Sub

continuando: l'oggetto "CommandButton" o "pulsante di comando",  ha la  proprietà  "Caption" impostata a  "CommanButton1" (la proprietà Caption è la scritta che vediamo sul pulsante) Possiamo modificare l'impostazione, scrivendo nel relativo campo delle proprietà,  le parole che ci ricordano cosa avviene premendo il pulsante, per esempio "Aggiungi Dati". Ora, quando vedremo il pulsante, ci troveremo scritto "Aggiungi Dati". Il  metodo è l'azione che l'oggetto "può" compiere e l' evento è l'azione che attiva il metodo.

Vi consiglio di consultare la guida in linea, attivabile anche con F1, per familiarizzarsi con questi concetti.

Vediamo, passo passo, come lavorare con questi strumenti: dal Menù Visualizza/Barre degli strumenti, selezionare la voce "Strumenti di Controllo" (o "Casella degli Strumenti" per le versioni più vecchie di Excel). vedi immagine sotto.

Apparirà una piccola finestra come quella nelle foto sotto: è la finestra degli strumenti: passando il mouse sulle icone, appare la descrizione dell'oggetto. Nella foto sotto, a destra, è evidenziata l'icona della "Modalità Progettazione". questa modalità dovrà essere selezionata ogni qualvolta vorremo intervenire sulle proprietà dell'oggetto che avremo inserito sul foglio di lavoro. (la "Modalità Progettazione si attiva in automatico allorchè, selezionando un oggetto, lo "incolleremo" sul foglio di lavoro).

Vediamo ora un esempio di come inserire e dialogare con un oggetto: la casella combinata. Nella  "Finestra degli oggetti", clicchiamo sull'icona "Casella Combinata", spostiamoci  col mouse sul foglio di lavoro e in corrispondenza della zona che avremo scelto per ospitare l'oggetto, clicchiamo col sinistro del mouse e trasciniamo: apparirà l'oggetto che potremo dimensionare a piacere agendo sui punti di selezione (i circoletti). In questa fase saremo già in "Modalità progettazione". Foto sotto: la casella combinata

Ora dovremo passare alla visualizzazione delle proprietà dell'oggetto per inserire le istruzioni che faranno al caso nostro: il reperimento di una colonna di dati e la casella di destinazione dove vorremo che il dato prescelto nella casella stessa, appaia. Doppio click sull'oggetto casella combinata, e si aprirà l'editor di visual basic. Vedi foto sotto a sinistra. Nella zona inferiore sinistra di questa foto vediamo la finestra delle proprietà relative al "ComboBox1", nome inglese della "casella combinata". Il N° 1 viene aggiunto dal codice per identificare che questa è la casella combinata prima inserita, e, poichè ne potremo inserire altre, ad ognuna verrà assegnato un numero di identificazione progressivo.Nella foto sotto a destra vediamo invece le proprietà che invece ci interessano da vicino: "LinkedCell" e "ListFillRange".  La prima identifica la cella che vorremo indicare per riportare i dati che selezioneremo sul foglio di lavoro nella casella combinata, la seconda indica la zona dove la casella combinata andrà a trovare i dati che la stessa ci mostrerà sul foglio di lavoro. Nell'esempio che trattiamo, la lista dei nomi da cercare si troverà nella colonna A, dalla riga 1 alla 8. Per il momento trascuriamo di illustrare le altre proprietà che saranno consultabili attraverso la guida in linea.

Ritorniamo sul foglio di lavoro, clicchiamo sull'icona della "squadra" che identifica la "Modalità progettazione" per uscire da questa modalità, e ciò che vedremo sarà quello illustrato nella foto sotto:

Nella casella combinata ora appare un elenco di nomi (quello che avevamo collegato con "ListFillRange") , con un click su un nome, vedremo la cella C1 (quella collegata con "LinkedCell") riempirsi del nome selezionato. Soprassiedo per il momento a ciò che avremmo potuto fare sfruttando i metodi  e gli  eventi .

Un ultimo accorgimento: poichè la finestra degli strumenti resterebbe "a spasso" per il foglio di lavoro, si può chiuderla usando la famosa "X",  ma meglio se si inserisce, così l'avremo sempre a portata di mano, in alto, sotto i menù, cercando uno spazio tra le finestra già inserite. E' sufficiente trascinare la finestra dgli strumenti con il mouse, e rilasciare quando gli avremo trovato la giusta collocazione. Vedi foto sotto:

La sintassi del VBA

(tratto dal sito http://www.softwareplanet.net/php/mostraCorso.php?nomeCorso=VisualBasic)


Le variabili
Anche Visual Basic, come tutti i linguaggi di programmazione, prevede l'uso delle variabili.
Una variabile è un luogo di memorizzazione temporanea per i dati del programma a cui esso può accedere grazie a un nome assegnato in fase di creazione.
Si possono utilizzare più variabili all’interno del codice ed esse possono contenere diversi tipi di dati quali numeri, lettere, date o addirittura oggetti.
Solitamente prima di utilizzare una variabile occorrerebbe crearla; questa prassi è obbligatoria in quasi tutti i linguaggi, mentre Visual Basic, essendo poco “pignolo” ci permette anche di non farlo.
Il consiglio è comunque quello di impostare una maggiore rigidità per avere più controllo in fase di compilazione e quindi evitare errori di distrazione: abilitando la voce “Dichiarazione di variabili obbligatoria” nel menù Strumenti, Opzioni.

Dichiarazione di una variabile
Per dichiarare una variabile occorre utilizzare l’istruzione Dim, che presenta la seguente sintassi:

Dim <nome> [As <tipo>]
in cui <nome> rappresenta il nome da assegnare alla variabile e <tipo> rappresenta il tipo di dato che la variabile conterrà.
Non è obbligatorio specificare un tipo di dato, ma è consigliabile farlo per ottimizzare l’impiego delle risorse.

Esempio:
Dim Importo as Integer

Regole di assegnazione del nome di una variabile
Il nome di una variabile deve essere costituito da una sequenza di caratteri alfabetici o numerici nel rispetto delle seguenti regole:
- deve iniziare sempre con una lettera
- non può contenere spazi
- può contenere al massimo 256 carattere
- non deve essere una parola chiave, il nome di una proprietà o di un oggetto di Visual Basic
- può contenere il carattere _ (underscore)
- non vi è differenza tra maiuscole e minuscole (la variabile Somma è anche SOMMA)

Esempi di nomi corretti: Somma_Num, Stringa1, TOTALE
Esempi di nomi errati: 1Totale, Data Pagamento, Print, You&Me, _Totale

Tipi di dato in Visual Basic
Abbiamo detto che è consigliabile, anche se non obbligatorio dare un'indicazione del tipo di dato da creare. Visual Basic prevede numerosi tipi standard.
I più utilizzati sono:
- byte  tipo numerico intero senza segno compreso nell’intervallo da 0 a 255
integer usato per rappresentare numeri interi (con segno) compresi fra -32768 a 32767
- string che può contenere delle sequenze di caratteri (stringhe) a lunghezza variabile oppure a lunghezza fissa
- long  per numeri interi compresi fra -2,147,483,648 e 2,147,483,647,
- single e double, con cui è possibile memorizzare numeri reali a singola o a doppia precisione
- boolean, tipo logico che può assumere il valore TRUE o FALSE (vero o falso)
- date, in cui è possibile memorizzare  data e ora
- variant, tipo universale che può contenere dei dati di qualsiasi formato

Se una variabile non è dichiarata, la sua creazione avviene la prima volta in cui si fa riferimento ad essa.
In assenza di dichiarazione (dichiarazione implicita) oppure in caso di dichiarazione senza la specifica del tipo, Visual Basic considera il tipo di dato della variabile come Variant (con conseguente spreco di risorse), a meno che si utilizzi un carattere identificatore di tipo alla fine del nome della variabile.
I principali identificatori di tipo sono i seguenti:

$  per String
% per tipo di dato Integer
 & per tipo di dato Long
 !  per tipo di dato Sigle,
 
#  per tipo di dato Double

Ad esempio, è possibile creare una variabile di tipo numerico intero ed assegnarle un valore  scrivendo le due seguenti istruzioni
Dim Importo as Integer
Importo = 1000
oppure con la sola dichiarazione implicita
Importo% = 1000

Assegnazione di un valore ad una variabile

Per assegnare un determinato valore ad una variabile, occorre utilizzare l’operatore =, lo stesso che abbiamo utilizzato per cambiare i valori delle proprietà delle form e dei controlli.
 

Dim MyVar as string
MyVar=“Ciao”


I moduli
I moduli standard (o moduli di codice) sono componenti del progetto che contengono del codice puro (vengono memorizzati su disco con estensione .BAS), ovvero non contengono parti grafiche e possono contenere dichiarazioni di variabili, procedure e funzioni. Solitamente vengono utilizzati per contenere le funzioni  e le variabili comuni a tutte le finestre, un sorta di “libreria” per intenderci.

Il modulo ha una proprietà Name, inputabile dalla solita finestra delle proprietà. Con tale nome il modulo verrà visualizzato, insieme alle Form, nella finestra del progetto. 

Variabili pubbliche all’interno di un modulo
Se abbiamo bisogno di una variabile che mantenga il valore (ossia non “muoia” al termine di un evento) e sia visibile all’interno di tutto il progetto occorrerà dichiararla nella parte più alta della finestra del codice del modulo ovvero prima di tutte le procedure di evento.

Dim Importo as long

Private Sub UserForm_Click()
Private Sub …
….
End Sub

Private Sub UserForm_Initialize()
Private Sub …
….
End Sub


Se vogliamo che questa variabile sia utilizzata anche da altre Form, occorre dichiararla, nella stessa posizione, utilizzando la parola chiave Public.
In questo modo, le altre finestre, per fare riferimento ad essa devono far precedere il nome della finestra a quello della variabile (separato da un punto), perché la variabile appartiene alla finestra ed esiste solo se la finestra è caricata in  memoria.
Ad esempio, per utilizzare la variabile pubblica Importo della finestra FrmInvoice dalla finestra FrmCustomer, occorre utilizzare la seguente sintassi:
TxSomma = FrmInvoice.Importo

Variabili globali
Quando si presenta la necessità di fare in modo che un valore sia accessibile da tutte le procedure presenti nell'applicazione, indipendentemente dal form in cui esse si trovano, e che questa variabile non appartenga a nessuna Form in particolare, è necessario utilizzare per la dichiarazione la parola chiave Global.
Una variabile dichiarata in questo modo è detta globale. La sua dichiarazione non può essere fatta all'interno di un form (proprio perché deve essere indipendente da ognuno di essi), ma  deve essere effettuata in un modulo.
E’ molto semplice, basta utilizzare la parola chiave Global (va bene anche Public) anziché Dim e mettere l’istruzione all’interno di un modulo.
Esempio di dichiarazione di una variabile globale all’interno di un modulo:
Global Autore as String

La InputBox
Per far immettere all’utente dei valori, si possono utilizzare le caselle di testo all’interno di una finestra, oppure si può utilizzare una funzione (ossia un’istruzione che restituisce un risultato) che ci mette a disposizione Visual Basic: la InputBox.
E’ molto simile alla MsgBox (ricordate ??), apre una piccola finestrina con un messaggio, con la differenza che dà la possibilità di inserire del testo. Possiamo specificare la frase da visualizzare ed il titolo elencandoli tra parentesi e virgolette.
Essa ci restituisce poi un risultato che possiamo memorizzare in una variabile.
Questo esempio memorizza nella variabile Frase ciò che l’utente ha digitato nella finestrina avente il titolo “Prova” a destra della dicitura “Inserisci una frase”:

Frase = InputBox( “Inserisci una frase”, “Prova”)

Se l’utente digita “Ciao” la variabile Frase conterrà “Ciao”.

Applicazione di esempio
Il listato di codice che segue rappresenta un piccolo progetto che all’attivazione del foglio contenete questa procedura evento richiede un nome di autore e lo visualizza

Private Sub Worksheet_Activate()
    Dim Autore As String
    Autore = InputBox("Inserire il nome dell'autore del progetto", "Attenzione")
    MsgBox Autore
End Sub

Prima di passare ad esaminare le strutture di controllo, è opportuno conoscere gli operatori che si possono utilizzare per formulare espressioni o condizioni.

Gli Operatori

Gli operatori matematici
Primi tra tutti sono gli operatori matematici. Le quattro operazioni fondamentali esistono, naturalmente, con la sola differenza che il simbolo di moltiplicazione è * e quello di divisione è / (in generale come in tutti i linguaggi di programmazione).
Esistono inoltre altri tre operatori che permettono di determinare la parte intera o il resto di una divisione e per elevare un numero a potenza.
Tutte le altre funzioni matematiche (radice quadrata, funzioni trigonometriche, ecc..) esistono in VB ma non sono operatori, bensì funzioni appartenenti ad una libreria.

+     Somma              Somma i valori
-     Sottrazione        Sottrae i valori
*     Moltiplicazione    Moltiplica i valori
/     Divisione          Divide i valori
      Divisione intera   Determina la parte intera di una divisione
^     Esponente          Eleva un valore ad una potenza
MOD   Modulo             Determina il resto di una divisione


Esempi:
5 + 8 = 13, 12 - 4 = 8, 3 * 6 = 18, 10 / 3 = 3,33.., 10 3 = 3,
        2 ^ 3 = 8, 10 MOD 3 = 1
Esempi in VB: Importo = Numero1 + Numero2, Importo = Num1 * Num2,
              Quadrato = Num ^ 2, Resto = Num1 MOD Num2


Operatori di relazione (o confronto)
Gli operatori di relazione sono indispensabili per confrontare dei valori numerici (e non) e quindi per esprimere delle condizioni, e sono:
=     Uguale
>     Maggiore
>=    Maggiore uguale
<     Minore
<=    Minore uguale
<>    Diverso
Esempi:  Numero1 <> Numero2, Importo1 < = Importo2

Gli operatori logici
Gli operatori logici permettono di concatenare tra loro più condizioni e quindi di creare condizioni composte (ricordate?! le condizioni le abbiamo già viste nella struttura di controllo o IF.. che approfondiremo nuovamente la prossima lezione)

AND 
la condizione è vera se entrambe le condizioni si verificano; è falsa se una od entrambe le condizioni non si verificano
Esempio: Espressione1 AND Espressione2, dà risultato TRUE solo nel caso in cui entrambe le espressioni diano come risultato TRUE (cioè siano vere)
TRUE and TRUE  = TRUE
TRUE and FALSE  = FALSE
FALSE and FALSE  = FALSE
FALSE and TRUE  = FALSE

NOT
è utilizzato per eseguire una negazione logica di un’espressione, cioè per esprimere una condizione al contrario.
not TRUE  = FALSE
not FALSE  = TRUE

OR
La condizione è vera al verificarsi di una od entrambe le condizioni, ad esempio:
Espressione1 OR Espressione2, dà risultato TRUE nel caso in cui almeno una delle espressioni sia vera.
TRUE or TRUE  = TRUE
TRUE or FALSE  = TRUE
FALSE or FALSE  = FALSE
FALSE or TRUE  = TRUE
In realtà esistono altri tre operatori logici meno utilizzati: Xor, Eqv, Imp, derivabili dai precedenti.

Ordine delle operazioni
In un’espressione del tipo:
Totale= Totale + Prezzo * Quantita,
quali sono le operazioni eseguite prima? In generale questo è un problema che incontriamo anche in matematica ed è per questo motivo che a volte occorre fare uso delle parentesi.

L’ordine in cui le considera Visual Basic è il seguente:
- esponente
- moltiplicazione, divisione, divisione intera, modulo
- addizione e sottrazione
- operatori di confronto (valutati da sinistra a destra)
- operatori logici (nell’ordine NOT, AND, OR)

Per modificare l’ordine delle operazioni occorre utilizzare le parentesi tonde (le quadre e le graffe, utilizzate nelle espressioni matematiche, non possono essere utilizzate).

STRUTTURE DI CONTROLLO

Avevamo già anticipato nella lezione 9 cosa sono le strutture di controllo ed in particolare avevamo visto la struttura di controllo IF.
La struttura decisionale o di controllo (o costrutto) è un elemento del linguaggio che permette di controllare il flusso delle istruzioni. Le istruzioni, in  Visual Basic vengono eseguite se si verifica un certo evento, e,  all’interno della procedura di evento, le istruzioni vengono eseguite una dopo l’altra a meno che si faccia uso di questi strumenti.
Le strutture quindi modificano la sequenza delle istruzioni eseguite in base al verificarsi di un certa condizione oppure permettono di ripetere un certo numero di istruzioni.

La struttura decisionale IF
Il costrutto IF permette di eseguire una o più istruzioni  in seguito al verificarsi di una condizione.

If <condizione1> Then
   <istruzioni da eseguire se la condizione è vera
>
[ElseIf <Condizione2> Then
   <istruzioni da eseguire se la condizione è vera
>
...
[Else
   <istruzioni da eseguire se la condizione è falsa
>]
End
If

La condizione può essere rappresentata da una espressione logica, cioè un’espressione che dà come risultato vero o falso. Se essa è verificata viene eseguito il blocco di istruzioni indicato fra le parole chiave Then e Else. In caso contrario, è eseguito il secondo gruppo di istruzioni. Si noti che quest'ultimo può anche essere assente. In tal caso, la parola chiave Else non va utilizzata e non è eseguito alcun codice in caso di mancata verifica della condizione.
La frase End If delimita la struttura.

Esempio
Per visualizzare un messaggio diverso a seconda che un saldo sia positivo o negativo:

Private Sub CmdVediSaldo_Click()
  IF Saldo > 0 then
     MsgBox “Saldo positivo”
  else
     MsgBox “Saldo negativo”
  End If
End Sub


La struttura iterativa FOR .... NEXT:

Il costrutto FOR .. NEXT consente di ripetere un gruppo di istruzioni per il numero di volte specificato.

For contatore = inizio To fine [Step incremento]
    [istruzioni]
   [Exit
For]
    [istruzioni]
Next [contatore]

Quando ci può servire un ciclo di questo tipo? Quando dobbiamo ripetere un certo numero di volte una stessa istruzione. Per definizione, nel costrutto FOR, dobbiamo utilizzare una variabile numerica intera (denominata contatore) che si incrementa ad ogni esecuzione del ciclo. Il contatore parte dal valore indicato dopo il simbolo = fino ad arrivare ad un valore massimo indicato dopo la parola chiave TO.
L’incremento solitamente è 1, se  serve un passo diverso (ad esempio 2) occorre aggiungere STEP 2 dopo il numero massimo.
La fine del ciclo è identificata dalla parola chiave NEXT, immediatamente dopo si può indicare anche il nome della variabile contatore. Non è necessario, anche se solitamente è bene metterlo se si usano cicli FOR annidati (Suggerimento: nelle sintassi dei linguaggi solitamente la parentesi quadra indica parti opzionali!!).
Esempio: il seguente ciclo visualizza i primi dieci numeri. E’ stata dichiarata una variabile che fa da contatore partendo dal numero 1 fino al numero 10

Dim Conta as integer
    For Conta=0 to 10
        Msgbox Str(Conta)
    Next Conta


Esempio: calcolo del fattoriale di un numero N inserito dall’utente.
Per definizione il fattoriale (si indica con il simbolo !) di un numero N è uguale a 1* 2 * 3 * …. * N, in formule:
N! = 1* 2 * 3 * …. * N
I passi seguiti sono:
- richiesta del numero all’utente attraverso la funzione InputBox (vista nella lezione 11), memorizzato poi nella variabile N.
- dichiarazione di una variabile contatore I (perché il fattoriale per definizione fa N moltiplicazioni, dunque il nostro ciclo dovrà dunque essere ripetuto N volte).
- dichiarazione di una variabile Fattoriale, atta a contenere il risultato finale e parziale di ogni moltiplicazione; notare che occorre inizializzarla a 1 in quanto è l’elemento neutro della moltiplicazione.

Private Sub CmdFatt_Click()
Dim N As Integer
Dim I As Integer
Dim Fattoriale As Long

  Fattoriale = 1
  N = InputBox("Inserisci il numero:", "Calcolo del fattoriale")
   For I = 1 To N
       Fattoriale = Fattoriale * I
   Next I
  
   MsgBox "Il fattoriale di " & Str(N) & " é " & Str(Fattoriale)
End Sub

La prossima volta vedremo un altro costrutto che permette di eseguire dei cicli. Per il momento ci accontentiamo di assimilare il FOR e terminiamo la lezione introducendo un’altra struttura di controllo meno utilizzata.

L’istruzione Go To

Passa incondizionatamente a una riga specifica all'interno di una procedura (ma non al di fuori di essa) ed identificata da un’etichetta.
Per definire un ‘etichetta è sufficiente darle un nome (seguito dai : )  e posizionarla nel punto desiderato.

GoTo etichetta

Esempio:

Private Sub CmdSaluta_Click()
 Msgbox “Adesso vi saluto”
 GoTo SALUTA



SALUTA:
  Msgbox “Ciao a tutti”
End Sub


Suggerimento: la presenza di troppe istruzioni GoTo può rendere difficile la lettura del codice. Quando possibile, è consigliabile utilizzare istruzioni di controllo strutturate (Do...Loop, For...Next, If...Then...Else, Select Case)

Terminiamo oggi la parte relativa alle strutture di controllo introducendo gli ultimi due costrutti.

La struttura iterativa  Do While.. Loop e Do Until .. Loop

La struttura Do...Loop consente di eseguire un blocco di istruzioni per un numero di volte imprecisato (contrariamente al FOR).  L'istruzione Do...Loop valuta una condizione che consente di determinare se continuare o meno l'esecuzione. Come per la struttura If...Then, la condizione deve essere rappresentata da un valore o da un'espressione che risulti Vera o Falsa. La parola chiave DO identifica l’inizio del ciclo, mentre LOOP indica la fine.
Esistono 4 varianti del ciclo Do…Loop; le prime due sono determinate dalla differenza tra While ed Until.
In presenza di un While un ciclo viene eseguito fino a che la condizione risulta Vera; non appena la condizione diventa falsa, il ciclo viene interrotto.

Viceversa l’Until viene eseguito finchè la condizione non è verificata ed è interrotto non appena diventa Vera.
E‘ possibile diversificare ulteriormente il ciclo Do..Loop mettendo la condizione all’inizio (dopo il DO) oppure alla fine, dopo la parola chiave LOOP, la differenza sostanziale è che, mettendo la condizione alla fine, il ciclo viene eseguito sicuramente almeno una volta anche se la condizione di partenza non è Vera.
Abbiamo dunque ottenute le seguenti combinazioni:
 

Do While condizione    
  <istruzioni>           
Loop                    

Do Until condizione    
 <istruzioni>            
Loop                    
Do
<istruzioni>
Loop While condizione

Do
<istruzioni>
Loop Until condizione

 

Esempio:
stampiamo CIAO finchè l’utente non risponde NO alla domanda “Vuoi stampare?” nei quattro possibili casi:
Private Sub CmdStampa_Click()
  Do While (MsgBox("Vuoi stampare?", vbYesNo) = vbYes)
     Print "CIAO"
  Loop
End Sub

Lo stesso risultato si ottiene utilizzando il DO UNTIL e quindi negando la condizione precedente

Do Until (MsgBox("Vuoi stampare?", vbYesNo) = vbNo)
     Print "CIAO"
Loop


Un risultato leggermente diverso lo possiamo avere mettendo la condizione alla fine: nei due casi precedenti CIAO non viene stampanto se l’utente risponde NO alla prima domanda, mettendo la condizione alla fine, CIAO  viene stampato sicuramente almeno  una volta:

Do
  Print "CIAO"
Loop While (MsgBox("Vuoi stampare?", vbYesNo) = vbYes)


Do
   Print “CIAO”
Loop Until (MsgBox("Vuoi stampare?", vbYesNo) = vbNo)


Utilizzando il ciclo
Do..Loop è possibile riprodurre il costrutto FOR, in questo caso ovviamente, bisogna farsi carico di inizializzare ed incrementare il contatore.
Esempio:
riprendiamo il ciclo che visualizza i numeri  da 0 a 10

Dim Conta as integer
Conta=0
Do While Conta <= 10
   Msgbox Str(Conta)
   Conta=Conta+1
Loop


ATTENZIONE!
In cicli di questo tipo è bene non dimenticarsi l’incremento del contatore, in tal caso, infatti, la condizione non diventa mai Vera e si genera un LOOP INFINITO.

L’istruzione Select Case

Select Case è analogo a If...Then...Else, ma è più indicato e migliora la leggibilità del codice nel caso di più scelte.
Si basa su un'unica espressione di prova che viene valutata una volta all'inizio della struttura stessa. Il risultato di tale espressione viene confrontato con il valore di ciascuna istruzione Case della struttura e in caso di corrispondenza viene eseguito il blocco di istruzioni associato all'istruzione Case:
Select Case <espressione>
[Case <espressione1>
     [bloccoistruzioni-1]]
[Case <espressione2>
     [bloccoistruzioni-2]]
.
..
[Case Else
     [
bloccoistruzioni-n]]
End
Select

Esempio:
La MsgBox (vedere approfondimento dopo) può restituire 3 risultati differenti (esempio SI, NO, ANNULLA), in tal caso avremmo bisogno di 2 costrutti IF per valutare le istruzioni da eseguire.
In tal caso è consigliabile utilizzare il Select..Case

Private Sub CmdProva_Click()
  Dim Ris As Integer
    Ris = MsgBox("Che tasto hai scelto", vbYesNoCancel)
    Select Case Ris
    Case vbYes
         Msgbox “SI”
    Case vbNo
         MsgBox "NO"
    Case vbCancel
         MsgBox "ANNULLA"
    Case Else
    End Select
End Sub

Finalmente siamo oggi riusciamo ad approfondire il concetto di procedura e funzione che abbiamo dovuto anticipare piu’ volte.

Procedure e funzioni (sottoprogrammi) servono per raccogliere un gruppo di istruzioni per dare maggiore leggibilità al programma o per evitare di ripetere in più punti le stesse istruzioni.
La differenza sostanziale tra le due è che le funzioni restituiscono un valore, mentre le procedure no.

Procedure
Una procedura in Visual Basic  prende il nome di Sub.

La sintassi di dichiarazione di una procedura è la seguente
Sub NomeProcedura([param1 as …, param2 as…])
   istruzioni
End Sub

Ad esempio, se vogliamo creare una procedura che visualizza una frase di saluto:
Sub Saluta()
    Msgbox “Ciao”
End Sub

Per utilizzarla è sufficiente scrivere il nome della procedura:

Private Sub Command1_Click()
    Saluta
End Sub


In questo caso non appare evidente l’utilità di utilizzare un procedura, ma se avessimo usato Saluta molte volte all’interno del nostro codice e ad un certo punto si presentasse la necessità di cambiare la frase “Ciao” per tradurla in inglese “Hello”, sarebbe sufficiente cambiarla una sola volta (all’interno della procedura).
I parametri
Nella sintassi di dichiarazione della procedura compaiono degli elementi racchiusi tra parentesi quadre: sono i parametri o argomenti, che già avevamo dovuto anticipare nelle prime lezioni.
Non è obbligatorio utilizzarli (ed è per questo motivo che sono indicati tra parentesi quadre), ma sono molto utili in quanto a volte si vuole rendere “parametrica” la procedura (o la funzione).
Occorre dare un nome ad ogni parametro e specificare il tipo di dato che conterrà (proprio come le variabili), se ne indichiamo più di uno occorre elencarli di seguito separati da virgola. L’ordine posizionale è anche quello che ci servirà per riferirci ad essi quando utilizziamo la procedura.

Ad esempio potremmo rendere parametrica Saluta mettendo come argomento il nome della persona che vogliamo salutare:

Sub Saluta(Nome as string)
    Msgbox “Ciao ” + Nome
End Sub


In questo caso, per richiamarla occorrerà specificare anche il valore del parametro dopo il nome della procedura separato da spazio:

Private Sub Command1_Click()
    Saluta “Carlo”
End Sub


Ampliando l’esempio a due parametri:

Sub Saluta(Nome as string, Cognome as string)
    Msgbox “Ciao ” + Nome + “ “ + Cognome
End Sub


I parametri possono essere passati direttamente con il loro valore oppure utilizzando una variabile, come nell’esempio :

Private Sub Command1_Click()
Dim Surname as string
    Surname =”Rossi”
    Saluta “Carlo”, Rossi
End Sub

Funzioni
La funzione è analoga alla procedura, con la sola differenza che restituisce un valore.
La sua dichiarazione è analoga a quella della Sub, ma occorre specificare la parola chiave Function ed indicare,  dopo la parentesi tonda (alla fine dell’elenco dei parametri), l’indicazione del tipo di dato che restituirà.
Function NomeFunction(param1 as …, ...) as ...
   Istruzioni
   NomeFUnction=
End Function

P.S.Poiché essa restituisce un valore sarà opportuno che tra le istruzioni che contiene ve ne sia almeno una che assegna alla funzione stessa il valore risultante!!

Supponiamo, ad esempio di voler creare una funzione che calcola l’importo dell’IVA al 4% su un imponibile . L’imponibile sarà il nostro parametro ed il risultato sarà restituito dalla funzione stessa.

Function IVA(Importo As Long) As Long
   IVA = Importo * 0.04
End Function

 

Per richiamare la funzione si usano le stesse regole della procedura, ma attenzione; i parametri vanno elencati tra parentesi !!.

Dim ValoreIva As Long
    ValoreIva = IVA(100000)
    MsgBox "L'IVA al 4% su L.100.000 è:" + Str(ValoreIva)
End Sub


Per migliorare l’esempio possiamo rendere parametrico anche l’aliquota IVA, con il seguente risultato:
Function IVA(Importo As Long, Aliquota As Single) As Long
   IVA = Importo * Aliquota / 1000
End Function


Un’approfondimento:
abbiamo detto che per richiamare una procedura occorre elencare i parametri senza utilizzare le parentesi.
Esiste un altro modo: utilizzare l’istruzione Call:
Call Saluta(“Carlo”)
In tal caso le parentesi vanno utilizzate!!
 

Variabili locali
Le variabili possono essere create all’interno di una procedura di evento. In tal caso si chiamano variabili locali in quanto nascono all’atto della dichiarazione e vengono distrutte dopo l'esecuzione dell'ultima istruzione.

Private Sub Command1_Click()
 Dim Messaggio As String
 . . .
End Sub


Per fare in modo che il loro valore sia conservato durante tutta l’esecuzione del programma e che siano visibili anche dentro ad altre procedure occorre creare variabili diverse che studieremo nella seconda parte di “Le variabili”.
 

Avevamo detto nella scorsa lezione che se dichiariamo le variabili localmente all’interno di una procedura di evento, esse nascono quando va in esecuzione l’evento e muoiono al termine di esso.
Le variabili possono anche appartenere a tutte le procedure evento di una stessa finestra oppure  essere comuni e visibili a tutte le finestre del nostro progetto, in tal caso occorre dichiararle in modo diverso.

Il passaggio di parametri
Nella scorsa lezione abbiamo visto cosa sono le procedure, le funzioni ed i parametri, in particolare avevamo detto che i parametri hanno un’ordine posizionale, vanno elencati separati da virgola, devono rispettare il tipo di dato specificato nella dichiarazione e possono essere “passati” come valori fissi o tramite variabili.
Cerchiamo di approfondire meglio quest’ultimo concetto.

E’ possibile passare dei parametri alle procedure ed alle funzioni in due modi:
- passaggio per riferimento (ByRef ), si utilizza quando  all’interno della procedura (o funzione) il valore del parametro viene  modificato e, alla procedura chiamante,  serve il valore di ritorno modificato;
- passaggio per valore (ByVal), il valore del parametro, ritorna alla procedura chiamante con il suo valore originale, anche se viene modificato all’interno della procedura (o funzione).

Il passaggio per valore è più sicuro, ma  lavora su una copia del valore del parametro, e dunque occupa più memoria. E’ per questo motivo che il passaggio di default (ovvero quello scelto da VB se non specificato diversamente) è quello per riferimento… anche se si dice che nella prossima versione di VB non sarà esattamente così… J

Esempio
Supponiamo di migliorare la funzione scritta la volta precedente: la nuova funzione dovrà verificare che l’aliquota IVA sia corretta ed in caso contrario dovrà restituire alla procedura chiamante l’aliquota con valore 0.

Function IVA(Importo As Long, ByRef Aliquota As Single) As Long
   If (Aliquota <> 4) And (Aliquota <> 20) Then
       Aliquota = 0
       Exit Function
   End If

   IVA = Importo * Aliquota / 1000
End Function

La funzione IVA verrà richiamata nell’evento click del pulsante Command1:

Private Sub Command1_Click()
Dim Aliquota As Single
  AliquotaIva = 5
  Call IVA(100000, Aliquota)
  If AliquotaIva = 0 Then
     MsgBox "L'aliquota iva è sbagliata"
  Else
     MsgBox "L'aliquota iva rientra in quelle specificate"
    End If
End Sub


In questo caso la variabile AliquotaIva assumerà il valore 0 in seguito alla chiamata della funzione IVA permettendoci di capire che l’aliquota è sbagliata.
Sostituendo la parola chiave ByVal nella funzione IVA:
Function IVA(Importo As Long, ByRef Aliquota As Single) As Long
…..
Otterremo un risultato differente, la variabile AliquotaIva varrà 5 anche al ritorno dalla chiamata alla funzione Iva.

In generale, i parametri per i quali ci serve un valore di ritorno sono detti parametri di output, mentre gli altri sono detti parametri di input o di input/output.

I parametri opzionali
Nel caso in cui volessimo utilizzare alcuni parametri senza obbligare chi utilizza le nostre procedure ad utilizzarli, potremmo dichiararli come opzionali.
Per dichiarare un parametro opzionale è sufficiente indicare prima la parola chiave Optional con il seguente accorgimento: se viene utilizzata, anche tutti gli argomenti successivi devono essere facoltativi e dichiarati con la parola chiave Optional.
E’ possibile associare un valore di default al parametro mancante oppure controllarne l’esistenza con la funzione di VB IsMissing (la quale però funziona solo con tipi di dati variant).
Torniamo sempre al nostro solito esempio, potremmo permettere al nostro utilizzatore di  specificare l’aliquota IVA solo nel caso in cui sia diversa da 4.

Function IVA(Importo As Long, Optional Aliquota As Single = 4) As Long
  IVA = Importo * Aliquota / 1000
End Function
Dunque per calcolare l’iva al 4% sarà sufficiente specificare l’importo:
MsgBox IVA(100000)

La stessa funzione la si può riprodurre utilizzando la funzione IsMissing, ovvero verificando se il valore del parametro è stato specificato e, in caso  contrario, assegnarvi un valore di default.

Function IVA(Importo As Long, Optional Aliquota) As Long
  If IsMissing(Aliquota) Then
    Aliquota = 4
  End If
  IVA = Importo * Aliquota / 1000
End Function



Validità delle funzioni
L’ambito di validità delle procedure e funzioni e simile a quello visto per  le variabili: possono essere pubbliche o private (Private o Public) e possono appartenere ad una FORM oppure ad un modulo .BAS.
Nel primo caso, anche se pubbliche, per poterle richiamare occorre specificare prima il nome della FORM di appartenenza.

Le costanti
Anche il concetto di costante è molto importante per un programmatore, in quanto è presente in tutti i linguaggi di programmazione.

La costante non è altro che una sorta di “variabile costante” ovvero un’area di memoria alla quale si assegna un nome ed un valore che non potrà cambiare durante l’esecuzione del programma.
Il caso classico è quello del valore del pi-greco per calcolare circonferenza ed area di un cerchio. Può essere comodo, all’inizio del programma, dichiarare una costante denominata PIGRECO (solitamente il nome delle costanti è maiuscolo per convenzione) avente il valore 3,1415..…
Non sarà indispensabile ricordarsi ogni volta il valore completo ma sarà sufficiente utilizzare la costante PIGRECO.
La dichiarazione è simile a quella delle variabili utilizzando la parola chiave CONST, naturalmente con PRIVATE per le costanti riservate ad un modulo e PUBLIC per quelle pubbliche con la particolarità che le costanti dichiarate all’interno di un form non possono essere pubbliche

Private Const PIGRECO = 3.141592
 

Abbiamo imparato a creare ed utilizzare le procedure e le funzioni. In questa e nelle prossime lezione impareremo a cosa servono le principali funzioni messe a disposizione da Visual Basic.

Le principali funzioni di Visual Basic

Le funzioni di conversione di tipo
Questa categoria di funzioni serve per convertire variabili od espressioni da un tipo di dato ad un altro. Se non specificato diversamente esse richiedono un parametro di input e restituiscono un valore del tipo di dato specificato.

CBool:
permette di modificare qualsiasi espressione valida (numerica o stringa) in TRUE o FALSE. Esempio:
Dim Numero1 as integer
Dim Numero2 as integer
Dim Confronto as boolean
Numero1 = 3
Numero2 = 2
Confronto = CBool(Numero1 = Numero2)   ' Confronta ora contiene FALSE
Numero2 = 3
Confronto = CBool(Numero1 = Numero2)   ' Confronta ora contiene TRUE

CDate:
questa funzione, data una qualsiasi espressione valida che rappresenta una data, restituisce un valore di tipo DATE. Esempio:
Dim DataInCaratteri as String
Dim DataData as Date
DataInCaratteri = "13 marzo 1987"     ' Variabile stringa contenete un espressione che rappresenta una data
DataData = CDate(DataInCaratteri)       ' Converte nel tipo di dati Date.


CInt:
serve per convertire un espressione valida in un numero intero (ovvero da - 32.768 a 32.767). Se l’espressione passata come parametro rappresenta un numero con virgola, il risultato sarà un intero approssimato per eccesso o per difetto. Esempio:
Dim NumeroConVirg as double
Dim NumeroIntero as integer
Dim NumeroStringa as string
NumeroConVirg = 337.78     
NumeroIntero = CInt(NumeroConVirg)   ' ora NumeroIntero contiene 338
NumeroStringa = "52"
NumeroIntero = CInt(NumeroStringa)   ' ora NumeroIntero contiene 52

Esistono funzioni analoghe anche per convertire un’espressione neglli altri tipi di dati numerici, Byte, Long, Single, Double ovvero CByte, CLng, CSng, CDbl.

CStr:
converte in stringa l’espressione che viene passata come parametro. Esempio:
Dim VerooFalso As Boolean
Dim Stringa As String
Dim NumConVirgola As Double

VerooFalso = True
Stringa = CStr(VerooFalso)    ‘Restituisce VERO o TRUE se il sistema operativo è in inglese
NumConVirgola = 3.4
Stringa = CStr(NumConVirgola)  ‘Restituisce 3,4 o 3.4 se il sistema operativo ha le impostazioni inglesi o americane


Str:
è una funzione analoga alla CStr, con la differenza che converte solo espressioni numeriche in stringa e non accetta altre espressioni (es. boolean o date).
MyString = Str(459)      ' Restituisce " 459"
MyString = Str(-459.65)  ' Restituisce "-459,65".
MyString = Str(459.001)  ' Restituisce " 459,001".

Val:
è una funzione di conversione in numero più generalizzata delle precedenti: ovvero accetta un stringa e la restituisce sotto forma di valore numerico di tipo appropriato cercando di interpretare anche frasi più complesse. Esempio:
Numero = Val("13")
Numero = Val("13 cose")   ‘ in entrambi i casi Numero conterrà 13
Numero = Val("cose")      ‘ in questo caso conterrà 0 in quanto non interpretabile



Asc:
converte un carattere nel corrispondente codice della tabella ASCII (valore intero tra 0 e 255).
Codice = Asc("A")         ' Restituisce 65
Codice = Asc("a")         ' Restituisce 97.

Chr:
E’ la funzione inversa ad Asc, ovvero dato un codice della tabella ASCII ne restituisce il carattere corrispondente:
Carattere = Chr(65)      ' Restituisce A
Carattere = Chr(97)      ' Restituisce a.

I numeri da 0 a 31 corrispondono ai codici ASCII standard non stampabili. La funzione Chr(13), ad esempio, restituisce il carattere di  INVIO a capo.
Msgbox “Ciao “ + chr(13) + “ a tutti”
visualizzerà
 

Abbiamo imparato a creare ed utilizzare le procedure e le funzioni. In questa e nelle prossime lezione impareremo a cosa servono le principali funzioni messe a disposizione da Visual Basic.

Le principali funzioni di VBA


Format:
è una funzione molto utile, in quanto serve per “formattare” un’espressione in un formato desiderato, ovvero, per stampare i numeri con i punti separatori delle migliaia oppure per visualizzare una data con l’anno di 4 cifre o anche per visualizzare una frase tutta in maiuscolo.
Sintassi:
Format(espressione[, formato])
Il tipo di formato dipendende naturalmente dal contenuto dell’espressione, ecco alcuni esempi:
MsgBox Format(Date, "Long Date")       visualizza la data corrente nel formato esteso
MsgBox Format(Date, "dd/mm/yyyy")                 visualizza la data corrente in formato
giorno/mese/annoin4cifre

MsgBox Format(5459.4, "##,##0.00")                Restituisce 5.459,40
MsgBox Format(1334.9, "###0.00")                   Restituisce 1334,90.
MsgBox Format("CIAO", "<")                             Restituisce "ciao".
MsgBox Format("ciao", ">")                             Restituisce "CIAO".



Funzioni di manipolazione delle stringhe
Instr:
Restituisce un valore numerico che specifica la posizione della prima occorrenza di una stringa all'interno di un'altra.
Sintassi:
InStr([inizio, ]stringa1, stringa2[, confronto])
Esempio:
InStr(1,"ciao a tutti voi", "tutti")                restituisce il valore 8.
Il tipo di confronto, se non specificato è quello specificato nell’istruzione Option Compare (*) altrimenti può essere di tipo binario (VbBinaryCompare) e testo (VbTextCompare).

(*) L’istruzione Option Compare può essere utilizzata a  livello di modulo per dichiarare la modalità di confronto predefinita da utilizzare per confrontare i dati di una stringa (se non specificato diversamente si usa il confronto binario).
Sintassi: Option Compare {Binary | Text | Database}

Mid:
Restituisce un certo numero di caratteri estraendolo da una posizione specificata di una stringa di partenza. I parametnri da specificare sono dunque la stringa di partenza, il punto da cui inziare l’estrazione ed il numero di caratteri da estrarre (se non è specificato si intende fino alla fine).
Sintassi:
Mid(string, start[, length])
Esempio:
Mid(“ciao a tutti voi", 8, 5)                restituisce il “tutti”.

Ucase e LCase:
Restituiscono un la stringa passata come parametro, convertita in maiuscole oppure in minuscole.
Sintassi:
UCase(stringa), LCase(stringa)
Esempio:
UCase(“ciao a tutti voi”)                restituisce il “CIAO A TUTTI VOI”.
LCase(“CIAO A TUTTI VOI”)                restituisce il “ciao a tutti voi”.


Left e Right:
Restituiscono un numero specificato di caratteri di una stringa a partire da sinistra o da destra.
Sintassi
Left(string, length), Right(string, length)
Esempio:
Left(“ciao a tutti voi”,4)                restituisce  “ciao”
Right(“ciao a tutti voi”,3)                restituisce  “voi”

Trim, Ltrim e Rtrim
Restituiscono la stringa di partenza senza spazi iniziali (LTrim), spazi finali (RTrim) o senza spazi iniziali e finali (Trim).
Sintassi
LTrim(stringa)
RTrim(stringa)
Trim(stringa)
Esempio:
Trim(“ ciao ”)                restituisce “ciao”
LTrim(“ ciao ”)                restituisce “ciao  ”
RTrim(“ ciao ”)                restituisce “  ciao”


Cosa ne dite? Queste erano le funzioni principali per lavorare sulle stringhe, ma ne esistono altre! La prossima lezione finalmente termineremo la carrellata sulle funzioni fornite da VB imparando quelle relative alle date ed ai numeri.

In questa lezione finalmente termineremo lo studio delle funzioni fornite da Visual Basic imparando quelle relative alle date ed ai numeri.


Funzioni di manipolazione delle date:

Date:
E’ una funzione che restituisce la data di sistema corrente.
Esempio:
msgbox Format(Date,”dd-mm-yyyy”)
Supponendo che oggi sia il 2/6/2001 questo esempio restituirà 02-06-2001

Year:
Restituisce un valore numerico intero corrispondente all’anno della data passata come parametro

Month:
Restituisce un valore numerico intero corrispondente al mese della data passata come parametro

Day:
Restituisce un valore numerico intero corrispondente al giorno della data passata come parametro
Esempio:
msgbox Day(Date)
msgbox Month(Date)
msgbox Year(Date)
Supponendo che oggi sia il 2/6/2001 restituisce 2, 6, poi 2001


IsDate:
Restituisce un valore Booleano (True o False) che indica se è possibile o meno convertire l’espressione  passata come parametro  in data. Successivamente, se l’esito di questo controllo è positivo, si potrà convertire utilizzando l’apposita funzione di conversione CDate.
Esempio:
If IsDate("29/31/2001") Then
   MsgBox "Data Corretta"
Else
   MsgBox "La data passata non è valida!"
End If
Questo esempio dirà che “la data passata non è valida”

Funzioni numeriche:

Round:
Restituisce un numero arrotondato in base al numero di cifre decimali specificato.
Sintassi:  Round(espressione[, numcifredecimali])
Esempio:
MsgBox Round(8.98737, 1)     restituirà 9
MsgBox Round(8.94737, 2)     restituirà 8,95
MsgBox Round(8.94737, 3)     restituirà 8,947
MsgBox Round(8.94737, 4)     restituirà 8,9474

Sqr:
Restituisce un valore Double che specifica la radice quadrata di un numero.

Abs:
Restituisce un valore che specifica il valore assoluto di un numero. Il valore restituito sarà dello stesso tipo di quello passato alla funzione. Ad esempio ABS(-2) e ABS(2) restituiscono entrambi 2.

Cos e Sin:
Restituiscono un valore Double che specifica il coseno o il seno di un angolo.