web-dev-qa-db-ja.com

入力値を指定して可能なすべての順列を生成する

私の質問は 推奨される重複 とは異なることに注意してください。提案された複製は、オプションの数に基づいて考えられるすべてのバリエーションを示しているわけではないため、3の入力は1、2、および3の入力のバリエーションを持つことができます。提案された複製は、バリエーションごとに常に3つの入力を提供します。

さらに、私の質問では、入力の可能なすべての順序を示すためにバリエーションも求めています。推奨される複製では、列Aは常に出力の左端の位置にあり、列bは出力の中央にあり、列cは出力の左側にあります。

したがって、提案された重複は私の質問に回答しますしません


元の質問

任意の数の指定された入力値を取り、可能なすべての出力値を生成する数式を作成するにはどうすればよいですか 組み合わせ 指定された入力値に基づく順列。

たとえば、入力値が次のような場合

One
Two

生成された出力は次のようになります

One
OneTwo
Two
TwoOne

3つの値が指定された場合、次のようになります。

enter image description here

誰もがこれをExcelで行う方法を知っていますか?

任意の数の入力値を入力できるようにしたいのですが、入力値は任意の単語、フレーズ、数字、文字、または 組み合わせ それらすべての順列。

私はこれを試しました https://www.ozgrid.com/forum/forum/help-forums/Excel-vba-macros/146983-all-possible-combinations-from-single-column しかし、それは機能していないようです。

A列に入力した場合(1行に1ワード):

One
Two
Three

列Bで、VBAは私に(単一のセルで)与えます:

one,two,three

それは私にすべてを可能にするわけではありません 組み合わせ 順列、それは私が垂直方向に列に入力したものを変更し、水平方向に結果を出力します。

3
oshirowanen

このスプレッドシートを作成してくれた次のVBAスクリプト:

enter image description here

これはスクリプトです:

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

マクロは、Excelの制限内で、A列の任意の数のアイテムに対して機能します。

4
harrymc

この例を考えてみますA列データ:-数値(ヘッダー)1 2 3 4 5 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

2
vivek