Trouver tous les combinaisons possible de la somme

Bonjour chers internautes.

Je commence en précisant que je suis totalement novice en macro, ce qui est un point important!

J’ai besoin d’aide concernant une macro assez complexe à réaliser sur (Excel 2010) pour trouver tous les combinaisons possible et afficher le nombre des résultats trouvé

L'objectif est de fabriquer une grande variété de produits (F)

A+B+C+D-----donne-----------------E------------------------------donne-------F

E= sous-produit

F= produit principal

Trouver tous les combinaisons possible de la somme : (A+B+C+D) = E

Avec :

( b%, c% et d% ) sont les variables

D'avance merci à vous du temps et de l'aide

Bonjour,

Vous n'avez pas encore pas eu de réponse parce que je crois que votre soucis n'est compréhensible que par vous .

Les éléments du classeurs n'éclaircissent rien:

et g , h , i , j son des formules pour atteint la meilleure combinaison pour ( E )

et k , l , m , n son des formules pour atteint la meilleure combinaison pour ( F )

Est ce le sujet d'un devoir ?

désoler pour le retard du a un pb de connexion

( g , h , i , j ) : Les contraintes technologiques pour le produit (E)

(k , l , m , n ) : des indicateurs sur lesquels nous pouvant juger la qualité de produit (F)

Ex : k >65 le produit (F) destiné à…………………………….

Ex : m≤5 le produit (F) destiné à…………………………….

Pour clarifier les choses

une macro classique qui génère toutes les combinaisons et les copie en feuille "calculer".

Sub Combine()
Dim a As Integer, b As Integer, c As Integer, d As Integer, Lig As Integer, T, TR()
Dim F1 As Worksheet, F2 As Worksheet

Col = 1
Set F1 = Worksheets("Feuil1")
Set F2 = Worksheets("calculer")
T = F1.Range("C3:J11")
ReDim T2(1 To UBound(T, 1) ^ 4, 1 To UBound(T, 2))

For a = 1 To UBound(T, 1)
    For b = 1 To UBound(T, 1)
        For c = 1 To UBound(T, 1)
            For d = 1 To UBound(T, 1)
                Lig = Lig + 1
                T2(Lig, 1) = T(a, 1)
                T2(Lig, 2) = T(a, 2)
                T2(Lig, 3) = T(b, 3)
                T2(Lig, 4) = T(b, 4)
                T2(Lig, 5) = T(c, 5)
                T2(Lig, 6) = T(c, 6)
                T2(Lig, 7) = T(d, 7)
                T2(Lig, 8) = T(d, 8)
                Next
        Next
    Next
Next
F2.Range("C16").Resize(UBound(T2, 1), UBound(T2, 2)) = T2
End Sub

Sans plus de précisions sur l'application des contraintes technologiques et les indicateurs : non pris en compte.

Bonne suite

D'abord merci d'avance pour votre aide et pour la réponse rapide

Je pense que je n'ai pas bien expliqué le problème

Je vous présente le problème aussi clairement que possible :

L'objectif est de fabriquer une grande variété de produit(E)

A (0-100%)+B (0-100%)+C (0-100%)+D (0-100%) --------------------------------------------------------------------E

E= produit principal

A,B,C,D= les matières premières utilisées pour fabriquer (E)

a chaque fois on change juste le pourcentage mes les valeurs des cellules (A.B.C.D) sont fixes

ex 01 : A (76%) + B (20%) + C (3%) + D (1%) --------------------------------------------------------------------------------------------------E

ex 02 : A (75%) + B (17.5%) + C (5%) + D (2.5%)--------------------------------------------------------------------------------------------------E

Avec les contrainte du produit (E) :

2,5 > L3/(L4+L5+L6) > 1,5

