Sub test()
Dim t, deb
deb = Timer
Application.ScreenUpdating = False
With Sheets("Feuil1")
If .FilterMode Then .ShowAllData
.Range("a1").CurrentRegion.ClearContents
t = CombiLettres(8, 15)
.Range("a1").Resize(UBound(t), UBound(t, 2)) = t
End With
MsgBox "durée = " & Format(Timer - deb, "#,##0.00\ sec.")
End Sub
Function CombiLettres(ByVal p As Long, n As Long)
Dim tablo, i&, j&
tablo = TableauCombiPparmiN(p, n)
ReDim result(1 To UBound(tablo), 1 To n)
For i = 1 To UBound(tablo): For j = 1 To UBound(tablo, 2): result(i, tablo(i, j)) = Chr(64 + tablo(i, j)): Next j: Next i
CombiLettres = result
End Function
Function TableauCombiPparmiN(ByVal p As Long, ByVal n As Long)
Dim i&, Inc&, base&, ncombi&, nres&, k&
ReDim Combi&(1 To p)
ReDim Max&(1 To p)
ncombi = Application.WorksheetFunction.Combin(n, p)
ReDim res(1 To ncombi, 1 To p)
For i = 1 To p: Combi(i) = i: Next
For i = 0 To p - 1: Max(p - i) = n - i: Next
nres = nres + 1: For i = 1 To p: res(nres, i) = Combi(i): Next
Inc = p
Do
If Combi(Inc) + 1 > Max(Inc) Then
Inc = Inc - 1
If Inc = 0 Then Exit Do
Else
Combi(Inc) = Combi(Inc) + 1
For i = Inc + 1 To p: Combi(i) = Combi(i - 1) + 1: Next
nres = nres + 1: For i = 1 To p: res(nres, i) = Combi(i): Next
Inc = p
End If
Loop
TableauCombiPparmiN = res
End Function