Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

trouver la somme de plusieurs lignes excel selon critere

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

  • somme40.xlsx
    13.2 KB · Affichages: 57

vgendron

XLDnaute Barbatruc
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'à ;-)
 

vgendron

XLDnaute Barbatruc
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

  • somme40.xlsm
    28.4 KB · Affichages: 48
  • somme40.xlsm
    28.4 KB · Affichages: 43

Patrice33740

XLDnaute Impliqué
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
 

vgendron

XLDnaute Barbatruc
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

  • somme40.xlsm
    39.8 KB · Affichages: 40
  • somme40.xlsm
    39.8 KB · Affichages: 33
Dernière édition:

jjjdud

XLDnaute Nouveau
Re : trouver la somme de plusieurs lignes excel selon critere

Mzrci pr vos reponse j ai vu le code de patrice je serai incapable de le faire!!! Sinin je vais tester demain ton fichier joint merci beaucoup je fais un retour
 

jjjdud

XLDnaute Nouveau
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
 

jjjdud

XLDnaute Nouveau
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

  • somme 40 bug.xlsm
    25.5 KB · Affichages: 33
Dernière modification par un modérateur:

vgendron

XLDnaute Barbatruc
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
 

vgendron

XLDnaute Barbatruc
Re : trouver la somme de plusieurs lignes excel selon critere

Efface le texte que tu as dans ta cellule I4 "Ce que j'ai"
ainsi qu'en I6 "ce que je veux en semi automatique ou automatique"
 

jjjdud

XLDnaute Nouveau
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

  • somme 40 bug (1).xlsm
    25.5 KB · Affichages: 38

vgendron

XLDnaute Barbatruc
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
 

jjjdud

XLDnaute Nouveau
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

  • _somme40-1 (3).xlsm
    85.5 KB · Affichages: 58

Discussions similaires

Réponses
3
Affichages
821
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…