Donner conditions à Excel
Bonjour à tous,
Je vous sollicite pour un autre problème si vous voulez bien.
Regardez le fichier joint ( oeuvre de BsAlv
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
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.