2,00 > (L4 / (L5+L6) > 3.00

ex 01 :

A % B % C % D % -------------- ------E

53,00 76,00 10,02 20,00 0,78 3,00 5,01 1,00------------------42,36 ----------------------------------------------L3

1,06 76,00 49,42 20,00 91,20 3,00 27,34 1,00----------------- 13,70 ----------------------------------------------L4

0,45 76,00 13,91 20,00 2,41 3,00 4,83 1,00---------------- 3,24 ----------------------------------------------L5

0,19 76,00 7,67 20,00 0,76 3,00 47,80 1,00---------------- 2,18 ----------------------------------------------L6

0,24 76,00 1,74 20,00 0,65 3,00 0,88 1,00---------------- 0,56

0,00 76,00 0,11 20,00 0,02 3,00 0,22 1,00---------------- 0,02

0,00 76,00 2,81 20,00 0,64 3,00 0,64 1,00----------------- 0,59

0,05 76,00 0,12 20,00 0,01 3,00 0,56 1,00--------------------0,07

0,00 76,00 0,01 20,00 0,00 3,00 0,00 1,00------------------- 0,00

ex 02 :

A % B % C % D % E

53,00 75,00 10,02 17,50 0,78 5,00 5,01 2,50 41,67

1,06 75,00 49,42 17,50 91,20 5,00 27,34 2,50 14,69

0,45 75,00 13,91 17,50 2,41 5,00 4,83 2,50 3,01

0,19 75,00 7,67 17,50 0,76 5,00 47,80 2,50 2,72

0,24 75,00 1,74 17,50 0,65 5,00 0,88 2,50 0,54

0,00 75,00 0,11 17,50 0,02 5,00 0,22 2,50 0,03

0,00 75,00 2,81 17,50 0,64 5,00 0,64 2,50 0,54

0,05 75,00 0,12 17,50 0,01 5,00 0,56 2,50 0,07

0,00 75,00 0,01 17,50 0,00 5,00 0,00 2,50 0,00

J'espère vous avoir éclairé pour répondre à ma demande.

Et une nouvelle fois merci à vous

L'objectif est de fabriquer une grande variété de produit(E)

A (0-100%)+B (0-100%)+C (0-100%)+D (0-100%)

le pas de variation du pourcentage est de combien ?

Pour un pas de 1(%) cela représente 1 000 000 combinaisons par lignes.... il y a 9 lignes .....

Ex:

A (1%)+B (1%)+C (1%)+D (97%)

A (1%)+B (1%)+C (2%)+D (96%)

A (1%)+B (1%)+C (3%)+D (95%)

.../...

Par ailleurs toujours pas compris l'histoire des contraintes:

2,5 > L3/(L4+L5+L6) > 1,5

3,00 > (L4 / (L5+L6) > 2.00

L3,L4,L5 et L6 représente quoi ? E pour chacune des 4 premières lignes du tableau ?

le pas de variation du pourcentage est de 0.5 pour A.B.C et de 0.1 pour D

L3,L4,L5 et L6 représente les concentration des élément chimiques de produit (E)

ex : c= la chaux

F=le fer

ex: les concentration des élément chimiques de produit (E)

C=42.5%

S=13.7%

A=3.24%

F=2.18%

M=0.56%

N=0.02

K=0.59

So= 0.07

Cl=0.00

et pour calculer la concentration de chaque élément auna la formule suivent:

Cao = 53*76/100+10.02*20/100+0.78*3/100+5.01*1/100= 42.5% de chaux dans le produit (E)

Fer = 0.19*76/100+7.67*20/100+0.76*3/100+47.8*1/100= 2.18% de fer dans le produit (E)

donc auna :

A % B % C % D % E

C 53,00 76,00 10,02 20,00 0,78 3,00 5,01 1,00 100,00 42,36

S 1,06 76,00 49,42 20,00 91,20 3,00 27,34 1,00 100,00 13,70

A 0,45 76,00 13,91 20,00 2,41 3,00 4,83 1,00 100,00 3,24

F 0,19 76,00 7,67 20,00 0,76 3,00 47,80 1,00 100,00 2,18

M 0,24 76,00 1,74 20,00 0,65 3,00 0,88 1,00 100,00 0,56

N 0,00 76,00 0,11 20,00 0,02 3,00 0,22 1,00 100,00 0,02

K 0,00 76,00 2,81 20,00 0,64 3,00 0,64 1,00 100,00 0,59

So 0,05 76,00 0,12 20,00 0,01 3,00 0,56 1,00 100,00 0,07

Cl 0,00 76,00 0,01 20,00 0,00 3,00 0,00 1,00 100,00 0,00

les contraintes son des formule pour calculer la tolérance (le max et le min ) du pourcentage des élément (E) :

avec : Cao . S . A . F son des élément majeur

et : M . N . K . SO . Cl son des élément mineur

le macro calcule juste les concentration des élément de produit (E) dans cette plage :

ex produit (E)

1) contrainte : 3.5 > S/(A+F) > 2 ex: 13.7/(3.24+2.18) =2.52

2) contrainte 2.5 > A/F > 1.3 ex : 3.24/2.18 =1.48

