Calcul VBA avec formule Excel contenant des lettres
Qui a dit que mon titre est pas explicit ?? :calim2:
Sinon bonjour le forum !
Comme à chaque fois que je viens sur le forum (promis je le fait pas exprès), j'ai un petit gros problème. D'ailleurs qui n'en est pas un car ma solution me convient pour le moment.
Bref je m'explique :
Je possède un UserForm qui demande des informations à l'utilisateur (des chiffres notamment) et une feuille appelé "Paramètres".
Mon UserForm une fois remplie permet de calculer une contrainte suivant certains paramètres, et ceux-ci permette le calcul suivant une formule. Mais pas n'importe laquelle : il y a une formule pour chaque cas de figure (et je vous parle pas du nombre de cas :mouarf:).
Le soucis c'est que ces formules peuvent bouger avec le temps (normes, décisions politique, etc) et que mes petits amis du bureau ne savent pas vraiment se servir de VBA...
Du coup j'ai décidé de rentrer toute mes formules dans la feuille "Paramètres" et suivant les cas appelé telle ou telle formule.
Du coup je demande à VBA de calculer des formules du type (a*g*i)/(D*D*100) en string :aie:
Et pour réussir ce tour de passe passe j'ai créé une fonction qui récupère chaque paramètres un à un pour les multiplier ou les additionner (d'où l'objet de la demande). Mais je la trouve énorme et pas vraiment évolutive, dans le sens où elle ne prends pas en compte les puissances, les additions, les soustractions et ce fait larguer dès que j'ai des "(a*g*i)/(D*D*13.5)*E/(k*l)" par exemple.
Alors oui je sais on peut mettre des conditions à l'utilisateurs mais c'est pas ce qui m'intéresse.
Donc voila ma fonction et si vous avez compris/avez la motive/juste l'envie/êtes curieux, si vous pouviez me donner un petit coup de main pour la rendre universelle (je suis près à repartir de zéro aussi).
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
| Private Function Calcul(formule As Range) As String
init = True
temp = formule.Value
tablcalc = Split(temp, ")")
For Each i In tablcalc
j = temp: If j = "" Or i = "" Then GoTo 10
clé = InStr(j, "(")
If clé = 1 Then X = "*" Else X = Left(i, 1)
If clé = 0 Then
j = Mid(i, 2)
ElseIf init = True Then
j = Mid(i, clé + 1)
Else: j = Mid(i, 3): End If
temp = Mid(temp, clé + Len(i))
multi = Split(j, "*")
div = Split(j, "/")
If UBound(multi) > 0 Then
Start = True
For Each k In multi
If IsNumeric(Format(k, "#0.0")) Then
nb = Val(k)
Else
If k = "e" Then nb = e
If k = "l" Then nb = l
If k = "D" Then nb = D
If k = "F" Then nb = Fo
If k = "f" Then nb = f
If k = "kh" Then nb = kh
End If
calc_temp = IIf(Start = True, nb, nb * calc_temp)
Start = False: Next
End If
If UBound(div) > 0 Then
Start = True
For Each k In div
If IsNumeric(Format(k, "#0.0")) Then
nb = Val(k)
Else
If k = "e" Then nb = e
If k = "l" Then nb = l
If k = "D" Then nb = D
If k = "F" Then nb = Fo
If k = "f" Then nb = f
If k = "kh" Then nb = kh
End If
calc_temp = IIf(Start = True, nb, calc_temp / nb)
Start = False: Next
End If
If UBound(div) = 0 And UBound(multi) = 0 Then
If IsNumeric(Format(j, "#0.0")) Then calc_temp = Val(j)
If j = "e" Then calc_temp = e
If j = "l" Then calc_temp = l
If j = "D" Then calc_temp = D
If j = "F" Then calc_temp = Fo
If j = "f" Then calc_temp = f
If j = "kh" Then calc_temp = kh
End If
If X = "/" Then
Calc = IIf(init = False, Calc / calc_temp, calc_temp): init = False
Else
Calc = IIf(init = False, Calc * calc_temp, calc_temp): init = False
End If
Next
10: Calcul = Calc
End Function |
Petit PS : Oui c'est codé avec les pieds :aie:
Petit PS 2 : Oui je n'y ai pas encore consacré énormément de temps
Petit PS 3 : Oui je suis mazo
Bonne Soirée