Troncature nombres à virgule

Bonjour,

Je recherche à créer une fonction vba excel permettant de tronquer des nombres avec décimales en ne conservant qu'un nombre fixe de chiffres par exemple 4. Cela donnerait :

12345 retourne 12340

1234,567 retourne 1234

123,4567 retourne 123,4

12,34567 retourne 12,34

1,234567 retourne 1,234

0,0001234567 retourne 0,0001234

Je vous remercie pour votre aide.

Christophe

Bonjour,

Cette formule existe déjà :

NbTronqué = Application.Trunc(Range("A1"),3)

Ou :

Digits = 3
NbTronqué = Int(Range("A1")*10 ^ (Digits))/10 ^ (Digits)

Bonjour,

Merci pour votre réponse rapide. Malheureusement la fonction "Tronque" ne correspond pas à ce que je recherche car elle tronque les décimales de manière fixe quel que soit le nombre de chiffres composant le nombre à tronquer.

Je poursuis mes recherches et ne manquerai pas de poster mes trouvailles si elles sont fructueuses.

Bien cordialement,

Christophe

bonjour,

edit : salut Pedro22

une proposition

Function formatn4(n)
    pointdecimal = Application.DecimalSeparator
    nombre = n
    For i = 1 To Len(nombre)
        If Not Mid(nombre, i, 1) Like "[" & pointdecimal & "0]" Then
            ctr = ctr + 1
        ElseIf ctr > 0 And Mid(nombre, i, 1) = 0 Then
            ctr = ctr + 1
        End If
        If ctr = 4 Then
            nombre = Left(nombre, i)
            Exit For
        End If
    Next i
    If InStr(n, pointdecimal) = 0 And Len(nombre) < Len(n) Then nombre = nombre & String(Len(n) - Len(nombre), "0")
    formatn4 = nombre
End Function

Bonjour,

Merci pour votre réponse rapide. Malheureusement la fonction "Tronque" ne correspond pas à ce que je recherche car elle tronque les décimales de manière fixe quel que soit le nombre de chiffres composant le nombre à tronquer.

Je poursuis mes recherches et ne manquerai pas de poster mes trouvailles si elles sont fructueuses.

Bien cordialement,

Christophe

Au temps pour moi, j'ai lu un peu vite !

Salut h2so4 !

Merci. Merci !

C'est puissant et me fait comprendre que le sujet n'est pas simple.

Ca fonctionne bien sauf pour un nombre de cas médians qui dépend du nombre de décimales :

12345,6789 retourne 1234 au lieu de 12340 ...

Je pense que c'est à cause de :

If InStr(n, pointdecimal) = 0 And Len(nombre) < Len(n) Then nombre = nombre & String(Len(n) - Len(nombre), "0")

Il faut que je fasse aussi marcher mes méninges donc je vais essayer de m'y coller ...

Merci de m'avoir mis sur la piste.

Christophe

Bonjour à tous,

autre méthode :

Function tronqChi(Nombre As Variant, Optional nbSignificatifs As Long = 4) As Double
    Dim Parts() As String
    Parts = Split(Format(Nombre, "0.0#############E+0"), "E")
    tronqChi = Application.RoundDown(Parts(0), nbSignificatifs - 1) & "E" & Parts(1)
End Function

Par défaut j'ai mis 4 chiffres significatifs.

Syntaxes :

=tronqChi(A2)
=tronqChi(A2;3)

eric

PS : éventuellement il faudra compléter si tu veux compter les 0 des décimales comme significatifs (ce qui serait logique)

Actuellement 0.0129999 donne 0.01299.

Je verrai cette am mais je ne sais pas trop ce que tu veux dans ce cas. 0.01299 ou 0.0129 ?

eric

bonjour à tous,

Ca fonctionne bien sauf pour un nombre de cas médians qui dépend du nombre de décimales :

12345,6789 retourne 1234 au lieu de 12340 ...

une correction pour ce cas

Function formatn4(n)
    pointdecimal = Application.DecimalSeparator
    n1 = n
    If InStr(n, pointdecimal) > 4 Then
        n1 = Left(n, InStr(n, pointdecimal) - 1)
    End If
    nombre = n1
    For i = 1 To Len(nombre)
        If Not Mid(nombre, i, 1) Like "[" & pointdecimal & "0]" Then
            ctr = ctr + 1
        ElseIf ctr > 0 And Mid(nombre, i, 1) = 0 Then
            ctr = ctr + 1
        End If
        If ctr = 4 Then
            nombre = Left(nombre, i)
            Exit For
        End If
    Next i
    If InStr(n1, pointdecimal) = 0 And Len(nombre) < Len(n1) Then nombre = nombre & String(Len(n1) - Len(nombre), "0")
    formatn4 = nombre
End Function

ceci dit la solution de eriiic est nettement plus élégante et simple.

Merci à tous ceux qui ont contribué à la résolution de ce problème !

merci h2so4, j'avoue que je n'étais pas mécontent

La version prenant en compte les 0 significatifs :

Function tronqChi(Nombre As Variant, Optional nbSignificatifs As Long = 4, Optional zerosSignicatifs As Boolean = True) As Double
    Dim Parts() As String
    Parts = Split(Format(Nombre, "0.0#############E+0"), "E")
    tronqChi = Application.RoundDown(Parts(0), nbSignificatifs - 1) & "E" & Parts(1)
    If zerosSignicatifs Then tronqChi = Application.RoundDown(tronqChi, nbSignificatifs)
End Function

eric

Rechercher des sujets similaires à "troncature nombres virgule"