ex produit (X): A=7.97

F=7.76

2) contrainte 2.5 > A/F > 1.3 = 7.97/7.67=1.04---------------------------- FAUX

Si j'ai bien compris cette fois:

Sub Combine()
Dim a As Single, b As Single, c As Single, T, T2()
Dim F1 As Worksheet, F2 As Worksheet
Dim LR As Long, NB As Long, Cont1 As Double, Cont2 As Double
deb = Timer
Set F1 = Worksheets("Feuil1")
Set F2 = Worksheets("calculer")
T = F1.Range("C3:J11")
LR = 16
For a = 0 To 100 Step 0.5
    T2 = T
    ReDim Preserve T2(1 To UBound(T, 1), 1 To UBound(T, 2) + 2)
    For b = 0 To 100 Step 0.5
        If a + b > 100 Then Exit For
        For c = 0 To 100 Step 0.5
            If a + b + c > 100 Then Exit For
            coef = 100 - (a + b + c)
            'E= (C3 * D3 / 100 + E3 * F3 / 100 + G3 * H3 / 100 + I3 * J3 / 100)
            'E = T(i, 1) * a / 100 + T(i, 3) * b / 100 + T(i, 5) * c / 100 + T(i, 7) * coeff / 100
            For i = LBound(T2, 1) To UBound(T2, 1)
                T2(i, 2) = a
                T2(i, 4) = b
                T2(i, 6) = c
                T2(i, 8) = coef
                T2(i, 9) = a + b + c + coef
                T2(i, 10) = T(i, 1) * a / 100 + T(i, 3) * b / 100 + T(i, 5) * c / 100 + T(i, 7) * coef / 100
            Next
            ' ancienne contrainte 2,5 > L3/(L4+L5+L6) > 1,5
            'ancienne contrainte 2,00 > (L4 / (L5+L6) > 3.00
            'nouvelle contrainte :
                      ' 3,5 >   L4/(L5+L6)  > 2
                      ' 2,5 > L5/L6  > 1,3
            'C  S  a  F  M  N  K  S  Cl
            'L3 L4 L5 L6
            '1  2  3  4  5  6  7  8  9

            Cont1 = T2(2, 10) / (T2(3, 10) + T2(4, 10))
            Cont2 = T2(3, 10) / T2(4, 10)
            If (Cont1 < 3.5 And Cont1 > 2) And (Cont2 < 2.5 And Cont2 > 1.3) Then
                F2.Range("C" & LR).Resize(UBound(T2, 1), UBound(T2, 2)) = T2
                LR = LR + 10
                NB = NB + 1
            End If
        Next
    Next
Next

MsgBox NB & " en " & Timer - deb
End Sub

Je n'ai pas pu tester la copie de toutes les données, étant limité à 65500 lignes avec ma version ancienne de XL et qu'il à 49500 de 10 lignes à copier (495000 lignes).

Sans affichage intégral ça fonctionne.

le pas de variation du pourcentage est de 0.5 pour A.B.C et de 0.1 pour D

Dans le code j'utilise un pas de 0.5 pour A,B et C .

