2012-07-05 34 views
8

Ho bisogno di troncare la quantità di cifre decimali del mio doppio valore per la visualizzazione in una casella di testo. Come si potrebbe raggiungere questo con VBA?Troncare Double con VBA in excel

risposta

7

È possibile utilizzare ROUND per FORMAT in VBA

Ad esempio per mostrare 2 decimali

Dval = 1.56789 

Debug.Print Round(dVal,2) 

Debug.Print Format(dVal,"0.00") 

Nota: È possibile che vi darà 1.57. Quindi, se siete alla ricerca di 1.56 allora si può memorizzare il DVAL in una stringa e poi fare questo

Dim strVal As String 

dVal = 1.56789 
strVal = dVal 

If InStr(1, strVal, ".") Then 
    Debug.Print Split(strVal, ".")(0) & "." & Left(Split(strVal, ".")(1), 2) 
Else 
    Debug.Print dVal 
End If 
6

Se si vuole turno il valore, quindi è possibile utilizzare la funzione Round (ma essere consapevoli del fatto che VBA di La funzione di arrotondamento utilizza l'arrotondamento del banco, noto anche come round-to-even, dove arrotonderà un 5 in su o in giù, per arrotondare usando l'arrotondamento tradizionale, usa Formato).

Se si vuole Tronca il valore senza arrotondamento, allora non c'è bisogno di usare le stringhe come nella risposta accettata - basta usare la matematica:

Dim lDecimalPlaces As Long: lDecimalPlaces = 2 
Dim dblValue As Double: dblValue = 2.345 

Dim lScale = 10^lDecimalPlaces 
Dim dblTruncated As Double: dblTruncated = Fix(dblValue * lScale)/lScale 

Questo produce "2.34".

+0

La funzione di correzione è stata molto utile nel mio caso! – carlossierra

+1

Mi ero dimenticato dell'arrotondamento del banchiere. +1 nonostante il condiscendente jab "basta usare la matematica". Per la semplice visualizzazione del numero come OP richiesto, se non ti interessa molto dell'arrotondamento, Format() è lo strumento per il lavoro ed è più semplice di Fix() (o Int(), che è equivalente a Fix() per numeri positivi). Tuttavia, ci sono casi in cui l'arrotondamento del banchiere causerà domande agli utenti e richiederà una trasformazione più complessa. – GlennFromIowa

4

È possibile utilizzare la funzione Int(). Debug.print Int(1.99543)

or Better:

Public Function Trunc(ByVal value As Double, ByVal num As Integer) As Double 
    Trunc = Int(value * (10^num))/(10^num) 
End Function 

in modo da poter usare Trunc(1.99543, 4) ==>result: 1.9954

0

storia in modo divertente. Stavo scherzando con una rapida funzione di conversione VB. Voglio solo troncare un doppio in un numero intero.

value = Int(83.768) 
value == 83 

Impressionante, qualcosa in VB ha funzionato davvero.

Ops, ho dimenticato che non funziona con i numeri negativi

value = Int(-83.768) 
value == -84 

... sì che è capitato. VB utilizza l'arrotondamento dei banchieri.

Public Function Trunc(ByVal value As Double) As Integer 
    ' Truncate by calling Int on the Absolute value then multiply by the sign of the value. 
    ' Int cannot truncate doubles that are negative 
    Trunc = (Abs(value)/value) * Int(Abs(value)) 
End Function 

Se volete decimali specifici fanno quello Makah fatto solo con Abs di tutto il valore in modo Int può troncare correttamente.

Public Function Trunc2(ByVal value As Double, Optional ByVal num As Integer = 1) As Double 
    ' Truncate by calling Int on the Absolute value then multiply by the sign of the value. 
    ' Int cannot truncate doubles that are negative 
    Dim sign As Integer 
    sign = Abs(value)/value 
    Trunc2 = sign * (Int(Abs(value) * (10^num))/(10^num)) 
End Function