trouver la somme de plusieurs lignes excel selon critere

  • Initiateur de la discussion Initiateur de la discussion jjjdud
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

jjjdud

XLDnaute Nouveau
bonjour,
je souhaite trouver une fonction a dérouler (ou pas) me donnant toutes les combinaison possible de sommes de plusieurs linges selon un critère (somme des lignes de la dernière colonne =40)

A 15 -5 2 0 15
B 11 3 0 -9 10
C -2 0 7 -15 5
D -9 0 0 14 5
E 19 -8 7 0 15
F 11 3 0 -9 10
G 17 -8 1 0 15
H 11 5 2 -1 10

CRITERE : tant que la somme des lignes de la colonne 6 (la dernière) = 40 tu renvoi toutes les combinaisons de somme possible des lignes A jusqu'a H

exemple ici on aura comme résultat possible col A+B+C+F ou encore B+H+C+D+F ou encore pas mal d autre possibilité!

cf la pj


merci pour votre aide.
 

Pièces jointes

Re : trouver la somme de plusieurs lignes excel selon critere

Bonjour,

une formule. je doute que ce soit possible. il va falloir passer par du VBA.. à moins que le solveur d'excel ne sache le faire... à tester

et pour le VBA. j'imagine qu'il va falloir commencer par calculer TOUTES les possibilités de combinaisons..
soit. pour 8 titres (de A à H):
il y a 1 combinaison des 8
8 combinaisons de 7 titres
28 comb de 6
56 de 5
70 de 4
56 de 3
28 de2
1 de 8
soit un total de 255
la formule?
pour 8 titres et une combinaison de 4:
Fact(8)/(fact(8-4)*fact(4)

pour chacune, tu calcules ta somme . si c'est égal à 40 (ou un autre critère de ton choix), tu récupères les valeurs des colonnes B à F..

voila; y'a plus qu'à ;-)
 
Re : trouver la somme de plusieurs lignes excel selon critere

Dans la PJ, clique sur le bouton pour lancer la macro de dénombrement:
Ca te donne en colonne L, TOUTES les combinaisons possible avec leur somme associée en colonne M
Colonne N: formule qui met en évidence les combinaisons répondant à la condition "Somme = 40"

ensuite, il va falloir pour chaque combinaison validée, récupérer les datas dans ton tableau jaune
 

Pièces jointes

Re : trouver la somme de plusieurs lignes excel selon critere

Bonjour,

Essaies ce code :
Code:
Option Explicit
Sub test()
Dim rng As Range
Dim bin As String
Dim cmb As String
Dim num As Integer
Dim ptr As Byte
Dim sB As Double
Dim sC As Double
Dim sD As Double
Dim sE As Double
Dim sF As Double
  Set rng = Rows(12)
  For num = 1 To 2 ^ 8 - 1
    cmb = ""
    sB = 0: sC = 0: sD = 0: sE = 0: sF = 0
    bin = Right("00000000" & Binaire(num), 8)
    For ptr = 1 To Len(bin)
      If Mid(bin, ptr, 1) = "0" Then
        sF = sF + Cells(ptr + 1, "F").Value
        cmb = cmb & Cells(ptr + 1, "A").Value
        sB = sB + Cells(ptr + 1, "B").Value
        sC = sC + Cells(ptr + 1, "C").Value
        sD = sD + Cells(ptr + 1, "D").Value
        sE = sE + Cells(ptr + 1, "E").Value
      End If
    Next ptr
    If sF = 40 Then
      rng.Cells(1, "A").Value = cmb
      rng.Cells(1, "B").Value = sB
      rng.Cells(1, "C").Value = sC
      rng.Cells(1, "D").Value = sD
      rng.Cells(1, "E").Value = sE
      rng.Cells(1, "F").Value = sF
      Set rng = rng.Offset(1)
    End If
  Next num
End Sub
Function Binaire(ByVal Nbre As Long) As String
  If Int(Nbre / 2) = 0 Then
    Binaire = CStr(Nbre Mod 2)
  Else
    Binaire = Binaire(Int(Nbre / 2)) & CStr(Nbre Mod 2)
  End If
End Function
 
Re : trouver la somme de plusieurs lignes excel selon critere

Re..
avec la macro "complete"

tu as juste à modifier la valeur en N1 et tu cliques
les combinaisons sont automatiquement collées dans ton tableau bleu

par contre. j'ignore pourquoi à partir de 55, certaines combinaisons ne sont pas prises en compte....


