VBA liste issue d'une combinaison

francoisC

XLDnaute Junior
Bonjour et merci de votre attention,

je souhaite créer, par vba, la liste issue d'une combinaison de n caractères (max 8).

Exemple pour les 5 caractères (12345). Merci beaucoup à vous.
12345 =>correspondant au nombre combin(5;1) : 1 items

1234 =>correspondant au nombre combin(5;2) : 5 items
2345
3451
4512
5123

123 =>correspondant au nombre combin(5;3) : 10 items
124
125
134
135
145
234
235
245
345

12 =>correspondant au nombre combin(5;2) : 10 items
13
14
15
23
24
25
34
35
45

1 =>correspondant au nombre combin(5;2) : 5 items
2
3
4
5

Merci encore
 

KenDev

XLDnaute Impliqué
Bonjour à tous,

J'ai déduit de votre post que tous les caractères sont distincts. Si ce n'est pas le cas vous aurez des doublons. Les résultats sont affichés sur une nouvelle feuille et, éventuellement, sur plusieurs colonnes. Si la sub est stoppée avant son terme, Excel sera en mode calcul manuel. Le nombre de caractères n'est pas illimité mais très supérieur aux limites énoncées.

Cordialement.
KD
VB:
Sub RunAffichCombin()
  Call AffichCombin("A47UI&m1_r")
End Sub

Private Sub AffichCombin(ByVal Mot$)
  Dim Rw&, Co&, Ln&, Lm&, Ta$(), i&, ac&, Cp&, Cb&(), j&, Fin&
  Ln = Len(Mot): ReDim Ta(1 To Ln): Lm = Rows.Count: Co = 1
  For i = 1 To Ln: Ta(i) = Right(Left(Mot, i), 1): Next i
  ac = Application.Calculation: Application.ScreenUpdating = False: Application.Calculation = xlCalculationManual: Sheets.Add
  For i = Ln To 1 Step -1
  Cp = 0: Fin = Ln - i + 1
  Do
  Cp = Cp + 1: Rw = Rw + 1: Cb = CmbNthTab(Ln, i, Cp)
  For j = 1 To i: Cells(Rw, Co) = Cells(Rw, Co) & Ta(Cb(j)): Next j
  If Rw = Lm Then Co = Co + 1: Rw = 0
  Loop Until Cb(1) = Fin
  Next i
  Cells.EntireColumn.AutoFit: Application.Calculation = ac
End Sub
Private Function CmbNthTab(ByVal a&, ByVal b&, ByVal Nth$) As Long()
  Dim Tb&(), i&, x&, d&
  ReDim Tb(b)
  Do
  d = d + 1: x = 0
  For i = a - 1 - Tb(d - 1) To b - d Step -1
  x = x + CmbNb(i, b - d)
  If Not Nth > x Then Exit For
  Next i
  Tb(d) = a - i: Nth = Nth + CmbNb(i, b - d) - x
  Loop Until d = b
  CmbNthTab = Tb
End Function
Private Function CmbNb(ByVal a&, ByVal b&) As Variant
  Dim c&
  c = a - b
  If b < c Then c = b
  If c = 0 Then CmbNb = 1 Else CmbNb = MthFac(a, c) / MthFac(c)
End Function
Private Function MthFac(ByVal a&, Optional Nb& = 0) As Variant
  Dim i&, n&
  If Nb = 0 Then Nb = a
  MthFac = 1
  For i = 0 To Nb - 1: MthFac = MthFac * (a - i): Next i
End Function

Edit:
Après relecture du 1er post, modification des deux premières subs pour affichage de toutes les catégories de combinaison en une seule fois ( = tous les b dans combin(a,b)) au lieu d'avoir à lancer la sub b fois.

Bonjour Staple!
 
Dernière édition:

Statistiques des forums

Discussions
312 190
Messages
2 086 040
Membres
103 105
dernier inscrit
fofana