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
bonjour AlgoPlus
désolé mes toujours le même problème et voici le fichier avec macro
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