Funzione utente TRUNC() e Funzione TRUNCA() - pagina vista: volte

In VBA non esiste la Funzione TRONCA() del foglio di lavoro, che serve ad eliminare, posto un numero con decimali, la parte decimale del numero, indicando il numero di cifre (dei decimali che si desidera troncare), in pratica si può usare per impostare il numero di decimali da ottenere, e la sua sintassi è:

  • TRONCA(num;num_cifre) - dove num è il numero che si desidera troncare e num_cifre è un numero che specifica la precisione del troncamento. Il valore predefinito di num_cifre è 0 (zero).

  • esempio: abbiamo un numero  a 5 decimali 1245,25478 e lo dobbiamo dividere per 26000; il risultato è il numero negativo 0,0478944146153846, e se usiamo la funzione TRONCA((1245,25478/26000);2) otteniamo 0,04 .

La stessa cosa la vorremmo realizzare in VBA, ma dobbiamo considerare che Excel, quando si supera un certo numero di cifre (i decimali in questo esempio), usa il formato dei numeri esponenziali, cioè il numero sopra viene visto come un numero intero elevato alla X potenza (in questo caso negativa, cioè col segno meno dopo la lettera E) ed il numero negativo visto sopra ( 0,0478944146153846) viene visto e letto dal codice come 4,78944146153846E-02

Questa premessa solo per coloro che, cimentandosi nella realizzazione di funzioni utente (cioè quelle "fai da te") tengano presente che può essere opportuno convertire un numero esponenziale in un numero decimale usando la funzione di conversione del tipo CDec. Questa conversione faciliterà la lettura dei valori se useremo istruzioni che leggano la parte intera di un numero quando la parte intera è rappresentata da uno zero (virgola qualcosa).

Presento quindi una funzione utente, la Funzione Trunc(Numero)  dove Numero sarà il numero o il riferimento ad una cella contenente il numero, o ad una variabile vettore del numero da troncare; questa funzione potrà essere usata come una qualsiasi altra funzione sia sul foglio di lavoro, sia in procedure vba. Ho usato il solo argomento Numero perchè la funzione così impostata restituisce solo numeri a due decimali (di tipo Double), ma non è difficile modificarla secondo le proprie necessità. Vediamo la funzione:

  • Function Trunc(ByVal Numero) As Double
    Dim X, num, dec, dezero 
    'dichiarazione variabili
    X = CDec(Numero)  
     'con X otteniamo il numero espresso in decimali tramite CDec
    If Left(X, 1) > 0 Then 
    'se il primo valore di X è maggiore di zero
    num = Int(X)     
     'num sarà uguale alla parte intera del numero
    dec = X - num  
    'dec sarà uguale al numero meno la parte intera (quindi solo la parte dopo la virgola)
    dezero = Left(dec, 4) 
    'dezero saranno i primi 4 valori di dec (che viene letta come 0,nn ecc, cioè lo zero e la virgola '(i primi due caratteri dei 4) + altri due che saranno i decimali da ottenere. E' variando questo numero che potremo 'ottenere 3 decimali (useremo 5), 4 decimali (useremo 6), ecc.)
    Trunc = num + dezero
     'quindi Trunc restituirà la parte intera (num)  + la parte decimale (dezero)
    Exit Function
    Else  
    'se invece il primo valore è zero o inferiore
    Trunc = Left(X, 4) 
     'si prendono i 4 valori di X partendo da sinistra ottenendo 0,due decimali
    Exit Function
    End If
    End Function

Ricordo che la funzione NON arrotonda l'ultimo decimale, ma  Tronca i decimali al numero prefissato senza arrotondamenti. Esempio in vba:

  • miavar = 1245.25478
    cifratroncata = Trunc(miavar) 
    e cifratroncata sarà uguale a 1245,25  (due decimali)

  • Esempio in una cella del foglio di lavoro:    =Trunc(riferimentocella)

Se invece desiderate usare la funzione con l'argomento num_cifre, per poter variare a vostro piacimento il numero delle cifre da troncare, questa è la Funzione TRUNCA(Numero, cifre) dove con cifre si indicherà a quanti decimali troncare.

  • Function Trunca(ByVal Numero, cifre) As Double
    Dim X, num, dec, dezero, numcifre
    numcifre = cifre + 2
     'dobbiamo aggiungere due cifre al numero che indicherete come troncamento (lo 0 e la virgola)
    X = CDec(Numero)
    If Left(X, 1) > 0 Then
    num = Int(X)
    dec = X - num
    dezero = Left(dec, numcifre)
    Trunca = num + dezero
    Exit Function
    Else
    Trunca = Left(X, numcifre)
    Exit Function
    End If
    End Function

Esempio in vba:

  • miavar = 1245.25478
    cifratroncata = Trunca(miavar, 3)   
    e cifratroncata sarà uguale a 1245,254  (tre decimali)

Esempio in una cella del foglio di lavoro:   =Trunca(riferimentocella; 3) sul foglio di lavoro ci vuole il punto e virgola come separatore degli argomenti.

Il nome che darete alla funzione non ha importanza, chiamatela come vi pare, ma evitate di usare nomi di funzioni già esistenti in excel o in vba.

Buon lavoro.

prelevato sul sito www.ennius.altervista.org