在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它,让我知道如果你有任何错误?