我有几列数据想要合并,并获取每个唯一的组合。
跨行或集合列表进行连接很容易,但我宁愿不必输入每个可能的排列......那样会浪费时间。
那么,我怎样才能让 Excel 列出 a、b 和 c 列的每种可能的组合呢?(我不想组合每列中的选项。
因此,例如如果我以“ado”开头,我会喜欢 ado-ar-en、ado-r-en、ado-an-en、ado-n-en......好吧,你知道这是一个很长的列表。
答案1
最简单的方法是单独获取列表并将它们存储在数组中。然后使用数组输出所有可能的组合。此代码将在 3 个不同的列中输出,但如果您需要将它们连接在一个单元格中
Sub combinations()
Dim c1() As Variant
Dim c2() As Variant
Dim c3() As Variant
Dim out() As Variant
Dim j, k, l, m As Long
Dim col1 As Range
Dim col2 As Range
Dim col3 As Range
Dim out1 As Range
Set col1 = Range("A1", Range("A1").End(xlDown))
Set col2 = Range("B1", Range("B1").End(xlDown))
Set col3 = Range("C1", Range("C1").End(xlDown))
c1 = col1
c2 = col2
c3 = col3
Set out1 = Range("E2", Range("G2").Offset(UBound(c1) * UBound(c2) * UBound(c3)))
out = out1
j = 1
k = 1
l = 1
m = 1
Do While j <= UBound(c1)
Do While k <= UBound(c2)
Do While l <= UBound(c3)
out(m, 1) = c1(j, 1)
out(m, 2) = c2(k, 1)
out(m, 3) = c3(l, 1)
m = m + 1
l = l + 1
Loop
l = 1
k = k + 1
Loop
k = 1
j = j + 1
Loop
out1.Value = out
End Sub
答案2
一种方法是创建一个“三维”表来捕获所有组合。您的列表有 11、11 和 5 个条目,因此请创建五个 11x11 表。这五个表中的每一个都将包含涉及第三列中条目之一的组合。每个表中的单元格将反映第一列中的一个项目和第二列中的一个项目的组合。
假设您显示的数据在 中A1:C11
。创建第一个以 开始的表格A15
。我们将用索引号标记表格的行和列,这些索引号将用于查找表格中每个条目的单元格。因此,表格 1 将设置如下:
[A] [B] [C] [D] [E] [F] [G] [H] [I] [J] [K] [L]
[15] 0 1 2 3 4 5 6 7 8 9 10
[16] 0
[17] 1
[18] 2
[19] 3
[20] 4
[21] 5
[22] 6
[23] 7
[24] 8
[25] 9
[26] 10
公式B16
为:
=OFFSET($A$1,$A16,0,)&OFFSET($B$1,B$15,0,)&$C$1
复制此表达式以填充表中的所有单元格。第一个表达式将列表锚定在 A 列中并选择与表的行标签相对应的条目(第一行的偏移量为零,因此它引用列表中的第一个条目)。第二个表达式将列表锚定在 B 列中并选择与列标签相对应的条目。第三个表达式对第一个表中的所有条目使用 C 列列表中的第一个值。表达式中的美元符号将公式锚定到表的行和列标签,因此您可以复制公式来填充表,并且每个单元格将引用正确的标签。与号将三个值连接起来。如果您想在值之间使用分隔符,如显示的连字符,请使用它代替公式中的与号:
&"-"&
因此B16
将显示adaren
或ad-ar-en
。 C16
将显示adren
或ad-r-en
。 B17
将显示adoaren
或ado-ar-en
。
在第一个表格旁边或下方以完全相同的方式创建其他表格,只要方便即可。输入第一个单元格的公式时,指向该表格中的行和列标签。例如,如果第二个表格从第一个表格下方开始,例如, ,则A30
第一个表格单元格将是B31
。该公式中的第一个表达式将使用$A31
而不是$A16
,以及B$30
而不是B$15
。第二个表格中的最后一个表达式将是$C$2
而不是$C$1
。在第三个表格中,它将是$C$3
,依此类推。
这五个表将包含列表条目的所有组合。
答案3
未经测试,我没有可用的 Excel(在家使用 LibreOffice,这在 LibreOffice 中不起作用)。
如果有效 ;-) 它应该/确实:假设“广告”在单元格 A1 中,其余的就在它旁边。只要“当前”单元格不是 A、B 和 C 列中的空单元格,就用合并结果填充 D1 及以下。
子列表 a=1 d=1 当工作表(1).单元格(a,1).文本<>“” astr=工作表(1).单元格(a,1).文本 b=1 当工作表(1).单元格(b,2).文本<>“” bstr=工作表(1).单元格(b,2).文本 c=1 当工作表(1).单元格(c,3).文本<>“” cstr=工作表(1).单元格(c,3).文本 c=c+1 工作表(1).单元格(d,4).text=astr+"-"+bstr+"-"+cstr d=d+1 温德 b=b+1 温德 a=a+1 温德 结束子
答案4
假设您有类似以下的列表...运行宏,您将获得指定格式的所有可能排列
List_A List_B List_C
A1 B1 C1
A2 B2 C2
A3
Sub RandomCombo()
ListA = Application.WorksheetFunction.Transpose(Range("A2:A" & Cells(Rows.Count, "A").End(xlUp).Row).Value) 'data starts in 2nd row
ListB = Application.WorksheetFunction.Transpose(Range("B2:B" & Cells(Rows.Count, "B").End(xlUp).Row).Value) 'data starts in 2nd row
ListC = Application.WorksheetFunction.Transpose(Range("C2:C" & Cells(Rows.Count, "C").End(xlUp).Row).Value) 'data starts in 2nd row
counter = 2
For i = 1 To UBound(ListA)
For j = 1 To UBound(ListB)
For k = 1 To UBound(ListC)
Cells(counter, 4) = ListA(i) & "-" & ListB(j) & "-" & ListC(k)
counter = counter + 1
Next k
Next j
Next i
End Sub