Ha;. et j'allais ajouter que cette usine à gaz était certainement faisable avec d'autres fonctions récursives..
et du coup.. je vois que Patrice (que je salue) le confirme avec quelques lignes ;-)
 

Pièces jointes

Dernière édition:
Re : trouver la somme de plusieurs lignes excel selon critere

merci pour ces fichier patrice et barbatruc 🙂
maintenant je veux le faire à une plus grande échelle et en ne limitant pas à 8 (de A à G) lignes mais plus (20) :
la methode de vgendron à l'air d etre un peu complexe niveau code mais plus facilement comprehensible nioveau sortie excel
je vais essayer de modifier le code pat qui parrait plus simple en rajoutant les ligne G H I....T
merci
 
Re : trouver la somme de plusieurs lignes excel selon critere

j ai essayer de modifier le code pour pouvoir etendre ta methode à 20 ligne a A à T mais il y a un soucis : pourrais t u m'aider à comprendre pourquoi?
Code:
Option Explicit
Private Sub btnTest_Click()
Dim rng As Range
Dim bin As String
Dim cmb As String
Dim num As Integer
Dim ptr As Byte
Dim sB As Double
Dim sC As Double
Dim sD As Double
Dim sE As Double
Dim sF As Double
Dim sG As Double
Dim sH As Double
Dim sI As Double
Dim sJ As Double
Dim sK As Double
Dim sL As Double
Dim sM As Double
Dim sN As Double
Dim sO As Double
Dim sP As Double
Dim sQ As Double
Dim sR As Double
Dim sS As Double
Dim sT As Double
  
  Set rng = Rows(22)
  rng.Resize(Rows.Count - 22).Clear
  
  For num = 1 To 2 ^ 8 - 1
    cmb = ""
    sB = 0: sC = 0: sD = 0: sE = 0: sF = 0: sG = 0:     sH = 0:     sI = 0:     sJ = 0:     sK = 0:     sL = 0:     sM = 0:     sN = 0:     sO = 0:     sP = 0:     sQ = 0:     sR = 0:     sS = 0:     sT = 0


    bin = Right("00000000" & Binaire(num), 20)
    For ptr = 1 To Len(bin)
      If Mid(bin, ptr, 1) = "0" Then
        sT = sT + Cells(ptr + 1, "T").Value
        cmb = cmb & Cells(ptr + 1, "A").Value
        sB = sB + Cells(ptr + 1, "B").Value
        sC = sC + Cells(ptr + 1, "C").Value
        sD = sD + Cells(ptr + 1, "D").Value
        sE = sE + Cells(ptr + 1, "E").Value
        sF = sF + Cells(ptr + 1, "F").Value
        sG = sG + Cells(ptr + 1, "G").Value
        sH = sH + Cells(ptr + 1, "H").Value
      sI = sI + Cells(ptr + 1, "I").Value     ====> cette ligne est jaunie lors du deboggage
        sJ = sJ + Cells(ptr + 1, "J").Value
        sK = sK + Cells(ptr + 1, "K").Value
        sL = sL + Cells(ptr + 1, "L").Value
        sM = sM + Cells(ptr + 1, "M").Value
        sN = sN + Cells(ptr + 1, "N").Value
        sO = sO + Cells(ptr + 1, "O").Value
        sP = sP + Cells(ptr + 1, "P").Value
        sQ = sQ + Cells(ptr + 1, "Q").Value
        sR = sR + Cells(ptr + 1, "R").Value
        sS = sS + Cells(ptr + 1, "S").Value

      End If
    Next ptr
    If sT = 260 Then
      rng.Cells(1, "A").Value = cmb
      rng.Cells(1, "B").Value = sB
      rng.Cells(1, "C").Value = sC
      rng.Cells(1, "D").Value = sD
      rng.Cells(1, "E").Value = sE
      rng.Cells(1, "F").Value = sF
      rng.Cells(1, "E").Value = sE
      rng.Cells(1, "F").Value = sF
      rng.Cells(1, "G").Value = sG
      rng.Cells(1, "H").Value = sH
      rng.Cells(1, "I").Value = sI
      rng.Cells(1, "J").Value = sJ
      rng.Cells(1, "K").Value = sK
      rng.Cells(1, "L").Value = sL
      rng.Cells(1, "M").Value = sM
      rng.Cells(1, "N").Value = sN
      rng.Cells(1, "O").Value = sO
      rng.Cells(1, "P").Value = sP
      rng.Cells(1, "Q").Value = sQ
      rng.Cells(1, "R").Value = sR
      rng.Cells(1, "S").Value = sS
      rng.Cells(1, "T").Value = sT

      Set rng = rng.Offset(1)
    End If
  Next num

