Sub GPE2()
Dim Arr As Variant, dArr As Variant, n, sR As Long, i As Long, j As Byte
sR = Range("A" & Rows.Count).End(xlUp).Row
If sR > 1 Then Range("A2:X" & sR).ClearContents
n = Range("C1").Value
If TypeName(n) = "Double" Then
If n < 2 Then Exit Sub Else n = Int(n)
Arr = HoanVi2(n)
If UBound(Arr) > 1048574 Then sR = 1048574 Else sR = UBound(Arr)
dArr = Array("", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j")
For i = 1 To sR
For j = 1 To n
Arr(i, j) = dArr(Arr(i, j))
Next j
Next i
Range("A2").Resize(sR, n) = Arr
End If
End Sub
Private Function HoanVi2(ByVal S As Byte) As Variant
If S < 2 Then Exit Function
Dim Arr As Variant, n As Double, q As Double, m As Double
Dim i As Byte, j As Byte, k As Byte
ReDim Arr(1 To WorksheetFunction.Fact(S), 1 To S)
Arr(1, 1) = 1: n = 1
For k = 2 To S
n = n * k
For m = 1 To n / k
Arr(m, k) = k
Next m
q = m - 1
For i = 1 To k - 1
For m = 1 To n / k
q = q + 1
For j = 1 To k
If j = i Then
Arr(q, j) = k
ElseIf i < j Then
Arr(q, j) = Arr(m, j - 1)
Else
Arr(q, j) = Arr(m, j)
End If
Next j
Next m
Next i
Next k
HoanVi2 = Arr
Erase Arr
End Function