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

problème de format fraction sous vba

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Roland_M

XLDnaute Barbatruc
Bien le bonjour à tous,

Comment transformer sous vba une valeur en format fraction comme sur cellule,
si je tape 1,5 avec le format fraction "# ?/?" j'obtiens '1 1/2'

par contre en vba
M$ = Format(1.5,"# ?/?") ça ne fonctionne pas !? J'obtiens '1 ?/?'


Merci d'avance

EDIT: j'ai solutionné comme ceci: (en attendant mieux)
Code:
Public Function FChaineFraction(V!) As String
Dim I1%, I2%, V1%, V2!
FChaineFraction = "": V1 = Int(V!): V2 = V! - V1
For I1 = 1 To 99: For I2 = 1 To 99
 If I1 / I2 = V2 Then FChaineFraction = V1 & " " & I1 & "/" & I2: Exit Function
Next: Next
End Function
 
Dernière édition:
Re : problème de format fraction sous vba

Bonjour à tous,

un petit up peut être !?
tout au moins me dire si cette soluce est correct !?

Si notre ami ROGER2327 passait par ici, je suis certain qu'il aurait la réponse !
 
Dernière édition:
Re : problème de format fraction sous vba

Bonjour Roland_M,

Essaie ceci :

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Count > 1 Then Exit Sub
If Not IsNumeric(CStr(Target)) Then Exit Sub
If Int(Target) = Target Then Exit Sub
Dim i As Byte
For i = 1 To 20
  Target.NumberFormat = String(i, "?") & "/" & String(i, "?")
  If Target = Evaluate(Target.Text) Then Exit For
Next
End Sub
A+

A+
 
Re : problème de format fraction sous vba

Bonsoir,

un grand merci à toi Job de m'avoir répondu, c'est ok, mais ...
le résultat que je souhaite est celui-ci, pour voir le résultat souhaité,
fais un essai avec des valeurs du genre 1,2 1,25 1,5 1,75 ... c'est environ ces valeurs là que j'ai à traiter.
pour l'instant ma fonction répond à mes besoins, mais je voulais savoir si c'était bien "pro"
et si qq chose de plus simple existait !?

Code:
Sub Essai()
MsgBox FChaineFraction(1.5)
End Sub

Public Function FChaineFraction(V!) As String
Dim I1%, I2%, V1%, V2!
V1 = Int(V!): V2 = V! - V1: FChaineFraction = Trim(V!) 'si pas de fraction retour val
For I1 = 1 To 99: For I2 = 1 To 99
 If I1 / I2 = V2 Then FChaineFraction = V1 & " " & I1 & "/" & I2: Exit Function
Next: Next
End Function

EDIT: et un bon anniversaire à toi ! j'avais pas encore vu !?
 
Re : problème de format fraction sous vba

Re,

Cette fonction va dans le sens de ce que tu proposes, mais le dénominateur peut avoir jusqu'à 4 chiffres :

Code:
Function Fraction$(x)
If Not IsNumeric(x) Then Fraction = x: Exit Function
If Int(x) = x Then Fraction = x: Exit Function
Dim e, d, i&, j&
e = Int(x)
d = x - Int(x)
For i = 1 To 9998
  For j = 2 To 9999
   If Round(i / j - d, 8) = 0 Then Fraction = e * j + i & "/" & j: Exit Function
  Next j
Next i
Fraction = x
End Function
Pour récupérer la fraction 9998/9999 il faut chez moi 16 secondes.

A+
 
Dernière édition:
Re : problème de format fraction sous vba

re bonjour à tous,

merci job de t'intéresser ! c'est toujours profitable pour tout le monde
bien que ça ne se bouscule pas au portillon !?

pour rappel je souhaite un résultat identique à celui obtenu sur cellule au format fraction
'1.25 > "1 1/4" '1.5 > "1 1/2" '1.6 > "1 3/5"
'1.65 > "1 2/3" '1.75 > "1 3/4" . . .
j'avais essayé en copiant sur une cellule que je formatais .NumberFormat = "# ?/?"
et je rechargeais au format texte exp F$=Range("A1").Text
parfois ça fonctionne parfois pas, ce n'est pas fiable même en jouant sur les formats Text et autres ...

apparemment ma fonction répond à cela, mais je pensais à une formule "magique"
et je vois qu'il faut bien 2 boucles !

par contre ici vois un peu les résultats avec ta fonction !?
je vérifie toujours le résultat sur cellule formatée fraction.


Code:
Sub Essai()
V! = 1.6 '< valeur

T! = Timer: Z$ = FChaineFraction(V!)
MsgBox Timer - T! & vbLf & Z$ '< j'obtient "1 3/4" ce dont je recherche

T! = Timer: Z$ = Fraction(V!)
MsgBox Timer - T! & vbLf & Z$ '< j'obtient rien !?

End Sub


Public Function FChaineFraction$(V!)
Dim I1%, I2%, V1%, V2!
V1 = Int(V!): V2 = V! - V1: FChaineFraction = Trim(V!) 'si pas de fraction retour val
For I1 = 1 To 9998: For I2 = 2 To 9999
 If I1 / I2 = V2 Then FChaineFraction = V1 & " " & I1 & "/" & I2: Exit Function
Next: Next
End Function

Function Fraction$(X)
If Not IsNumeric(X) Then Fraction = X: Exit Function
If Int(X) = X Then Fraction = X: Exit Function
Dim E, D, I&, J&
E = Int(X)
D = X - Int(X)
For I = 1 To 9998
  For J = 2 To 9999
   If Round(I / J - D, 8) = 0 Then Fraction = E * J + I & "/" & J: Exit Function
  Next J
