Variabili, Vettori, Costanti, e Tipi di Dati. - dal 04/09/04 pagina vista: volte

L'argomento Variabili è piuttosto ampio, è qui non verrà analizzato tutto. Lo scopo dell'articolo è solo quello di avvicinare il lettore ai concetti di base. Per analisi approfondite e più complete sarà necessario leggersi la guida in linea, che su questo argomento è ben descritta e ampia, oppure acquistatevi un libro sul VBA. (vedi pagina Libri&Link).

Molti non hanno ben chiaro il concetto di Variabile, Vettore, Costante: molto, ma molto semplicemente possiamo dire:

  • Variabile è un dato (cioè un valore che potrà essere numerico o testo o data) che non rimane fisso, immutevole (cioè Costante) ma può cambiare, cioè : variare (da qui il nome di (dato)Variabile).

  • Per indicare una Variabile viene usato un nome, una lettera, un insieme di lettere e numeri, qualsiasi cosa che a noi (e al codice che deve utililizzarla) serva per riconoscerla, e sarà possibile (vedremo più avanti), definire di che "Tipo di Dati" la Variabile diventa il Vettore, cioè il contenitore o se preferite, il trasportatore del dato stesso.

Un esempio: vogliamo reperire il valore che sarà in una determinata cella. In questa cella abbiamo un totale numeri che potrà cambiare al variare anche di un solo numero: abbiamo bisogno di "prendere" questo totale per svolgere dei calcoli. Ma il totale può cambiare in qualsiasi momento per effetto di variazioni dei numeri (quindi non è un valore Costante nel tempo). Useremo quindi una Variabile, quindi un nome, che rappresenti il valore di "totale" qualunque sia questo valore, ed avremo:

  • miavariabile (è il nome della variabile) = Sheets(1).[C5] (uguale al valore che sarà nella cella C5) - miavariabile è il Vettore che porta con se il valore che sarà nella cella C5.

Altro esempio: vogliamo reperire in numero di righe (ma potrà essere anche di colonne) occupate da dati. Poichè potremo aggiungere dati a piacere, il numero di righe varierà in continuazione. Avremo bisogno di sapere da quante righe è formato il nostro elenco per assegnare questo numero ad un Ciclo For..Next, come limite superiore del ciclo. Useremo anche qui una Variabile, in questo caso una lettera, che diventi il Vettore del numero di righe, ed avremo:

  • X (è il nome della variabile) = Sheets(1).Range("A1").End(xlDown).Row 'X sarà il Vettore dell'ultimo numero di riga occupata, se avremo 22 righe occupate X sarà uguale a 22
    For N = 1 To X  'ed usiamo X come limite superiore del ciclo: cioè da 1 fino a.....X (22)
    ....istruzioni di cosa fare
    Next

in questo esempio abbiamo usato un'altra Variabile, identificata dalla lettera N (ma poteva essere anche una parola: "pippo", il risultato di avere un Vettore di un dato variabile, (che cambia di valore), sarebbe stato lo stesso). infatti anche il valore che N avrà nel ciclo, varia di una unità ad ogni ciclo (Next), ed avevamo bisogno quindi di usare una Variabile.

Riassumendo: una Variabile è qualcosa (un nome o una lettera) che rappresenta (diventa il Vettore di) un valore che cambia o può cambiare. Un pò più chiaro adesso? Spero proprio di si.

  • Costante = con questo termine si identifica tutto ciò (numeri o testo) che rimane fisso, immutevole. E' un elemento predefinito che mantiene un valore costante per tutta l'esecuzione di un programma. Le costanti possono essere stringhe, valori letterali numerici o stringa, altre costanti o una qualsiasi combinazione di tali elementi e operatori artimetici o logici. Da non confondere con le "Costanti di Visual Basic" che vengono definite per semplificare la programmazione, come nell'esempio sopra dove per indicare la direzione in cui deve operare la funzione End, si indica la Costante di Visual Basic "xlDown" cioè "verso il basso". (Vedi guida in linea: Costante/Costanti di visual basic),

Secondo enunciato: una Variabile può portare (essere il Vettore di) una Costante, Esempio:

  1. tuavar (è il nome della variabile) = "PippiCalzeLunghe"  valore testo (stringa, messo tra doppi apici) fisso, quindi Costante. Ma può essere anche un numero, usato come moltiplicatore ad esempio, per assegnare percentuali:

  2. tuavar (è il nome della variabile) = 20 / 100  - valore numerico intero fisso che fornirà la percentuale del 20% calcolata su un valore. Infatti tuavar è uguale a 0,2 (venti diviso 100). Esempio: in A1 avremo il valore 2000, in B1 vorremo il calcolo della percentuale del 20 su 2000, cioè 400:

  3. tuavar = 20 / 100
    [B1] = [A1] * tuavar