End Sub

Function Binaire(ByVal Nbre As Long) As String
  If Int(Nbre / 2) = 0 Then
    Binaire = CStr(Nbre Mod 2)
  Else
    Binaire = Binaire(Int(Nbre / 2)) & CStr(Nbre Mod 2)
  End If
End Function
 

Pièces jointes

Dernière modification par un modérateur:
Re : trouver la somme de plusieurs lignes excel selon critere

Hello

Je pense que le souci vient de cette ligne que tu n'as pas complètement modifiée

bin = Right("00000000" & Binaire(num), 20)

tu es bien passé de 8 à 20..
mais il faut aussi adapter le "masque"
bin = Right("00000000000000000000" & Binaire(num), 20)

pas testé
après. voir directement avec Patrice qui peut sans doute te donner des pistes pour comprendre son code
 
Re : trouver la somme de plusieurs lignes excel selon critere

j ai remodifier le code en gardant les colonne A à F uniquement sans rajouter les autres jusquèà P comme avant.
j ai mis 20 "0" mais je ne sais pas vraiment à quoi ca correspond ce bout d e code.
au final j n'obtient que une seule ligne de resultat au lieu de plusieurs centaines normalement.
le code devient :
Code:
Option Explicit
Private Sub btnTest_Click()
Dim rng As Range
Dim bin As String
Dim cmb As String
Dim num As Integer
Dim ptr As Byte
Dim sB As Double
Dim sC As Double
Dim sD As Double
Dim sE As Double
Dim sF As Double

  Set rng = Rows(24)
  rng.Resize(Rows.Count - 24).Clear
  
  For num = 1 To 2 ^ 8 - 1
    cmb = ""
    sB = 0: sC = 0: sD = 0: sE = 0: sF = 0:
    bin = Right("00000000000000000000" & Binaire(num), 20)
    For ptr = 1 To Len(bin)
  If Mid(bin, ptr, 1) = "0" Then
    sF = sF + Cells(ptr + 1, "F").Value
    cmb = cmb & Cells(ptr + 1, "A").Value
    sB = sB + Cells(ptr + 1, "B").Value
    sC = sC + Cells(ptr + 1, "C").Value
    sD = sD + Cells(ptr + 1, "D").Value
    sE = sE + Cells(ptr + 1, "E").Value



  End If
    Next ptr
    If sF = 260 Then
  rng.Cells(1, "A").Value = cmb
  rng.Cells(1, "B").Value = sB
  rng.Cells(1, "C").Value = sC
  rng.Cells(1, "D").Value = sD
  rng.Cells(1, "E").Value = sE
  rng.Cells(1, "F").Value = sF
  rng.Cells(1, "E").Value = sE
  rng.Cells(1, "F").Value = sF


  Set rng = rng.Offset(1)
    End If
  Next num

End Sub

Function Binaire(ByVal Nbre As Long) As String
  If Int(Nbre / 2) = 0 Then
    Binaire = CStr(Nbre Mod 2)
  Else
    Binaire = Binaire(Int(Nbre / 2)) & CStr(Nbre Mod 2)
  End If
End Function
 

Pièces jointes

Re : trouver la somme de plusieurs lignes excel selon critere

Re,

j ai mis 20 "0" mais je ne sais pas vraiment à quoi ca correspond ce bout d e code.
je crois que le problème vient de la.. je me suis donc penché sur le code à mon tour..
à confirmer par Patrice

voir les commentaires que j'ai ajoutés sur le code de Patrice..
Code:
Option Explicit
Private Sub btnTest_Click()
Dim rng As Range
Dim bin As String
Dim cmb As String
Dim num As Integer
Dim ptr As Byte
Dim sB As Double
Dim sC As Double
Dim sD As Double
Dim sE As Double
Dim sF As Double
Dim sG As Double
Dim sH As Double
Dim sI As Double
Dim sJ As Double
Dim sK As Double
Dim sL As Double
Dim sM As Double
Dim sN As Double
Dim sO As Double
Dim sP As Double
Dim sQ As Double
Dim sR As Double
Dim sS As Double
Dim sT As Double

