在Google电子表格中从多值组合列表创build唯一对列表

我在Google Spreadsheet中有一堆看起来像这样的行:

a,b,c,d a,d c,d b,d,f a,b,f,g,h,i q,b,b 

…还有。

我需要一种方法来创build这种格式的相关对的唯一列表:

 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 Spreadsheet的脚本语言,Excel 2004的脚本语言或其他类似PHP的答案。

谢谢!

不确定这是否满足您的平台要求,但这里是一个电子表格公式,可以在Google Spreadsheets中使用(不是任何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”。

编辑:对于非常大的数据集,这些公式可能是非常低效的,所以考虑只使用处理几百行或更less。

这是做成对的function:

 <?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解决scheme。

这将给你所有的45个独特的组合,你上面的例子应该有。

我的假设

1)数据位于Sheet1的A栏中

2)列 A没有任何标题

3) Col B中产生的输出

4)您正在使用Excel 2007 +

5)由于q,b,b b,b你认为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一起使用,但replace该行

  .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 

rest仍然是我猜的一样。 testing它,让我知道如果你有任何错误?