Si dirà: a che scopo usare una Variabile quando si può ottenere lo stesso risultato scrivendo direttamente l'istruzione:

  1. [B1] = [A1] * 20 / 100

intanto un motivo è rappresentato dalla comodità di usare un nome che può essere molto breve, e quindi dalla possibilità di usare istruzioni lunghe, rappresentandole anche con una sola lettera. Poi nell'esempio sopra, per evitare risultati diversi dai desiderati: infatti nei conteggi non bisogna dimenticare che le operazioni tra numeri, vengono svolte seguendo una priorità: prima vengono svolte le operazioni tra parentesi, e quindi poi le divisioni, poi le moltiplicazioni, infine le somme e le sottrazioni. E non sempre istruzioni su una unica riga sortono i risultati giusti, poi, condizione più importate, con una Variabile possiamo specificare il "Tipo di dati" (che vediamo più avanti) che la variabile rappresenta .

Ma verifichiamo ancora l'importanza nella priorità delle operazioni e l'influenza delle parentesi nello svolgimento dei calcoli: supponiamo di voler ottenere l'importo dello sconto di una cifra: moltiplichiamo due valori (100 x 5), al risultato toglieremo 100, e sulla differenza  (400) applichiamo il 20%, ottenendo 80, giusto? vediamo con queste tre istruzioni assegnate e variabili cosa otteniamo:

  1. var1 = 100 * 5 - 100 * 20 / 100  - restituisce 480. perchè non torna? perchè in questa sequenza vengono svolte queste operazioni: prima si divide 20/100 (0,2) quindi si moltiplica 100*5 (500) e subito dopo viene moltiplicato 100 * il risultato della divisione (0,2) e si ottiene 20, infine avviene la sottrazione 500 - 20 = 480. Questo per effetto della priorità nelle operazioni. Proviamo questa:

  2. var2 = (100 * 5 - 100) * 20 / 100 - restituisce 80. che è giusto. Infatti vengono prima svolte le operazioni tra le parentesi, rispettando in ogni caso la priorità operativa, quindi 100*5 restituisce 500,  - 100 restituisce 400; ora possiamo dividere 400 per cento e moltiplicarlo per 20. Proviamo anche questa:

  3. var3 = (100 * 5 - 100 * 20) / 100 - restituisce -15. che è sbagliato: infatti viene sottratto 2000 (100*20) da 500 (100*5), infine diviso per 100. Morale: ricordarsi sempre della priorità nelle operazioni. Le parentesi (messe al posto giusto) ci consentono di regolamentare queste priorità.

Sembra abbia deviato dall'argomento Variabili, ma usando le variabili possiamo unire gruppi di calcoli per ottenere i nostri risultati, specialmente se alcuni gruppi di calcolo sono ripetitivi: basterà infatti utilizzare il nome della variabile anzichè riscrivere tutte le operazioni: in A1 avremo 100, in B1 avremo 5, in C1 avremo 100, e in D1 otterremo 80

  • var1 = [A1] * [B1] - [C1]  'var1: variabile di variabili
    var2 = 20 / 100
    var3 = var1 *  var2
    [D1] = var3
     'o anche, togliendo var3,  [D1] = var1 * var2

Variabili : Tipi di dati . Avete visto che sul foglio di lavoro, quando dobbiamo scegliere il "Formato Celle", ci si presenta una finestra in cui potremo selezionare se la cella dovrà contenere "numeri", o "date", oppure "orari", o ancora "testo", "valuta", ecc. ecc. fino al "personalizzato" ? Bene, quello che noi sceglieremo altro non è che il "Tipo di dati" che la cella dovrà contenere. Il motivo è semplice: se informiamo Excel su ciò che una cella conterrà, lui sarà in grado di gestirlo come tale, ed impedirà per esempio di moltiplicare un numero per un testo, oppure di scrivere un numero intero che inizi per zero, ecc. ecc. Se però dimentichiamo di impostare un "Formato cella" specifico, Excel comunque lo interpreta come "Generale", cioè un qualcosa che non è definito, e che potrà essere testo oppure numero, indifferentemente (anche se con ovvie limitazioni nella gestione di questi dati non definiti come "Tipo").

Come avviene sul foglio di lavoro, lo stesso accade in Vba : in assenza della definizione del tipo di dati, ogni variabile viene considerata di Tipo Variant (simile a Generale, per intenderci). Poichè anche in vba avremo bisogno di "definire" comunque il "Tipo di dato" che la Variabile rappresenta, (quindi testo, numero intero, numero con decimali, data, ora, ecc.ecc.) potremo avvalerci di due metodi:

  1. Dimensionare una Variabile e definizione del "tipo di dato" usando la parola As ( cioè: vedila come...). Il tipo di dati di una variabile dichiarata può essere: Boolean, Byte, Integer, Long, Currency, Single, Double, Date, String, oltre ovviamente a Variant.

  2. Usare una Funzione di conversione del tipo di dati. (in questo caso non è necessario il dimensionamento)

