Bonjour,
Je livre aussi une fonction personnalisée (pas eu le temps encore de regarder celle fournie par h2so4, mais je vais m'y pencher)
Function REDUIREEXPRESSION(fm As String) As String
Dim exac, exm, m, v, po%, pf%, i%, j%
Application.Volatile
exac = fm
For i = 1 To Len(exac)
Select Case Mid(exac, i, 1)
Case "+": If po <> pf Then Mid(exac, i, 1) = "@"
Case "(": po = po + 1
Case ")": pf = pf + 1
End Select
Next i
exac = Split(exac, "+")
For i = 0 To UBound(exac)
exac(i) = Replace(exac(i), " ", "")
If InStr(exac(i), "x") Then
exm = Split(exac(i), "x")
For j = 0 To UBound(exm)
exm(j) = Replace(Replace(exm(j), "(", ""), ")", "")
If IsNumeric(exm(j)) Then
m = IIf(m <> "", CInt(exm(j)) * m, CInt(exm(j)))
exm(j) = ""
End If
Next j
exm = Trim(Join(exm))
If InStr(exm, "@") Then
exm = Split(exm, "@")
For j = 0 To UBound(exm)
v = InStr(exm(j), Chr(39)) - 1
If v < 0 Then v = InStr(exm(j), Chr(34)) - 1
If v > 0 Then exm(j) = CInt(Left(exm(j), v)) * m & Right(exm(j), _
Len(exm(j)) - v)
Next j
exm = Join(exm, "+")
Else
v = InStr(exm, Chr(39)) - 1
If v < 0 Then v = InStr(exm, Chr(34)) - 1
If v > 0 Then exm = CInt(Left(exm, v)) * m & Right(exm, Len(exm) - v)
End If
exac(i) = exm: m = ""
End If
v = InStr(exac(i), Chr(39))
If v > 0 Then exac(i) = CInt(Left(exac(i), v - 1)) * 60 & Chr(34) & Right(exac(i), _
Len(exac(i)) - v)
Next i
exac = Split(Join(exac, "+"), "+")
For i = 0 To UBound(exac) - 1
If exac(i) <> "" Then
exm = Split(exac(i), Chr(34))(1): v = Val(exac(i))
For j = i + 1 To UBound(exac)
If exac(j) <> "" Then
If InStr(exac(j), exm) Then
v = v + Val(exac(j))
exac(j) = ""
End If
End If
Next j
exac(i) = v & Chr(34) & exm
End If
Next i
exac = Join(exac, "+")
Do While InStr(exac, "++")
exac = Replace(exac, "++", "+")
Loop
If exac Like "*+" Then exac = Left(exac, Len(exac) - 1)
exac = Split(exac, "+")
For i = 0 To UBound(exac)
exm = Split(exac(i), Chr(34))(1): v = Val(exac(i))
If v Mod 60 = 0 Then exac(i) = v \ 60 & Chr(39) & exm
Next i
REDUIREEXPRESSION = Join(exac, " + ")
End Function
En ce qui concerne la fonction ci-dessus, elle ne répondra sans doute pas à tous les cas de figure... J'ai présupposé que les parenthèses n'étaient mises qu'à bon escient, que l'on utilisait soit ' soit " mais pas les deux en même temps que les opérations n'étaient que des + et x, et que l'on n'utilisait que des nombres entiers.
Moyennant quoi, cette fonction renvoie sur l'exemple indiqué le résultat suivant :
5'i1 + 25'i2 + 3'i3 + 1'i4 + 630"i5
Cordialement.