bonsoir,
voici le code avec des commentaires.
Dim dict
Sub aargh()
Set dict = CreateObject("scripting.dictionary") 'on crée un dictionnaire dans lequel on va compter le nombre d'occurrences d'une séquence de numéros
With Sheets("résultats") 'on charge le tableau des numéros dans la table vba d
dl = .Cells(Rows.Count, 1).End(xlUp).Row 'nombre de lignes
d = .Range("C2:G" & dl)
End With
For i = LBound(d) To UBound(d) 'on prend chaque ligne individuellement
trie d, i 'on trie les numéros de la ligne en ordre croissant
combin d, i 'on génère toutes les combinaisons de 1,2,3,4 et 5 numéros avec les numéros de cette ligne
Next i
'on ecrit les résultats dans une nouvelle feuille
With Sheets.Add
.Range("A1").Resize(1, 3) = Split("combinaison,# occurence, # numéros", ",") 'entête
With .Range("A2") 'position où mettre le tableau du dénombrement
.Range("A1").Resize(dict.Count, 1) = Application.Transpose(dict.keys) ' les séquences
.Range("B1").Resize(dict.Count, 1) = Application.Transpose(dict.items) ' leur nombre
.Range("C1").Resize(dict.Count, 1).FormulaR1C1 = "=len(rc[-2])-len(substitute(rc[-2],""-"",""""))-1" 'nombre de numéros dans la séquence
.Range("A1").Resize(dict.Count, 3).Sort key1:=.Range("C1"), order1:=xlAscending, key2:=.Range("B1"), order2:=xlDescending, key3:=.Range("A1"), order3:=xlAscending, Header:=xlNo 'tri croissant sur le nombre de numéros dans la séquence, puis décroissant sur le nombre d'occurrences, enfin croissant sur la séquence
End With
.Range("A1").Resize(1, 3).Columns.AutoFit
End With
End Sub
Sub combin(d, ligne, Optional n = 1, Optional ni = 1, Optional s = "-")
'code recursif
'd= tableau des numéros
'ligne = ligne du tableau à traiter
'n = niveau de recursion
'ni = valeur de départ pour la boucle i
's = séquence des numéros
olds = s 'sauvegarde de la valeur de s
For i = ni To 5
s = s & Format(d(ligne, i), "00") & "-" ' séquence des numéros
dict(s) = dict(s) + 1 'on incrémente le compteur pour cette séquence de numéros
If n < 5 Then combin d, ligne, n + 1, i + 1, s 'on passe au niveau de récursion suivant si on n'a pas encore atteint le niveau 5
s = olds
Next i
End Sub
Sub trie(d, ligne)
'tri des éléments de la ligne du tableau d en ordre croissant
For i = 1 To 4 'on prend tous les numéros de la ligne 1 par 1
k = i 'on initialise l'indice du nombre le plus petit par ceux encore à trier
For j = i + 1 To 5 'on prend tous les numéros suivant le numéro d'indice i
If d(ligne, k) > d(ligne, j) Then k = j 'si on trouve un numéro plus petit on adapte l'indice du nombre le plus petit
Next j
If k <> i Then a = d(ligne, i): d(ligne, i) = d(ligne, k): d(ligne, k) = a 'on échange l'élément d'indice i avec l'élément le plus petit trouvé (indice k)
Next i
End Sub