Fonction pour fractions

Magic_Doctor

XLDnaute Barbatruc
Bonsoir,

Le titre n'est pas très explicite.
J'ai des fractions. Numérateurs et dénominateurs peuvent prendre n'importe quelle valeur.
Je voudrais supprimer en numérateur et dénominateur les zéros en fin de chiffres inutiles.
Par exemple :

3/4 --> 3/4
3/10 --> 3/10
30/100 --> 3/10
300/100 --> 3
25.600/10.000 --> 256/100

Merci d'avance pour tout tuyau.
 

Magic_Doctor

XLDnaute Barbatruc
Re : Fonction pour fractions

Bonjour jecherche,

Je ne connaissais pas cette astuce-là qui, semble-t-il ne fonctionne qu'en manuel. Ce que je voudrais, c'est une fonction (ex : FractSimple(num As Double, den As Double) As String) qui me donne le même résultat.
J'ai bien essayé ainsi pour voir :
Code:
[L7] = Evaluate("0 " & [M6] & "/" & [N6])
où : [M6] = numérateur et [N6] = dénominateur
mais je n'obtiens qu'un chiffre et non pas une fraction éventuellement simplifiée.
 
Dernière édition:

ROGER2327

XLDnaute Barbatruc
Re : Fonction pour fractions

Bonjour à tous.


À essayer (validation standard) :​
Code:
=A1/10^MIN(MAX((-DROITE(A1;{1;2;3;4;5;6;7;8;9})=0)*{1;2;3;4;5;6;7;8;9});
           MAX((-DROITE(B1;{1;2;3;4;5;6;7;8;9})=0)*{1;2;3;4;5;6;7;8;9}))&"/"
&B1/10^MIN(MAX((-DROITE(A1;{1;2;3;4;5;6;7;8;9})=0)*{1;2;3;4;5;6;7;8;9});
           MAX((-DROITE(B1;{1;2;3;4;5;6;7;8;9})=0)*{1;2;3;4;5;6;7;8;9}))
ou (validation par Ctrl Maj Entrée) :​
Code:
=A1/10^MIN(MAX((-DROITE(A1;LIGNE($1:$9))=0)*LIGNE($1:$9));
           MAX((-DROITE(B1;LIGNE($1:$9))=0)*LIGNE($1:$9)))&"/"
&B1/10^MIN(MAX((-DROITE(A1;LIGNE($1:$9))=0)*LIGNE($1:$9));
           MAX((-DROITE(B1;LIGNE($1:$9))=0)*LIGNE($1:$9)))

P. s. : Ces formules sont prévues pour des nombres positifs en A1 et B1.

Bonne journée.


ℝOGER2327
#8274


Jeudi 19 Merdre 143 (Sainte Fétatoire, super - fête Suprême Quarte)
17 Prairial An CCXXIV, 4,0172h - sureau
2016-W22-7T09:38:29Z
 
Dernière édition:

eriiic

XLDnaute Barbatruc
Re : Fonction pour fractions

Bonjour,

je n'obtiens qu'un chiffre et non pas une fraction éventuellement simplifiée.
si tu veux également réduire :
Code:
Function fraction(numerateur As Double, denominateur As Double) As String
    fraction = Application.Text(numerateur / denominateur, "#?/???")
    If Trim(Split(fraction, "/")(1)) = "1" Then fraction = Split(fraction, "/")(0)
End Function
25.600/10.000 --> 64/25
eric
 

Magic_Doctor

XLDnaute Barbatruc
Re : Fonction pour fractions

Bonjour pierrejean, ROGER, eriiiic,

Merci pour vos réponse.
J'ai retenu celle d'eriiiic qui non seulement est une fonction, mais qui va un peu plus loin que celle de pierrejean.
Pour concrétiser ce que je voulais, j'ai un peu modifié la fonction d'eriiiic.
Le problème est simple : on dispose d'une seringue de tel volume pourvue de tant de graduations. Retranscrire, sous forme fractionnelle, le volume/graduation. On peut rentrer des valeurs tout à fait fantaisistes (seringue de 45,5 mL pouvue de 250 graduations...).
J'ai donc bricolé ça :
VB:
Function FractionSeringue(num As Double, den As Integer) As String
'Fractionne des seringues
'eriiiic / Magic_Doctor
'- num = volume seringue (décimal. Il existe des seringues de 0,3 mL ou de 2,5 mL)
'- den = nombre de graduations de la seringue (toujours entier. Faut quand même pas déconner !!!)
'Ex : num = 2 (mL), den = 100 (graduations) --> 1/50ème de mL/Gr

    Dim x As Byte, fraction As String, y As Byte, PosSlash As Byte, suf As String
    
    x = HowLong(num) 'nombre de décimales après la virgule
    If x > 0 Then
        num = num * 10 ^ x
        den = den * 10 ^ x
    End If
    
    fraction = Application.Text(num / den, "#?/???")
    
    y = Len(fraction)
    PosSlash = InStr(fraction, "/")
    num = Left(fraction, PosSlash - 1)
    den = Right(fraction, y - PosSlash)
    
    If den = 1 Then fraction = num
    
    If den = 1 Or den = 2 Then
        suf = " mL/Gr"
    ElseIf den = 3 Or den = 4 Then
        suf = " de mL/Gr"
    Else
        suf = "ème de mL/Gr"
    End If
    
    FractionSeringue = Trim(fraction) & suf
    
End Function
--------------------------------------------------------------------------
Function HowLong(dNum As Double) As Byte
'Renvoie le nombre de chiffres après la virgule

    Dim SepDec$, tmp, posDec
    
    SepDec = Application.International(xlDecimalSeparator)
    tmp = CStr(dNum)
    posDec = InStr(tmp, SepDec)
      
    If posDec = 0 Then
        HowLong = 0
    Else
        HowLong = Len(tmp) - Len(Right(tmp, posDec))
    End If
    
End Function
Et, ma foi, ça a l'air de marcher pour tous les cas de figures.

En revanche, je n'ai pas bien compris :
Code:
Application.Text(num / den, "#?/???")
 
Dernière édition:

eriiic

XLDnaute Barbatruc
Re : Fonction pour fractions

En revanche, je n'ai pas bien compris :
Code :
Application.Text(num / den, "#?/???")

Format() avec les formats fraction ne fonctionne pas en vba.
La solution est d'utiliser la fonction feuille =Texte(valeur; "format_voulu")
"#?/???" est un des formats de fraction possible (précision de 3 chiffres au dénominateur).
eric
 
Dernière édition:

Discussions similaires

Réponses
22
Affichages
3 K
Réponses
3
Affichages
924
Compte Supprimé 979
C

Statistiques des forums

Discussions
312 189
Messages
2 086 031
Membres
103 101
dernier inscrit
CyberAlex93