Спасибо!
Правда мне нужен алгоритм не перестановок а сочетаний.
Нашел статью с кодом (наверное Паскаль), теперь надо перевести в VBA.
Рассмотрим задачу о генерации сочетаний в лексикографическом порядке.
Для примера рассмотрим начальные данные N=6 и M=4. Тогда число сочетаний равно 15.
Начальное сочетание образует последовательность 1, 2, .. m, а последнее n-m+1, … , n.
1234 1256 2345
1235 1345 2346
1236 1346 2356
1245 1356 2456
1246 1456 3456
Переход к следующему сочетанию осуществляется по следующему правилу. Требуется просмотреть текущее сочетание с конца и найти элемент, который можно увеличить. То есть такой элемент что a[i] < > n-k+i. Далее увеличиваем этот элемент на 1, а оставшуюся часть сочетания заполняем числами натурального ряда большими измененного элемента в порядке их следования.
Программа, реализующая генерацию сочетаний:
Program sochets;
var
i,j,n,k: integer;
a:array[0..100] of integer; { массив для хранения сочетаний }
Procedure use; { процедура вывода текущего сочетания }
var i : integer;
begin
writeln;
for i:=1 to k do write(a[i]:3)
end;
Begin
read(n,k); { значения N и M }
for i:=0 to k do a[i]:=i; { формирование первого сочетания }
repeat
use;
i:=k;
while a[i]=n-k+i do dec(i); { поиск элемента для изменения }
inc(a[i]);
for j:=i+1 to k do a[j]:=a[j-1]+1; { изменение правой части сочетания }
until i=0;
end.