Tipo di dati.  Formati di Conversione del tipo di dati.

Conosciamo ed abbiamo già visto in questa sezione, la funzione vba Format, che ha il compito di predisporre il formato di un dato in modo che noi possiamo vederlo restituito con il formato che abbiamo deciso.

Mi sono accorto che esiste una certa confusione di interpretazione sul comportamento di ciò che in realtà otteniamo con la funzione Format in vba, e vorrei cercare di chiarire alcuni aspetti.

Quando siamo sul foglio di lavoro e scegliamo "Formato Celle", noi in realtà scegliamo il "TIPO DI DATI" che una cella dovrà contenere, e nella finestra "Numero", una volta selezionato il Tipo di dato, nella parte destra appare il tipo di Formato con il quale vogliamo che il dato ci venga mostrato nella cella.

E' quindi Excel che provvede, attraverso le nostre decisioni, ad impostare sia il TIPO di dato, sia il FORMATO nella cella.

Quando ci troviamo a lavorare di codice, dovremo invece essere noi a compilare le necessarie istruzioni sia per definire il formato, sia per il tipo di dati. Per quanto riguarda il formato, useremo la funzione Format (vba) che ha esclusivamente il compito di predisporre il modo in cui un dato ci appare, per esempio in una TextBox, o come il codice lo passa d una cella del foglio di lavoro. E' soprattutto questa differenza tra Formato (Format) e Tipo di dati che genera confusione. In parole povere questa istruzione:
TextBox1 = Format(TextBox1, "#,###.00")
determina SOLO il modo in cui il valore verrà mostrato nella textbox o in una cella, ma NON dice assolutamente ad Excel di che TIPO di dati viene passato dal vba. Per comunicare quindi ad Excel il TIPO di dati, è necessario dichiarare di che  TIPO di dati si tratta. Questa operazione si chiama "CONVERSIONE DEL TIPO DI DATI".  Dovremo usare una sintassi specifica, per definire se è un numero intero o un numero con decimali, se è testo, o una data, o un orario, ecc,  in modo che il vba passi ad Excel il dato facendogli capire di che cosa si tratta. Per fare questo possiamo procedere in diversi modi:

Assegnare il Tipo di dati ad una variabile:
Dim MioValore As Double
MioValore = TextBox1.Value
Cells(1, 7).Value = MioValore


oppure, molto più semplicemente, senza usare il dimensionamento, così:
MioValore = TextBox1.Value
Cells(1, 7).Value = CDbl(MioValore)


o, più veloce ancora:
Cells(1, 7).Value = CDbl(TextBox1)


Tutti questi esempi restituiscono tutti un valore Double, cioè un numero con decimali, e anche senza il Format nella Textbox, il dato che viene passato al foglio viene riconosciuto come Double e corrisponderebbe all'azione che avremmo fatto sul foglio di lavoro scegliendo da "Formato Celle", "Numero con decimali". Ovviamente l'impiego della funzione Format in abbinamento all'indicazione del Tipo di dato, ci avrebbe consentito di decidere anche con quanti decimali il valore sarebbe stato poi visualizzato nella cella. Esempio:
TextBox1 = Format(TextBox1, "#,###.00")
Cells(1, 7).Value = CDbl(TextBox1)

oppure, in un unica istruzione:

Cells(1, 7).Value = CDbl(Format(TextBox1, "#,###.00"))

ed il valore restituito in G7 sarà Double a due decimali anche se noi avremo 1354,8792


Quando si adopera "Tipi di dati" numerici, bisogna sempre ricordarsi che la textbox non può restare vuota, pena un errore di debug, (il vuoto per il vba NON corrisponde a zero) ma bisogna impostare un istruzione tipo questa
If TextBox1 = "" Then TextBox1 = 0
e ovviamente va posizionata prima del comando di trasferimento al foglio.
If TextBox1 = "" Then TextBox1 = 0
Cells(1, 7).Value = CDbl(TextBox1)


Per quanto riguarda il Tipo di dati, la guida a questo proposito è comunque ben fornita, solo che bisogna conoscere come cercare. Nella guida dell'editor del visual basic, andare sull'indice, digitare : Funzione, e nella finestra sotto più grande (la 3) dove c'è scritto: selezionare un argomento, scorrere fino a trovere. "Funzioni di conversione del tipo", selezionare l'argomento, e sulla destra ve li trovate tutti. E comunque i più usati sono:
CDate - per indicare che si sta trasferendo una data, ed è utile usare prima una variabile per definire il formato data, esempio
MyStr = Format(TextBox1, "h:m:s")
Cells(1, 7).Value = CDate(MyStr)

CDbl - per tutti i numeri positivi o negativi con decimali (idem c.s. per definire il formato numerico)
CLng - per interi numerici
CInt - tipo di dati integer
CStr - tipo di dati stringa (formato testo)

Val - più generico per numeri o testo (o solo numeri se presenti in una stringa)

Cells(1, 7).Value = Val(TextBox1)


Buon lavoro.


prelevato sul sito http://ennius.interfree.it