Pour D j'utilise : 100 - (%A + %B + %C) , donc avec un pas de 0.5 également sinon on aura un total de % <> 100

Super Merci. AlgoPlus

j'ai essayé de résoudre mon problème avec se code

Je commence petit à petit à comprendre, je ne suis pas un rapide !

bonjour à tous

et Merci. AlgoPlus le code marche mes j'ai besoin d'aide pour quelque modification :

01)-excel affiche que 1672 en 1050781 !!!

02)-dans le cas ou le pas de variation du pourcentage de D est 0.1(obligation) et de 0.5 pour A.B.C ; comment écrire le code avec

a = 65 To 85

For b = 0 To 35 Step 0.5

For c = 0 To 15 Step 0.5

For d = 0 To 5 Step 0.1

Pour a, b et c, c'est simple il suffit de mettre les bonnes valeurs dans les bornes de boucles (For a=..., For b = ...).

For a = 0 To 100 Step 0.5      '    <==à adapter
    'T2 = T         '  supprimer cette ligne 
    'ReDim Preserve T2(1 To UBound(T, 1), 1 To UBound(T, 2) + 2)    'à supprimer
    For b = 0 To 100 Step 0.5    '    <==à adapter
        If a + b > 100 Then Exit For
        For c = 0 To 100 Step 0.5   '    <==à adapter
            If a + b + c > 100 Then Exit For
            For d = 0 To 5 Step 0.1
                 If a + b + c  + d > 100 Then Exit For
                 For i = LBound(T2, 1) To UBound(T2, 1)
                     T2(i, 2) = a
                     T2(i, 4) = b
                     T2(i, 6) = c
                     T2(i, 8) = d
                     T2(i, 9) = a + b + c + d
                     T2(i, 10) = T(i, 1) * a / 100 + T(i, 3) * b / 100 + T(i, 5) * c / 100 + T(i, 7) * d/ 100
                Next
.../.... le reste sans changement

et déclarer d as Single au niveau des autres déclarations

Oups....

Comme il y a une ligne for en plus, penser à rajouter le Next correspondant.

les lignes

    T2 = T        
    ReDim Preserve T2(1 To UBound(T, 1), 1 To UBound(T, 2) + 2)  

ne doivent pas être supprimées , mais déplacées juste avant :

For a = ...

et d doit être déclaré as Double

Salu AlgoPlus et merci pour votre aide

Le code marche mes le pas de variation de d et touj

0.5 pas 0.1

Ce n'est pas possible !

Montrez le code utilisé qui génère un pas de 0.5 malgré :

For d = 0 To 5 Step 0.1

et

et d doit être déclaré as Double

le code est

code macro

D'après ce code, le résultat est bien un pas de 0.1 pour d et pas 0.5 !

Pour bien montrer les variations du pas j'ai réduit chaque "bloc" à une seule ligne

sans titre 2

bonjour AlgoPlus

désolé mes toujours le même problème et voici le fichier avec macro

J'aurais dû voir le Next mal placé sur l'image incomplète du code:

Dans votre configuration le tableau n'est généré qu'après la boucle for d= ...., alors qu'il doit l'être dans cette boucle.

Apporter cette modification

sans titre 4

tu es vraiment un génie AlgoPlus dans ce domaine

oui ça marche mes j'ai fait quelques modifications par ce que la somme :

a+b+c+d = 100% donne des fois < 100%

Ex : 80% a + 10% b + 0% c + 0% d = 90%

Ces changements sont-ils corrects?

screenshot001

la somme :a+b+c+d = 100% donne des fois < 100%

tous les cas possible jusqu'à 100% sont balayés. Il est possible que les contraintes suppriment des lignes >90% ?

Pour le savoir, il faudrait supprimer dans le code les contraintes et voir si toutes les combinaisons sont traitées.

Le code parait correct, si les next manquant à l'image existent réellement dans le code et sont bien placés

Rechercher des sujets similaires à "trouver tous combinaisons possible somme"