请注意我的问题不同于建议重复。建议的副本不会根据选项数量显示所有可能的变体,因此输入 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-combinations-from-single-column但它似乎不起作用。
在 A 列中,如果我输入(每行一个单词):
One
Two
Three
在 B 列中,VBA 给出(在单个单元格中):
one,two,three
它并没有给我所有可能的组合排列,它只是将我输入的内容垂直地改变到一列,然后水平地输出结果。
答案1
以下 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
该宏将适用于 Excel 限制内的 A 列中的任意数量的项目。
答案2
考虑这个例子 A 列数据:- 数字(标题)一二三四五 B 列数据:- 输出(标题)
将此公式粘贴到 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。