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

pourquoi as tu modifié cette ligne?

Code:
 For num = 1 To 3 ^ 9 - 1

20 titres = mot de 20 bits.. donc un nombre de combinaison énorme: 2 à la puissance 20 = 1 048 576
la macro les calcules TOUTES une par une et les colle si la somme est ta valeur choisie (120)


Exemple avec un mot de 3 bits
tu as 2 ^3 =8 possiblités
000
001
010
100
011
101
110
111


donc. avec 20 titres. je te laisse imaginer le temps que ca va prendre...
d'ailleurs. avec 2^20 le code plante parce que dépassement de capacité.. il faut passer la variable Num en double au lieu de integer..
et etre patient... et avoir un bon PC...
 

jjjdud

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

Ce qui est bizarre c edt que qd je met 3.1^9.1(le max que mon pc peux faire) et19 '0' la j ai 1400 résultat c est le max que j ai reussi a faire si je baisse a 2^8 j ai quelques lignes !
 

jjjdud

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

donc si je comprend bien avec mes 20 lignes il me faudrai 2^20 mais le pc ne veux pas ! dépassement des capacités!
y a t il un moyen de faire sans que ca depasse? ?
 

Patrice33740

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

Bonjour,

La journée de boulot est terminée, me re voila.
Merci @ vgendron d'avoir repris le flambeau.

Voici le code pour 20 lignes avec les commentaires explicatifs mais
attention il faut être très patient, chez moi il faut 45 minutes !
Et pour chaque ligne supplémentaire tu doubles le temps
Code:
Option Explicit
Private Sub btnTest_Click()
'
Const tot = 260       'Total attendu pour la combinaison
Const nbv = 20        'nombre de valeurs à combiner
Const n°L = 25        'n° de ligne de destination de la 1° combinaison retenue
'
Dim rng As Range      'ligne de destination des combinaisons
Dim bin As String     'nombre binaire
Dim cmb As String     'combinaison
Dim num As Long       'numéro de combinaison
Dim ptr As Byte       'pointeur de digit binaire
Dim sB As Double      'somme colonne B
Dim sC As Double      'somme colonne C
Dim sD As Double      'somme colonne D
Dim sE As Double      'somme colonne E
Dim sF As Double      'somme colonne F
  
  'Définir la ligne de destination des combinaisons
  Set rng = Rows(n°L)
  'Effacer les éventuels résultats précédents
  rng.Resize(Rows.Count - n°L).Clear
  'Arrêter l'actualisation écran et les calculs automatiques
  Application.ScreenUpdating = False
  Application.Calculation = xlCalculationManual
  ' Analyser toutes les combinaisons possibles, en faisant
  ' varier un nombre de 1 à 2^nbre de valeurs à combiner - 1
  ' pour ABCDEFGHIJKLMNOPQRST
  ' de   00000000000000000001 en binaire
  ' à    11111111111111111111 en binaire
  For num = 1 To 2 ^ nbv - 1
    '(ré)Initialiser les variables
    cmb = ""
    sB = 0: sC = 0: sD = 0: sE = 0: sF = 0
    ' Convertir num en chaine binaire de nbv digits
    bin = Right(String(nbv, "0") & Binaire(num), nbv)
    ' Analyser chacun des digits
    For ptr = 1 To Len(bin)
      ' Pour chaque digit est égal à 0 ...
      If Mid(bin, ptr, 1) = "0" Then
        ' ... faire la somme la valeur en colonne F
        sF = sF + Cells(ptr + 1, "F").Value
        ' ... mémoriser la combinaison
        cmb = cmb & Cells(ptr + 1, "A").Value
        ' ... et faire la somme des autres valeurs de la ligne
        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
    ' Si la somme F correspond à la valeur attendue ...
    If sF = tot Then
      '... écrire la combinaison et les sommes
      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
      ' ... definir la destination de la combinaison suivante
      Set rng = rng.Offset(1)
    End If
  Next num
  'Rétablir l'actualisation écran et les calculs automatiques
  Application.ScreenUpdating = True
  Application.Calculation = xlCalculationAutomatic

End Sub

Function Binaire(ByVal Nbre As Long) As String
' Cette fonction récursive permet de convertir un
' nombre décimal (Nbre) en chaine binaire (Binaire)
  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

Et le fichier :
 

Pièces jointes

  • _somme40-2.xlsm
    55.2 KB · Affichages: 74

Discussions similaires

Réponses
3
Affichages
820

Statistiques des forums

Discussions
315 091
Messages
2 116 109
Membres
112 662
dernier inscrit
lou75