1

我在 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 之类的其他语言的答案。

谢谢!

4

3 回答 3

3

不确定这是否满足您的平台要求,但这里有一个可以在 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”。

编辑:对于非常大的数据集,这类公式可能效率极低,因此仅在处理几百行或更少行时才考虑使用。

于 2012-05-25T03:28:23.913 回答
1

这是配对的功能:

<?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
于 2012-05-24T12:33:42.537 回答
1

由于您已用 标记了上述问题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

我猜休息保持不变。测试一下,如果你有任何错误,请告诉我?

于 2012-05-24T13:10:59.867 回答