Next I
Fraction = X
End Function
 
Dernière édition:
Re : problème de format fraction sous vba

re

ET VOILA LA formule magique !
elle me donne exactement idem format fraction sur cells et avec ma routine mais sans boucle génial !!!

mais c'est pas facile non plus à trouver !
car Application.Text < à la frappe du point (Text) n'apparaît pas dans les propositions des propriétés !?
j'avais essayé aussi avec format mais sous vba format ne reconnais pas ce format "# ?/?"

un grand merci à toi Si..
et encore merci à Job75 !
bonne journée à vous et au plaisir !
 
Dernière édition:
Re : problème de format fraction sous vba

Re
...
mais c'est pas facile non plus à trouver !
car Application.Text < à la frappe du point (Text) n'apparaît pas dans les propositions des propriétés !?
...
Après les points, tu as des propositions comme
Application.WorksheetFunction.Text
Pour simplifier* la lecture (quand on connait le système 😉) on peut supprimer Application. Ou WorksheetFunction. (mais pas les 2 en même temps 😛).

* ce que je pratique presque toujours.
Certains pensent, sans toujours le dire, "C'est hors norme" mais c'est à eux de prendre le TGV en marche sinon à quoi servirait que M. soft se décarcsasse et propose de nouvelles versions.
(Qui a dit "mais c'était mieux à l'âge de pierre. Ouah ! On se comprenait plus facilement !")
 
Re : problème de format fraction sous vba

Bonjour à tous.


Bonjour à tous,

un petit up peut être !?
tout au moins me dire si cette soluce est correct !?

Si notre ami ROGER2327 passait par ici, je suis certain qu'il aurait la réponse !
C'est trop d'honneur !
Comme j'arrive après la bataille, et que je n'ai rien de mieux sous la main, je vous propose un extra sans rapport avec votre demande : dans le fichier joint, vous trouverez un utilitaire permettant de déterminer les meilleures approximations rationnelles d'un nombre. Sait-on jamais ? Ça peut servir un jour ou l'autre...​


Bonne journée.


ℝOGER2327
#8065


Mercredi 18 Haha 143 (Nativité de Sa Magnificence le Baron Mollet (*Saint Pipe) - fête Suprême Quarte)
1[SUP]er[/SUP] Brumaire An CCXXIV, 5,3503h - pomme
2015-W43-5T12:50:26Z
 

Pièces jointes

Re : problème de format fraction sous vba

Bonjour Roland, salut Si... et Roger,

Je comprends que tu ne veux convertir que des nombres décimaux (nombre de décimales limité).

Et que tu veux isoler la partie entière.

Donc tu peux utiliser :

Code:
Function FractionDec$(x)
If Not IsNumeric(x) Then FractionDec = x: Exit Function
If Int(x) = x Then FractionDec = x: Exit Function
Dim e, d, denum, num
e = Int(CDec(x))
d = CDec(x - e)
denum = CDec(10 ^ (Len(d) - 2))
num = CDec(d * denum)
While Right(num, 1) Mod 2 + Right(denum, 1) Mod 2 = 0
  num = num / 2: denum = denum / 2
Wend
While Right(num, 1) Mod 5 + Right(denum, 1) Mod 5 = 0
  num = num / 5: denum = denum / 5
Wend
FractionDec = IIf(e, e & " ", "") & num & "/" & denum
End Function
Le dénominateur de la fraction est forcément un multiple de 2 et/ou 5.

A+
 
Re : problème de format fraction sous vba

Bonsoir Roland,

En réponse à ton post #8 il faut ajouter un CDec dans ma fonction du post #7 :

Code:
Function Fraction$(X)
If Not IsNumeric(X) Then Fraction = X: Exit Function
If Int(X) = X Then Fraction = X: Exit Function
Dim E, D, I&, J&
E = Int(X)
D = CDec(X - Int(X))
For I = 1 To 9998
  For J = 2 To 9999
   If Round(I / J - D, 8) = 0 Then Fraction = E * J + I & "/" & J: Exit Function
  Next J
Next I
Fraction = X
End Function
Bonne nuit.
 
Re : problème de format fraction sous vba

Bonjour à tous.


Dérivée de mon précédent dépôt (message #12), voyez si cette fonction fait avancer les choses :​
Code:
Function fr$(x, Optional p% = 2) '
'Renvoie, si possible, la meilleure approximation rationnelle
'de x dont le dénominateur possède au plus 'p' chiffres.
Dim a, b#, c#, d#, i%, f, g00, g01, g10, g11
  fr = x
  If IsNumeric(x) Then
    c = Abs(x)
    If c > 0 And c <> Int(c) Then
      d = 10 ^ p
      b = c: a = Int(c)
      g00 = 1: g10 = 0
      g01 = a: g11 = 1
      Do While Round(a - b, 12) <> 0 And i < 39 And g11 < d
        i = i + 1
        b = 1 / (b - a): a = Int(b)
        f = a * g01 + g00: g00 = g01: g01 = f
        f = a * g11 + g10: g10 = g11: g11 = f
      Loop
      If g11 < d Then g00 = g01: g10 = g11
      a = Int(g00 / g10): b = g00 - a * g10
      fr = IIf(x < 0, "-", "") & IIf(a > 0, a & " ", "") & IIf(g10 > 1, b & "/" & g10, "")
    End If
  End If
End Function


Bonne journée.


ℝOGER2327
#8066


Jeudi 19 Haha 143 (*Saint Raphaël, apéritif et philistin - fête Suprême Quarte)
2 Brumaire An CCXXIV, 1,0982h - céleri
2015-W43-6T02:38:09Z
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
5
Affichages
708
Réponses
2
Affichages
670
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…