Donner conditions à Excel

Bonjour à tous,

Je vous sollicite pour un autre problème si vous voulez bien.

Regardez le fichier joint ( oeuvre de BsAlv ) qui est composé de combinaisons de chiffres sur 96096 lignes.

Je veux dire à Excel que parmi les chiffres 2-3-9-14-16-19-21-26 qu’ il ne garde que les lignes (ou combinaisons…c’ est pareil ) qui ont au minimum 2 de ces chiffres et au maximum 4 .

Je vous précise que j’ aimerais avoir la formule en question car ça me permettra de l’ utiliser pour des besoins futurs et ainsi j’ éviterai de vous solliciter à chaque fois.

Je vous remercie d’ avance pour votre aide.

bonjour, c'était plus facile d'integrer cette question dans la précédente, donc de 96.000 combinaisons en colonne D:E, il y a 39.000 qui correspondent en colonne J:K (avec un "advanced filter" en G:H)

Effectivement j' aurais pu intégrer cette question avec mais je craignais que ça fasse trop de demandes d' un coup.

Merci pour ta réponse BsAlv mais je ne sais toujours pas comment tu as fait pour arriver à ce résultat. Puis-je avoir la macro s' il te plait ?

Et autre question bête : Est-ce possible d' arriver au même résultat sans macro ? par exemple en donnant des informations manuelles à excel par exemple en passant par mise en forme conditionnelle ou autre ?

Je te remercie d' avance

bonjour Olivier,

le fichier que j'avais posté a une extension ".xlsb", donc contient la macro, que j'ajoutes ici aussi. Si vous poussez ALT+F8, dans ce popup, vous voyez comme 3ième option "modifier" et si vous tapez dessus, vous recevez le code ici dessous. Si vous poussez sur le bouton vert que j'ai ajouté ce soir, cette macro est exécutée.

On peut faire la même chose avec de formules, mais comme votre profil dit que vous avez encore excel-2010, cela sera assez lourd à faire. Savez qu'il y a 142.506 combinaisons possible de 5 chiffres sur 30 chiffres, donc on doit créer plusieurs formules et les copier 142.506 fois. Les dernière versions Excel2021 ou Excel365 sont déjà beaucoup plus puisant, mais là aussi, l'effort sera plus qu'avec cette macro.

Je vous envoies une reponse demain.

Const sSpecial = "2,3,9,14,16,19,21,26"      '<<<<< chiffres speciaux a compter

Sub combinaisons()
     Dim aA, aB, aOut, aAux(1 To 5), aExcl(1 To 15), iSpecial, aSpecial
     t = Timer

     aA = Range("A1:B15")     'ces chiffres en 2 colonnes
     Set dict = CreateObject("scripting.dictionary")
     For i = 1 To UBound(aA)
          aExcl(i) = "-" & aA(i, 1) & "-" & aA(i, 2) & "-"     'les couples à exclurer
          For j = 1 To UBound(aA, 2)
               dict(aA(i, j)) = vbEmpty     'les valeurs à utiliser
          Next
     Next
     aB = dict.keys     'toutes les valeurs dans une matrice
     ReDim aOut(1 To WorksheetFunction.Combin(dict.Count, 5), 1 To 2)     'préparer une matrice avec le max possible combinaisons avec 5 éléments avec ce nombre de chiffres

     dict.RemoveAll
     sp = Split(sSpecial, ",")     'ajouter ces chiffres dans le dictionaire
     For i = 0 To UBound(sp)
          dict(sp(i)) = vbEmpty
     Next

     For j = 1 To 5
          aAux(j) = j - 1
     Next

     Do
          s = ""
          iSpecial = 0
          For j = 1 To UBound(aAux)
               s = s & "-" & aB(aAux(j))
               iSpecial = iSpecial - dict.exists(CStr(aB(aAux(j))))
          Next
          s = s & "-"

          For j = 1 To UBound(aExcl)
               b = (InStr(1, s, aExcl(j), 1) > 0)
               If b Then Exit For
          Next

          If Not b Then
               ptr = ptr + 1
               aOut(ptr, 1) = s
               aOut(ptr, 2) = iSpecial
          End If

          aAux(UBound(aAux)) = aAux(UBound(aAux)) + 1
          If aAux(UBound(aAux)) > UBound(aB) Then
               For j = UBound(aAux) To 2 Step -1
                    If aAux(j) > UBound(aB) - UBound(aAux) + j Then
                         aAux(j - 1) = aAux(j - 1) + 1
                         For k = j To UBound(aAux)
                              aAux(k) = aAux(k - 1) + 1
                         Next
                    Else
                         Exit For
                    End If
               Next
          End If
     Loop While aAux(1) <= UBound(aB) - UBound(aAux) + 1

     T2 = Timer

     With Range("D1:E1")
          If .Parent.AutoFilterMode Then .Parent.AutoFilterMode = False     'RAZ autofilter
          .EntireColumn.ClearContents     'vider ces 2 colonnes
          .Value = Array("Combinaisons", "comptage")     'nouveaux entêtes
          .Offset(1).Resize(ptr, 2).Value = aOut     'coller la matrice
          .CurrentRegion.AdvancedFilter xlFilterCopy, .Parent.Range("G1:H2"), .Parent.Range("J1:K1"), Unique:=False
           .Resize(, 10).EntireColumn.AutoFit    'ajuster largeur colonnes
         End With
      i = Range("J" & Rows.Count).End(xlUp).Row - 1  'nombre de lignes visible = nombre de combinaisons voulu

     MsgBox Format(ptr, "0,000") & " combinaisons ent total" & vbLf & Format(i, "#,###") & " combinaisons après filtrage" & vbLf & Format(T2 - t, "0.0\s"), vbInformation, "Olivier231522"
End Sub

Merci beaucoup pour ces informations et aussi pour la macro BsAlv, je vais me pencher là-dessus de suite.

Alors à demain

le fichier que je vous joint contient pour le moment 3.000 lignes et il est déjà 1.4MB, presque le max que le site permet . Si vous les copier jusqu'à 142.506 vous auriez tous vos combinaisons. Puis il faut commencer avec des formes conditionnelles ou de comptages pour éliminer les faux combinaisons ...

Colonne AS = nombre de chiffres de {2;3;9;14;16;19;21;26} et cela devait etre dans l'interval 2-4, autrement rouge

colonne AT = combinaisons interdit comme 1-2, 3-4, 5-6, etc. Si vous regardez à la formule, pour le moment, c'est jusqu'à 9-10, mais cela doit aller jusqu'à 29-30, rouge = interdit

voila, comment on peut faire cela avec formules

5comb.zip (612.14 Ko)

Je n' avais pas vu votre message, désolé.

Merci beaucoup pour les formules, je vais essayer de comprendre et démêler tout ça demain lol

Je reviendrai vers vous .

Bonjour BsAlv, je reviens avec du retard mais il fallait que je prenne le temps de bien comprendre tout ça. Je te remercie beaucoup, tu as fait de l' excellent travail.

Je te souhaite une bonne fin de journée et à bientôt

merci et aussi une bonne fin de journée.

Rechercher des sujets similaires à "donner conditions"