Bonjour à tous.
Je suis nouveau sur votre forum, mais on m'en a dit beaucoup de bien.
Je code en ce moment une macro sur excel, et je rencontre des difficultés.
J'avais déjà fait ce code en C++ sur visual studio, il fonctionne bien, mais j'ai besoin d'excel aujourd'hui pour continuer.
Mon programme aujourd'hui est le suivant :
J'ai 18 farines, chacune a un certain pourcentage de protéines, de lipides et de glucides.
Je veux aussi un valeur maxi pour la farine. En gros, dans mon mélange, je ne veux pas qu'il y ai plus de 200 grammes de farine A (par exemple).
On obtient alors un tableau de ce style :
Farine A : 0.8 | 0.1 | 0.1 | 2000.8 étant 80% de protéines, 0.1 étant 10% de lipides puis de glucides, 200 la quantité max de cette farine.
J'ai donc un tableau de 18 farines définies de cette façon.
Je rentre ensuite dans un autre tableau les valeurs que je recherche, à savoir la quantité mini et maxi de protéines, de lipides et de glucides. Par exemple :
Prot : 200 a 300 Lipides : 400 a 500 Glucides : 400 a 450
jusqu'à là, tout va bien.
Maintenant je demande au programme de tester des mélanges de farine, et de me dire si un mélange peut fonctionner. Pour cela je fais :
1) Je fais 3 boucles for, comme ceci :
Ce que je cherche, c'est obtenir 1 kilo de farine, je fais donc un if :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 for prot = prot_mini (200 dans notre cas) to prot_maxi (300 ici) for lipides = lipides_mini (400 dans notre cas) to lipides maxi (500) for glucides = glucides_mini (400) to glucides_maxi (450)
Jusqu'ici, ça va encore !
Code : Sélectionner tout - Visualiser dans une fenêtre à part if prot+lipides+glucides = 1000 then
2) C'est maintenant que les problèmes arrivent.
Pour effectuer tous les mélanges possibles de farine, j'ai pensé à la solution suivante :
J'ai 18 farines, j'ai donc dans mon tableau :
Etc....
Farine de blé Farine de mais Farine de soja Farine de machin Farine de truc Farine de bidule Etc....
J'ai alors fait 5 boucles for, comme je cherche des mélanges de 5 farines maxi.
J'obtiens :
De cette façon, si on fait du pas à pas, on obtient dans notre exemple :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 For A = 1 to 14 For B = 2 to 15 For C = 3 to 16 For D = 4 to 17 For E = 5 to 18
Et la 5eme farine prendra la valeur de la ligne 5 à 18.
Farine de blé Farine de mais Farine de soja Farine de machin
Quand E vaudra 5, on aura le mélange avec farine de truc, quand E vaudra 6 on aura farine de bidule, etc jusqu'à la 18eme farine.
Puis une fois à la 18eme farine, alors on gardera les 3 premières farine, blé mais soja, et la farine de machin deviendra la farine suivante, puis ont recommencera avec le E.
Je pense qu'ainsi je testerais tous les mélanges possibles, du moins c'est la meilleure solution que je vois.
3) Si je ne vous ai pas perdu, on passe à la 3eme étape
Maintenant que l'on a tous les mélanges de farine possible, je veux tester chaque mélange "gramme par gramme".
Par exemple dans notre mélange :
Farine de blé Farine de mais Farine de soja Farine de machin Farine de truc
Je veux voir entre 0 et la valeur maxi de chaque farine si un mélange peut fonctionner. J'aurais par exemple :
Farine de blé de 0 à 200 grammes
Farine de mais de 0 à 300 grammes
Farine de soja de 0 à 100 grammes
Farine de machin de 0 à 400 grammes
Farine de truc de 0 à 200 grammes
Il se peut par exemple que pour 200g de blé, 200g de mais, 200g de soja , 200g de machin, 200g de truc j'obtienne une valeur de prot comprise entre la mini et la maxi du début, pareil pour les lipides, pareil pour les glucides.
Je fais donc :
(+10 à chaque fois, je ne suis pas à 1 gramme près dans le mélange)
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 while i <= blé_max while j <= mais_max while k<= soja_max while l<= machin_max while m<=truc_max if (i*prot_blé + j*prot_mais + k*prot_soja + .....) and (i*lipides_blé + j*lipides_mais + k * lipides_soja + ....) and (i*glucides_blé + j * glucides_mais + ...) then "Ca marche !" m=m+10 wend l=l+10 wend k=k+10 wend j=j+10 wend i=i+10
J'ignore si l'on peut rendre ce programme plus rapide, plus logique, plus ceci ou cela, ce que je voudrais déjà c'est le faire marcher.
A moins que quelque chose vous ai choqué, pour moi jusqu'ici mon programme est "logique", il doit fonctionner. Mais ce n'est pas le cas. Il ne me trouve aucun mélange possible.
Alors que pour les mêmes valeurs d'entrée, mon programme en C++ me trouvait pas moins de 6000 solutions...
Je vous met le code entier ici, peut-être une erreur se balade dedans, perso je n'ai rien vu.
Je vous mets aussi un lien onedrive pour accéder à mon classeur excel, avec les tableaux que j'utilise pour le code.
https://1drv.ms/x/s!As_1dT1GCGFznVu_kuBwPaaurii0
Je compte sur vous pour trouver comment me débloquer !
Merci d'avance.
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97 Sub code() 'Je récupère les valeurs mini et maxi que je recherche' prot_mini = Feuil2.Cells(5, 9).Value prot_maxi = Feuil2.Cells(5, 10).Value lipides_mini = Feuil2.Cells(6, 9).Value lipides_maxi = Feuil2.Cells(6, 10).Value glucides_mini = Feuil2.Cells(7, 9).Value glucides_maxi = Feuil2.Cells(7, 10).Value 'je définie un pas pour mes boucles, dans l'exemple donné je faisais 10 par 10, mais je peux très bien faire 50 par 50' pas = Feuil2.Cells(5, 6).Value test = 10 'Première boucles pour trouver un mélange faisait 1000grammes For prot = prot_mini To prot_maxi For lipides = lipides_mini To lipides_maxi For glucides = glucides_mini To glucides_maxi 'Comme jutilise des oeufs dans le mélange, ils ont une certaine quantité de prot/lipides/glucides 'Je noublis pas de les rajouter dans mon if, comme je les ai retiré juste avant. (Ce n'est qu'un détail) If prot + lipides + glucides + Feuil2.Cells(9, 4) * Feuil2.Cells(11, 3) + Feuil2.Cells(9, 4) * Feuil2.Cells(11, 4) + Feuil2.Cells(9, 4) * Feuil2.Cells(11, 5) = 1000 Then Feuil2.Cells(1, 1).Value = "ok" 'Mes boucles for, pour passer d'une ligne à lautre For ligne1 = 2 To 15 'farine 1 For ligne2 = ligne1 To 16 'farine 2 For ligne3 = ligne2 To 17 'farine 3 For ligne4 = ligne3 To 18 'farine 4 For ligne5 = ligne4 To 19 'farine 5 'Les boucles pour chercher "gramme par gramme" While i <= Feuil1.Cells(ligne1, 5).Value 'Farine 1, de 0 à sa valeur maxi stockée dans le tableau While j <= Feuil1.Cells(ligne2, 5).Value 'farine 2 de 0 à sa valeur maxi While k <= Feuil1.Cells(ligne3, 5).Value 'farine 3 de 0 à sa valeur maxi While l <= Feuil1.Cells(ligne4, 5).Value 'farine 4 de 0 à sa valeur maxi While m <= Feuil1.Cells(ligne5, 5).Value 'farine 5 de 0 à sa valeur maxi 'Si on tombe sur une valeur de prot/lipides/glucides que l'ont recherche, alors If ((i * Feuil1.Cells(ligne1, 2).Value + j * Feuil1.Cells(ligne2, 2).Value + k * Feuil1.Cells(ligne3, 2).Value + l * Feuil1.Cells(ligne4, 2).Value + m * Feuil1.Cells(ligne5, 2).Value) = prot And (i * Feuil1.Cells(ligne1, 3).Value + j * Feuil1.Cells(ligne2, 3).Value + k * Feuil1.Cells(ligne3, 3).Value + l * Feuil1.Cells(ligne4, 3).Value + m * Feuil1.Cells(ligne5, 3).Value) = lipides And (i * Feuil1.Cells(ligne1, 4).Value + j * Feuil1.Cells(ligne2, 4).Value + k * Feuil1.Cells(ligne3, 4).Value + l * Feuil1.Cells(ligne4, 4).Value + m * Feuil1.Cells(ligne5, 4).Value) = glucides) Then 'On affiche le nom de chaque farine (qui se trouve dans le tableau d'origine) Feuil2.Cells(test, 10).Value = Feuil1.Cells(ligne, 1).Value 'farine 1 Feuil2.Cells(test + 1, 10).Value = Feuil1.Cells(ligne + 1, 1).Value 'farine 2 Feuil2.Cells(test + 2, 10).Value = Feuil1.Cells(ligne + 2, 1).Value 'farine 3 Feuil2.Cells(test + 3, 10).Value = Feuil1.Cells(ligne + 3, 1).Value 'farine 4 Feuil2.Cells(test + 4, 10).Value = Feuil1.Cells(ligne + 4, 1).Value 'farine 5 'Puis à coté on affiche la quantité de gramme de chaque farine Feuil2.Cells(test, 11).Value = i ' nombre de grammes de farine 1 Feuil2.Cells(test + 1, 11).Value = j ' nombre de grammes de farine 2 Feuil2.Cells(test + 2, 11).Value = k ' nombre de grammes de farine 3 Feuil2.Cells(test + 3, 11).Value = l ' nombre de grammes de farine 4 Feuil2.Cells(test + 4, 11).Value = m ' nombre de grammes de farine 5 test = test + 7 End If 'On rajoute le pas à chaque farine m = m + pas Wend l = l + pas Wend k = k + pas Wend j = j + pas Wend i = i + pas Wend 'On passe à la ligne suivante pour y trouver la farine suivante Next ligne5 Next ligne4 Next ligne3 Next ligne2 Next ligne1 End If 'On vérifie entre les valeur mini et maxi tous les mélanges qui font 1kilo Next glucides Next lipides Next prot End Sub
Partager