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 :
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)
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
 if prot+lipides+glucides = 1000 then
Jusqu'ici, ça va encore !

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 :
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
De cette façon, si on fait du pas à pas, on obtient dans notre exemple :
Farine de blé
Farine de mais
Farine de soja
Farine de machin
Et la 5eme farine prendra la valeur de la ligne 5 à 18.
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 :
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
(+10 à chaque fois, je ne suis pas à 1 gramme près dans le mélange)

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