Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2010 Recherche d'une fonction qui tronque un nombre décimal sans altérer la dernière décimale

Magic_Doctor

XLDnaute Barbatruc
Bonjour,

Existerait-il une fonction permettant de manipuler un nombre décimal de la sorte ?
Supposons que cette fonction s'intitule "MaFonction".
MaFonction(15,3659879;3) --> 15,365 et non pas 15,366
 

Magic_Doctor

XLDnaute Barbatruc
Bonjour mapomme,

En attendant, j'avais bidouillé ça à partir d'une autre fonction que j'avais conservée :
VB:
Function TronquerDec(cell As Range, nbdec As Byte)

Dim tmp$, pos As Byte, res

  tmp = cell.Text
  pos = InStr(1, tmp, Application.International(xlDecimalSeparator))
  If pos = 0 Then
    res = 0
  Else
    res = Left(Right(tmp, Len(tmp) - pos), nbdec)
  End If
  If Len(res) = 1 Then res = res * 10
 
  TronquerDec = res * 10 ^ -nbdec + Int(cell.Value)
 
End Function
Le "TRONQUE" me convient davantage. En Anglais c'est "TRUNC". Mais si je veux l'utiliser en VBA ainsi :
VB:
Sub Essai()

Dim wf As WorksheetFunction

    [M16] = wf.TRUNC([M14], 3)

End Sub
ça plante...
Comment y remédier ?
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Re,

Voir le fichier joint avec la fonction Excel et ma fonction VBA.

Quant à WorksheetFunction.TRUNC, on ne sait pas pourquoi, mais ça ne fonctionne pas. D'où la fonction VBA tronquer().
 

Pièces jointes

  • Magic_doctor- Tronquer- v1.xlsm
    20.7 KB · Affichages: 10

dysorthographie

XLDnaute Accro
VB:
Sub test()
Debug.Print MaFonction(15.3659879, 3)
End Sub
Function MaFonction(V As Double, n As Integer) As Double
Dim T As String
T = Format(V, "#0." & String(100, "0"))
MaFonction = Left(T, Len(T) - 100 + n)
End Function
 

Magic_Doctor

XLDnaute Barbatruc
Bonsoir à tous,

Je viens de tout essayer et ce qui me paraît faire face à toutes les éventualités (nombre négatif, 0 pour le nombre de décimales...) est la solution de dysorthographie.

Cela dit en passant, c'est quand même incroyable qu'un truc en apparence aussi simple soit tellement prise de tête et qu'Excel n'ait pas prévu de fonction pour faire face à cette demande. C'est à croire que cette demande est exceptionnelle...

En tout cas merci pour votre aide.
 

patricktoulon

XLDnaute Barbatruc
re
salut
evaluate "trunc" ne fonctionne pas chez moi 2013

solution1
VB:
Sub test()
MsgBox tronque(15.3659879)
MsgBox tronque("15,3659879")
MsgBox tronque(15)
End Sub

Function tronque(x) As Double 'ici la source (x) doit être variant !!!
tronque = CDbl(Int(x) & IIf(InStr(x, ",") > 0, Mid(x, Len(Int(x)) + 1, 4), ""))
End Function

solution2

VB:
Sub test2()
MsgBox tronque2(15.3659879)
MsgBox tronque2("15,3659879")
MsgBox tronque2(15)
End Sub

Function tronque2(x As String) As Double ' x est en string
tronque2 = CDbl(Mid(x, 1, IIf(InStr(x, ",") > 0, InStr(1, x, ",") + 3, Len(x))))
End Function

solution3
VB:
Sub test3()
MsgBox tronque3(15.3659879)
MsgBox tronque3("15,3659879")
MsgBox tronque3(15)
End Sub

Function tronque3(x As String) As Double ' x est en string
tronque3 = CDbl(Mid(x, 1, IIf(InStr(x, ",") > 0, InStrRev(x, ",") + 3, Len(x))))
End Function

les 3 gèrent la source en double ou string et l'absence de décimales
 

eriiic

XLDnaute Barbatruc
Bonjour,

Je viens de tout essayer et ce qui me paraît faire face à toutes les éventualités (nombre négatif, 0 pour le nombre de décimales...) est la solution de dysorthographie
Parce que ma proposition présente des défauts chez toi ?
Pour rappel :
VB:
Evaluate("trunc(" & a & ", 3)")
eric
 

Dranreb

XLDnaute Barbatruc
Bonjour
Parce que ma proposition présente des défauts chez toi ?
Pour rappel :
VB:
Evaluate("trunc(" & a & ", 3)")
Comme chez tous le monde, comme je m'y attendais, à moins d'avoir un Excel anglais.
Là ce serait mieux :
VB:
MsgBox Evaluate("TRUNC(" & Trim$(Str$(A)) & ",3)")
… mais pas aussi simple à mon avis que le Fix(x * 10 ^ n) / 10 ^ n de mapomme.
 

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…