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 ?
 

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
 

patricktoulon

XLDnaute Barbatruc
re
demo4.gif
 

Discussions similaires

Statistiques des forums

Discussions
312 164
Messages
2 085 877
Membres
103 009
dernier inscrit
dede972