我在 Google 电子表格中有一堆如下所示的行:
a,b,c,d
a,d
c,d
b,d,f
a,b,f,g,h,i
q,b,b
...然后继续。
我需要一种方法来创建这种格式的相关对的唯一列表:
a,b
a,c
a,d
b,c
b,d
c,d
b,f
d,f
a,f
a,g
a,h
a,i
...然后继续。
知道我会怎么做吗?我愿意接受使用 Google 电子表格的脚本语言、Excel 2004 的脚本语言或 PHP 之类的其他语言的答案。
谢谢!
我在 Google 电子表格中有一堆如下所示的行:
a,b,c,d
a,d
c,d
b,d,f
a,b,f,g,h,i
q,b,b
...然后继续。
我需要一种方法来创建这种格式的相关对的唯一列表:
a,b
a,c
a,d
b,c
b,d
c,d
b,f
d,f
a,f
a,g
a,h
a,i
...然后继续。
知道我会怎么做吗?我愿意接受使用 Google 电子表格的脚本语言、Excel 2004 的脚本语言或 PHP 之类的其他语言的答案。
谢谢!
不确定这是否满足您的平台要求,但这里有一个可以在 Google 电子表格本身中使用的电子表格公式(虽然不是在任何 Excel 版本中):
=ArrayFormula(SORT(TRANSPOSE(SPLIT(CONCATENATE(REPT(UNIQUE(TRANSPOSE(SPLIT(JOIN(",";A:A);",")))&","&TRANSPOSE(UNIQUE(TRANSPOSE(SPLIT(JOIN(",";A:A);","))));(UNIQUE(TRANSPOSE(SPLIT(JOIN(",";A:A);",")))<=TRANSPOSE(UNIQUE(TRANSPOSE(SPLIT(JOIN(",";A:A);",")))))*REGEXMATCH(CONCATENATE(","&SUBSTITUTE(A:A;",";",,")&","&CHAR(9));"(,"&UNIQUE(TRANSPOSE(SPLIT(JOIN(",";A:A);",")))&",[^\t]*,"&TRANSPOSE(UNIQUE(TRANSPOSE(SPLIT(JOIN(",";A:A);","))))&",)|(,"&TRANSPOSE(UNIQUE(TRANSPOSE(SPLIT(JOIN(",";A:A);","))))&",[^\t]*,"&UNIQUE(TRANSPOSE(SPLIT(JOIN(",";A:A);",")))&",)"))&CHAR(9));CHAR(9)))))
它还假设您不想列出“b,a”和“a,b”。
编辑:对于非常大的数据集,这类公式可能效率极低,因此仅在处理几百行或更少行时才考虑使用。
这是配对的功能:
<?php
function make_pairs($str) {
$chars = explode(',', $str);
for ($i = 0; $i <= count($chars); $i++) {
$f = array_shift($chars);
foreach ($chars as $char)
echo "$f,$char\n";
}
}
make_pairs('a,b,c,d');
结果:
a,b
a,c
a,d
b,c
b,d
c,d
由于您已用 标记了上述问题VBA
,因此这是一个 vba 解决方案。
这将为您提供上述示例应该具有的所有 45 种独特组合。
我的假设
1)数据在 Sheet1 的 Col A 中
2) Col A 没有任何标题
3)在 Col B 中生成的输出
4)您正在使用 Excel 2007 +
5)您正在考虑b,b
作为有效组合,因为q,b,b
. 如果不是,则需要添加一个小调整。
Option Explicit
Sub Sample()
Dim ws As Worksheet
Dim lRow As Long, nRow As Long, n As Long
Dim i As Long, j As Long, k As Long
Dim Myar() As String, TempAr() As String
Set ws = Sheet1
lRow = ws.Range("A" & Rows.count).End(xlUp).Row
n = 0: nRow = 1
With ws
For i = 1 To lRow
Myar = Split(.Range("A" & i).Value, ",")
If UBound(Myar) > 1 Then
For j = LBound(Myar) To UBound(Myar)
For k = LBound(Myar) To UBound(Myar)
If j <> k Then
ReDim Preserve TempAr(n)
TempAr(n) = Myar(j) & "," & Myar(k)
n = n + 1
End If
Next k
Next j
Else
ReDim Preserve TempAr(n)
TempAr(n) = .Range("A" & i).Value
n = n + 1
End If
Next i
For i = LBound(TempAr) To UBound(TempAr)
.Range("B" & nRow).Value = TempAr(i)
nRow = nRow + 1
Next i
'~~> Remove duplicates
.Range("$B$1:$B$" & UBound(TempAr) + 1).RemoveDuplicates _
Columns:=1, Header:=xlNo
'~~> Sort data
.Range("$B$1:$B$" & UBound(TempAr) + 1).Sort _
.Range("B1"), xlAscending
Debug.Print "Total Combinations : " & _
Application.WorksheetFunction.CountA(Columns(2))
End With
End Sub
跟进
不确定这是否适用于 Excel 2004 但替换该行
.Range("$B$1:$B$" & UBound(TempAr) + 1).RemoveDuplicates _
Columns:=1, Header:=xlNo
和
For i = 1 To UBound(TempAr)
If Application.WorksheetFunction.CountIf(.Range("B" & i).Value) > 1 Then
.Range("B" & i).ClearContents
End If
End With
我猜休息保持不变。测试一下,如果你有任何错误,请告诉我?