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).
Petit PS : Oui c'est codé avec les pieds
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 2 : Oui je n'y ai pas encore consacré énormément de temps
Petit PS 3 : Oui je suis mazo
Bonne Soirée
Partager