Генерация всех возможных перестановок заданных входных значений

3

Обратите внимание, что мой вопрос отличается от предложенного дубликата . Предлагаемый дубликат не показывает все возможные вариации в зависимости от количества опций, поэтому вход 3 может иметь вариацию 1, 2 и 3 входов. Предлагаемый дубликат всегда обеспечивает 3 входа для каждого варианта.

Кроме того, мой вопрос также требует, чтобы варианты также показывали все возможные порядки входных данных. Предлагаемый дубликат всегда показывает столбец A в самой левой позиции вывода, столбец b в середине вывода и столбец c слева от вывода.

Таким образом, предлагаемый дубликат ничего не ответил на мой вопрос.


Оригинальный вопрос

Как мне создать формулу, которая принимает любое количество заданных входных значений, а затем генерирует выходное значение со всеми возможными комбинациями перестановок на основе заданных входных значений.

Например, если входные значения, как показано ниже

One
Two

Сгенерированный вывод должен быть примерно таким

One
OneTwo
Two
TwoOne

Вот как это должно выглядеть, если даны 3 значения:

введите описание изображения здесь

Кто-нибудь знает, как это сделать в Excel?

Я хотел бы иметь возможность вводить любое количество входных значений, а входными значениями будут любое слово, фраза, число, буквы или комбинационная перестановка всех этих.

Я дал этому попытку https://www.ozgrid.com/forum/forum/help-forums/excel-vba-macros/146983-all-possible-combination-from-single-column, но, похоже, это не работает ,

В столбце А, если я наберу (одно слово в строке):

One
Two
Three

В столбце B VBA дает мне (в одной ячейке):

one,two,three

Он не дает мне все возможные комбинации комбинаций , он просто меняет то, что я набрал вертикально вниз по столбцу, и выводит результаты по горизонтали.

oshirowanen
источник
1
@ cybernetic.nomad Похоже, что Плакат хочет все перестановки, связанные с каждой комбинацией
Студент Гари
ЗАКАЗ важен. в связанном вопросе порядок не важен.
Форвард Эд
2
Поскольку существует ряд конечных чисел (1 048 576), вы можете ограничиться только 9 записями, если вы хотите, чтобы все перестановки записывались в одном столбце. Если я правильно сделал свою математику, вы будете смотреть на 986 409 перестановок. 10 записей дадут 9 864 100, что превышает количество доступных строк.
Форвард Эд
1
Я бы посмотрел на вложенные циклы в VBA. Начните с записи всех отдельных записей, затем повторите процесс, начиная с первой записи, и переберите оставшиеся буквы, затем переходите к следующей записи и перебирайте оставшиеся буквы до тех пор, пока не будут записаны все 2 комбинации. просто продолжайте повторять образец, и в конце концов все будет выписано.
Форвард Эд
1
Вот снимок экрана в случае, если он звонит в колокольчик для идеи с какими-либо функциями Excel или дополнительными функциями, с которыми люди могут быть знакомы: i.imgur.com/zTh37v6.png Возможно, есть PowerShell, который может сделать это, если бы я знал что-то, что я бы попробовал, но это должно быть легко с запросом типа отношения или соединением данных в табличном объекте или чем-то себе, если это применимо с некоторыми из этих функций.
Сок Pimp IT

Ответы:

4

Следующий скрипт VBA создал для меня эту таблицу:

введите описание изображения здесь

Это скрипт:

Option Explicit

Sub PermutationsN()
Dim vElements As Variant, vresult As Variant
Dim lRow As Long, i As Long

vElements = Application.Transpose(Range("A1", Range("A1").End(xlDown)))
Columns("B:Z").Clear

For i = 1 To UBound(vElements)
    ReDim vresult(1 To i)
    Call PermutationsNPR(vElements, i, vresult, lRow, 1)
Next i
End Sub

Sub PermutationsNPR(vElements As Variant, p As Long, vresult As Variant, lRow As Long, iIndex As Integer)
Dim i As Long, unique As Variant

For i = 1 To UBound(vElements)
    vresult(iIndex) = vElements(i)
    If iIndex = p Then
        unique = UniqueArray(vresult)
        If (UBound(vresult) = UBound(unique)) Then
            lRow = lRow + 1
            Cells(lRow, 3).Value = Join(unique)
        End If
    Else
        Call PermutationsNPR(vElements, p, vresult, lRow, iIndex + 1)
    End If
Next i
End Sub


Function UniqueArray(todoarray As Variant) As Variant
  Dim arr As New Collection, a
  Dim i As Long
  On Error Resume Next
  For Each a In todoarray
     arr.Add a, a
  Next
  ReDim returnVal(1 To arr.count)
  For i = 1 To arr.count
     returnVal(i) = arr(i)
  Next
  UniqueArray = returnVal
End Function

Макрос будет работать для любого количества элементов в столбце A в пределах Excel.

harrymc
источник
Очень хороший сценарий Гарри +1. Я проверил и подтвердил, что это именно то, что требуется. Вы должны напряженно работали за деньги на этом один сэр, хорошая работа !!
Сок Pimp IT
2

Рассмотрим этот пример Данные столбца A: - Числа (заголовок) один два три четыре пять данных столбца B: - OutPut (заголовок)

вставить эту формулу в B2: -

=IFERROR(IF(INDEX(OFFSET($A$1,1,0,COUNTA($A$2:$A$20)),ROUNDUP(ROWS($A$1:A1)/COUNTA($A$2:$A$20),))=INDEX(OFFSET($A$1,1,0,COUNTA($A$2:$A$20)),MOD(ROWS($A$1:A1)-1,COUNTA($A$2:$A$20))+1),INDEX(OFFSET($A$1,1,0,COUNTA($A$2:$A$20)),ROUNDUP(ROWS($A$1:A1)/COUNTA($A$2:$A$20),)),INDEX(OFFSET($A$1,1,0,COUNTA($A$2:$A$20)),ROUNDUP(ROWS($A$1:A1)/COUNTA($A$2:$A$20),))&INDEX(OFFSET($A$1,1,0,COUNTA($A$2:$A$20)),MOD(ROWS($A$1:A1)-1,COUNTA($A$2:$A$20))+1)),"")

эта функция работает с колонкой «Числа», имеющей данные до A20.

permutationexcelimage

Вивек
источник
Ваша формула просто дает перестановки для терминов, взятых один и два за один раз, а не все перестановки. Можно сделать такую ​​формулу для определенного количества терминов, хотя она быстро становится безумной. Даже при трех записях формула возмутительна. См. Комментарий Forward Ed о том, что 9 записей - это все, что вписывается в ограничение числа строк в Excel. Это говорит о том, что если ваша формула содержит до 19 записей, она не выполняет то, что было задано в вопросе.
fixer1234