A:  per dimensionare una variabile viene in genere utilizzata un'istruzione Dim .Questa istruzione di dichiarazione può essere posizionata:

  • all'interno di una routine (o macro che dir si voglia) per creare una variabile a livello di routine (cioè la durata e la visibilità della variabile si esaurisce quando la routine termina con End Sub). I questo breve esempio la variabile "MioConto" viene definita come "tipo di dato":  "Double", cioè numero con decimali, ed è visibile solo all'interno della routine Sub Conteggi():

  • Sub Conteggi()   'nome della routine
    Dim MioConto As Double
    'dichiarazione variabile MioConto come numero con decimali
    MioConto = 1936.27
     'assegnazione di un valore con decimali che in vba va posto usando il punto e non la virgola
    Range("C1") = [A1] * MioConto
    'conversione in Euro del valore che sarà in A1
    End Sub

  • oppure può essere posizionata all'inizio di un modulo, nella sezione Dichiarazioni, per creare una variabile a livello di modulo. In questo caso ogni routine contenuta nel modulo può usare la variabile, alla quale potrà essere assegnato, esempio:

  • Dim MioConto As Double (posto nella sezione Dichiarazioni - Generale di un modulo standard) e poi non ci sarà più bisogno di dichiarare la variabile in ogni routine contenuta nel modulo, ma basterà usare il nome della variabile assegnandoli un valore, esempio:

  • Sub Conteggi1()   'nome della routine
    MioConto = 1936.27
     'assegnazione di un valore con decimali che in vba va posto usando il punto e non la virgola
    Range("C1") = [A1] * MioConto
    'conversione in Euro del valore che sarà in A1
    End Sub

  • Sub Sconto()   'nome della routine
    MioConto = 20 / 100
     'assegnazione di un valore che restituisce decimali (venti diviso cento dà 0,2)
    Range("C1") = [A1] * MioConto
    'calcolo dello sconto 20% sul valore che sarà in A1
    End Sub

In sostituzione dell'istruzione Dim, quando si voglia rendere visibile la variabile in tutto il progetto (cioè in ogni e qualsiasi modulo Standard o modulo Foglio) potremo usare l'istruzione Public posizionandola nella sezione Dichiarazioni di un modulo.

B : Abbiamo detto che in mancanza del dimensionamento con definizione del tipo di dati, ma anche dimensionando  SENZA però definire il tipo di dati, una variabile viene considerata di tipo Variant (potrà essere quindi dati numerici, stringhe o date). Ma spesso abbiamo bisogno di far capire al codice che una certa variabile è il vettore di un tipo preciso di dato, ecco che possiamo usare la Funzione di conversione del tipo di dati che si usa applicando una Funzione di Visual Basic e quelle legate alla definizione del tipo di dati si riassumono in questa tabella (potete trovarle tutte nella guida in linea)

Funzione

Tipo restituito

Intervallo per l'argomento della fuzione

CBool

Boolean

Qualsiasi espressione numerica o stringa valida.

CByte

Byte

Da 0 a 255.

CCur

Currency

Da -922.337.203.685.477,5808 a 922.337.203.685.477,5807.

CDate

Date

Qualsiasi espressione di data valida.

CDbl

Double

Da -1.79769313486231E308 a
-4,94065645841247E-324 per valori negativi; da 4,94065645841247E-324 a 1,79769313486232E308 per quelli positivi.

CDec

Decimal

+/-79.228.162.514.264.337.593.543.950.335 per numeri con fattore di divisione zero, ovvero numeri senza decimali. Per i numeri con 28 decimali l'intervallo è
+/-7,9228162514264337593543950335. Il numero minore possibile diverso da zero è 0,0000000000000000000000000001.

CInt

Integer

Da -32.768 a 32.767; le frazioni vengono arrotondate.

CLng

Long

Da -2.147.483.648 a 2.147.483.647; le frazioni vengono arrotondate.

CSng

Single

Da -3,402823E38 a -1,401298E-45 per valori negativi; da 1,401298E-45 a 3,402823E38 per valori positivi.

CStr

String

I valori restituiti da CStr dipendono dall'argomento espressione.

CVar

Variant

Lo stesso intervallo di Double per valori numerici. Lo stesso intervallo di String per valori non numerici.

