Qui a dit que mon titre est pas explicit ??

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 ).
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

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 : Sélectionner tout - Visualiser dans une fenêtre à part
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
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