web-dev-qa-db-fra.com

Tronquer Double avec VBA dans Excel

J'ai besoin de tronquer le nombre de décimales de ma double valeur pour l'afficher dans une zone de texte. Comment pourrait-on y parvenir avec vba?

13
Ehudz

Vous pouvez utiliser ROUND pour FORMAT dans VBA

Par exemple pour afficher 2 décimales

Dval = 1.56789

Debug.Print Round(dVal,2)

Debug.Print Format(dVal,"0.00")

Remarque: ce qui précède vous donnera 1.57. Donc, si vous cherchez 1.56 vous pouvez alors stocker le Dval dans une chaîne, puis faire

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
14
Siddharth Rout

Si vous souhaitez arrondir la valeur, vous pouvez utiliser la fonction Arrondir (mais sachez que la fonction Arrondir de VBA utilise l'arrondi de Banker, également connu sous le nom d'arrondi à égal, où il arrondira un 5 vers le haut ou vers le bas; pour arrondir en utilisant l'arrondi traditionnel, utilisez Format).

Si vous souhaitez tronquer la valeur sans arrondir, il n'est pas nécessaire d'utiliser des chaînes comme dans la réponse acceptée - utilisez simplement les mathématiques:

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

Cela donne "2,34".

12
Gary McGill

Vous pouvez utiliser la fonction Int (). Debug.print Int(1.99543)

Ou mieux:

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

Vous pouvez donc utiliser Trunc(1.99543, 4) ==> result: 1.9954

7
Makah

Histoire tellement amusante. Je jouais avec une fonction de conversion rapide VB. Je veux juste tronquer un double en un entier.

value = Int(83.768)
value == 83

Génial, quelque chose en VB a réellement fonctionné.

Oups, j'ai oublié que cela ne fonctionne pas avec des nombres négatifs

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

... ouais c'est juste arrivé. VB utilise l'arrondi bancaire.

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

Si vous voulez des décimales spécifiques, faites ce que Makah a fait uniquement avec Abs autour de la valeur pour que Int puisse tronquer correctement.

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
0
justengel