Bene, ora che le abbiamo viste (le Funzioni di conversione del tipo), come le utiliziamo? Semplicemente usando la variabile come argomento della funzione. Facciamo qualche esempio riprendendo quelli sopra:

  • Sub Conteggio()   'nome della routine
    MioConto = 1936.27
     'assegnazione di un valore con decimali che in vba va posto usando il punto e non la virgola
    Range("C1") = [A1] * CDbl(MioConto)
    'la variabile MioConto viene usata come argomento di CDbl (Funzione)
    End Sub

  • Sub Conteggio1()   'nome della routine
    Dimmi = InputBox("Inserisci una data")
    'la variabile "Dimmi" è presa attraverso una InputBox, e inseriremo una
    '
    data, che dovrà essere definita come tale altrimenti Excel non la riconosce come data
    Range("C1") = CDate(Dimmi)
    'anche qui la variabile "Dimmi" viene usata tra parentesi come argomento della 'Funzione CDate
    End Sub

L'esempio con la InputBox ci porta ad un'altra considerazione: quando si "prendono" dati attraverso le "Finestre di Dialogo" (InputBox), i dati vengono visti come Stringhe (quindi testo) anche se si inserisce un numero. In alcuni casi questo è ininfluente ai fini di istruzioni a valle della InputBox, molto spesso invece è opportuno usare una Funzione di conversione del tipo di dato per definire ciò che abbiamo reperito con la inputbox, specialmente se trattiamo numeri che devono essere usati in operazioni e calcoli, oppure date. Ma anche possiamo usare il dimensionamento della variabile definendo il tipo di dato . Vediamo due esempi: supponiamo che nella InputBox noi scriveremo una data:

  • Sub Verifica1()   'nome della routine
    Dim Dimmi As Date
    'dichiarazione della variabile "Dimmi" come tipo di dati Data
    Dimmi = InputBox("Inserisci una data") 
    'inputbox con la quale scriveremo una data, es. 25/12/03
    Range("C1") = Dimmi
    'la variabile "Dimmi" ora restituisce 25/12/03
    End Sub

  • Sub Verifica2()   'nome della routine
    Dimmi = InputBox("Inserisci una data") 
    'inputbox con la quale scriveremo una data, es. 25/12/03
    Range("C1") = CDate(Dimmi)
    ''la variabile "Dimmi" ora restituisce 25/12/03 usando la Funzione CDate
    End Sub

Se non avessimo usato definire il tipo di dati, 25/12/03 sarebbe stata passata come stringa con tutte le conseguenze del caso. Esiste un'interessante Funzione che può servire a riconoscere che capperi di dato stiamo passando con una variabile impostata tramite InputBox, ed eventualmente provvedere a definire il tipo di dato giusto. La funzione è VarType che restituisce un numero che identifica il tipo di dato reperito tramite la inputbox : se il numero non è quello giusto che noi vogliamo, correremo ai ripari. Questa è una semplice routine che ci serve ad ottenere il umero, e sotto vediamo una tabella con i significati:

  • Sub Sibilla()
    dimmi = InputBox("Metti Quel Che Ti Pare") '
    usiamo una InputBox dove scriveremo ciò che vogliamo controllare
    MsgBox VarType(dimmi)
    'otteniamo un messaggio che tramite la funzione VarType ci dirà a che numero corrisponde 'la variabile "dimmi"
    End Sub

Costante Valore Descrizione
vbEmpty 0 Empty (non inizializzata)
vbNull 1 Null (dati non validi)
vbInteger 2 Intero
vbLong 3 Intero lungo
vbSingle 4 Numero a virgola mobile a precisione singola
vbDouble 5 Numero a virgola mobile a precisione doppia
vbCurrency 6 Valore di valuta
vbDate 7 Valore di data
vbString 8 Stringa
vbObject 9 Oggetto
vbError 10 Valore di errore
vbBoolean 11 Valore booleano
vbVariant 12 Variant (utilizzato solo con le matrici di variabili Variant)
vbDataObject 13 Oggetto di accesso ai dati
vbDecimal 14 Valore decimale
vbByte 17 Valore byte
vbUserDefinedType 36 Variabili Variant che includono tipi definiti dall'utente
vbArray 8192 Array

Vedrete che se non si definisce il tipo di dati, qualunque cosa si scriva nella InputBox, il valore letto nel messaggio sarà sempre 8, cioè una stringa. Se invece usiamo definire il tipo di dati, come negli esempi Sub Verifica1() o Sub Verifica2() otterremo 7, che sarà quello giusto, trattandosi di una data. Ovviamente definiremo il tipo di dati giusto che ci servirà di volta in volta.

Mi sembra di non avere altro da dire, se non che, se non sarò stato comprensibile, non so proprio in quale altra maniera dirlo.

Buon lavoro.

prelevato sul sito www.ennius.altervista.org