Dim SomCible As Double

'permet de changer la valeur du critère
SomCible = 40

'zone de destination pour coller les combinaisons
Set rng = Rows(24)
'on efface la zone pour initialiser
rng.Resize(Rows.Count - 24).Clear
  
'pour 8 titres: 2 puissances 8 -1 combinaisons 256-1 = 255
'pour chaque combinaison possible
For num = 1 To 2 ^ 8 - 1
    cmb = ""
    sB = 0: sC = 0: sD = 0: sE = 0: sF = 0: sG = 0: sH = 0: sI = 0: sJ = 0: sK = 0: sL = 0: sM = 0: sN = 0: sO = 0: sP = 0: sQ = 0: sR = 0: sS = 0: sT = 0

    'on reste sur un mot de 8 bits (8 titres)
    bin = Right("00000000" & Binaire(num), 8)
    
    For ptr = 1 To Len(bin)
        If Mid(bin, ptr, 1) = "0" Then
            'nom de la combinaison qui contient les titres A, B.... H
            cmb = cmb & Cells(ptr + 1, "A").Value
            'on fait la somme des critères au fur et à mesure (les 20 critères)
            sB = sB + Cells(ptr + 1, "B").Value
            sC = sC + Cells(ptr + 1, "C").Value
            sD = sD + Cells(ptr + 1, "D").Value
            sE = sE + Cells(ptr + 1, "E").Value
            sF = sF + Cells(ptr + 1, "F").Value
            sG = sG + Cells(ptr + 1, "G").Value
            sH = sH + Cells(ptr + 1, "H").Value
            sI = sI + Cells(ptr + 1, "I").Value
            sJ = sJ + Cells(ptr + 1, "J").Value
            sK = sK + Cells(ptr + 1, "K").Value
            sL = sL + Cells(ptr + 1, "L").Value
            sM = sM + Cells(ptr + 1, "M").Value
            sN = sN + Cells(ptr + 1, "N").Value
            sO = sO + Cells(ptr + 1, "O").Value
            sP = sP + Cells(ptr + 1, "P").Value
            sQ = sQ + Cells(ptr + 1, "Q").Value
            sR = sR + Cells(ptr + 1, "R").Value
            sS = sS + Cells(ptr + 1, "S").Value
            sT = sT + Cells(ptr + 1, "T").Value
        End If
    Next ptr
    'si à la fin de la combinaison, le sT contient la valeur cible (40 ou 120 ou..)
    If sT = SomCible Then
        'alors, on copie la combinaison avec les sommes de critère dans le tableau de résultat
        rng.Cells(1, "A").Value = cmb
        rng.Cells(1, "B").Value = sB
        rng.Cells(1, "C").Value = sC
        rng.Cells(1, "D").Value = sD
        rng.Cells(1, "E").Value = sE
        rng.Cells(1, "F").Value = sF
        rng.Cells(1, "E").Value = sE
        rng.Cells(1, "F").Value = sF
        rng.Cells(1, "G").Value = sG
        rng.Cells(1, "H").Value = sH
        rng.Cells(1, "I").Value = sI
        rng.Cells(1, "J").Value = sJ
        rng.Cells(1, "K").Value = sK
        rng.Cells(1, "L").Value = sL
        rng.Cells(1, "M").Value = sM
        rng.Cells(1, "N").Value = sN
        rng.Cells(1, "O").Value = sO
        rng.Cells(1, "P").Value = sP
        rng.Cells(1, "Q").Value = sQ
        rng.Cells(1, "R").Value = sR
        rng.Cells(1, "S").Value = sS
        rng.Cells(1, "T").Value = sT
        
        Set rng = rng.Offset(1)
    End If
Next num

End Sub

Function Binaire(ByVal Nbre As Long) As String
'cette fonction permet de passer d'une valeur binaire à une autre en changeant les bits un à un..enfin. je crois ;-)
  If Int(Nbre / 2) = 0 Then
    Binaire = CStr(Nbre Mod 2)
  Else
    Binaire = Binaire(Int(Nbre / 2)) & CStr(Nbre Mod 2)
  End If
End Function
 
Re : trouver la somme de plusieurs lignes excel selon critere

as tu lancé ce code?
moi perso j ai lancé un code qui me donne 740 possibilités différentes environ pour une somme de 260 cf pj.
apres je ne sais pas si il y en a plus encore et si la résolution est optimale
 

Pièces jointes

- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Retour