Esto te genera todos los tableros. La salida es por la pantalla de inmediato, pero puedes grabarlo en una bd sin dificultad. El ejemplo lo he creado con un tablero pequeño para comprobar el resultado, puedes cambialo con las variables lintMax y lintNumCasillas
Private Sub Command2_Click()
Dim lintMax As Integer
Dim lintNumCasillas As Integer
Dim lintTablero() As Integer
Randomize Timer
lintMax = 5
lintNumCasillas = 3
ReDim lintTablero(1 To lintNumCasillas)
lintTablero(1) = -1 '* Para que el primer nº sea el 0
Comb lintTablero, 1, lintMax
End Sub
Private Sub Comb(rintTablero() As Integer, rintIndice As Integer, rintMax As Integer)
Dim i As Integer, lStr As String
rintTablero(rintIndice) = rintTablero(rintIndice) + 1
If rintTablero(rintIndice) > rintMax Then
'* El tablero no es válido
If rintIndice > 1 Then
Comb rintTablero, rintIndice - 1, rintMax
Else
'* Hemos terminado
End If
ElseIf rintIndice = UBound(rintTablero) Then
'* El tablero está completo
'* Lo mostramos (lo escribimos en una bd, etc.)
lStr = ""
For i = 1 To rintIndice
lStr = lStr & ", " & rintTablero(i)
Next
Debug.Print Mid(lStr, 3)
'* Y seguimos
Comb rintTablero, rintIndice, rintMax
Else
rintTablero(rintIndice + 1) = rintTablero(rintIndice)
Comb rintTablero, rintIndice + 1, rintMax
End If
%