我们如何在MS Excel中执行常见的集合操作(​​并集,交集,减号)?

时间:2015-07-02 13:53:39

标签: excel statistics analytics

例如,我有一个xls,其中:

  • 列A包含具有属性A
  • 的项目列表
  • B列包含属性B
  • 的项目列表

我需要以下内容:

  • 列C是A联合B(A& B的唯一项目)
  • 作为A交叉点B的列D(A& B的常用项目)
  • 列E是A减B(A中的项但不是B中的项)
  • 列F是B减A(B中的项目但不是A中的项目)

使用SQL或Python在元素列表上设置操作似乎很容易。但是如何在xls中做到这一点?

注意:它应该是具有最少复制粘贴和点击的自动化。例如,我不想在B下面复制粘贴A,然后“删除重复”以获得A联合B.

5 个答案:

答案 0 :(得分:1)

好吧,Microsoft Excel不处理内置的集合操作。但您可以使用 MATCH 功能和错误处理来模拟VBA。

以下是适用于我的代码(我假设您已经在第一行开头):

Sub set_operations()
    Dim i, j, rangeA, rangeB, rowC, rowD, rowE, rowF As Long
    Dim test1, test2 As Boolean

    rangeA = ActiveSheet.Range("A" & CStr(ActiveSheet.Rows.Count)).End(xlUp).Row()
    rangeB = ActiveSheet.Range("B" & CStr(ActiveSheet.Rows.Count)).End(xlUp).Row()
    rowC = 2
    rowD = 2
    rowE = 2
    rowF = 2
    test1 = False
    test2 = False
    test2 = False

    'A union B
    On Error GoTo errHandler1
    For i = 2 To rangeA
        If Application.Match(ActiveSheet.Cells(i, 1), ActiveSheet.Range("C:C"), 0) > 0 Then
            If test1 = True Then
                ActiveSheet.Cells(rowC, 3) = ActiveSheet.Cells(i, 1)
                rowC = rowC + 1
            End If
        End If
        test1 = False
    Next i
    For j = 2 To rangeB
        If Application.Match(ActiveSheet.Cells(j, 2), ActiveSheet.Range("C:C"), 0) > 0 Then
            If test1 = True Then
                ActiveSheet.Cells(rowC, 3) = ActiveSheet.Cells(j, 2)
                rowC = rowC + 1
            End If
        End If
        test1 = False
    Next j

    'A intersection B
    For i = 2 To rangeA
        On Error GoTo errHandler2
        If Application.Match(ActiveSheet.Cells(i, 1), ActiveSheet.Range("B:B"), 0) > 0 Then
            On Error GoTo errHandler1
            If Application.Match(ActiveSheet.Cells(i, 1), ActiveSheet.Range("D:D"), 0) > 0 Then
                If test1 = True And test2 = False Then
                    ActiveSheet.Cells(rowD, 4) = ActiveSheet.Cells(i, 1)
                    rowD = rowD + 1
                End If
            End If
        End If
        test1 = False
        test2 = False
    Next i

    'A minus B
    For i = 2 To rangeA
        On Error GoTo errHandler2
        If Application.Match(ActiveSheet.Cells(i, 1), ActiveSheet.Range("B:B"), 0) > 0 Then
            On Error GoTo errHandler1
            If Application.Match(ActiveSheet.Cells(i, 1), ActiveSheet.Range("E:E"), 0) > 0 Then
                If test1 = True And test2 = True Then
                    ActiveSheet.Cells(rowE, 5) = ActiveSheet.Cells(i, 1)
                    rowE = rowE + 1
                End If
            End If
        End If
        test1 = False
        test2 = False
    Next i

    'B minus A
    For i = 2 To rangeB
        On Error GoTo errHandler2
        If Application.Match(ActiveSheet.Cells(i, 2), ActiveSheet.Range("A:A"), 0) > 0 Then
            On Error GoTo errHandler1
            If Application.Match(ActiveSheet.Cells(i, 2), ActiveSheet.Range("F:F"), 0) > 0 Then
                If test1 = True And test2 = True Then
                    ActiveSheet.Cells(rowF, 6) = ActiveSheet.Cells(i, 2)
                    rowF = rowF + 1
                End If
            End If
        End If
        test1 = False
        test2 = False
    Next i


errHandler1:
    test1 = True
    Resume Next

errHandler2:
    test2 = True
    Resume Next
End Sub

答案 1 :(得分:1)

交叉点(在A和B中):=IFNA(VLOOKUP(B2,$A$2:$B$42,1,FALSE),"")

联盟(在A或B中):=IFS(A2,A2,B2,B2)请注意,IFS仅是最新版本(截至2018年)。

A-B(仅在A中):=IF(NOT(IFNA(MATCH(A2,$B$2:$B$42,0),FALSE)),IF(A2,A2,""),"")

B-A(仅在B中):=IF(NOT(IFNA(MATCH(B2,$A$2:$A$42,0),FALSE)),IF(B2,B2,""),"")(交换字母)

Screenshot of formulas in action, with color coding.

答案 2 :(得分:1)

Excel 似乎无法完成这项工作。但是,有可用的加载项。您可能想要测试免费和开源的 Power Analytics for Excel。它带有一些完全执行您要求的功能:

Screenshot of some supported set operations of Power Analytics for Excel

在 Excel 365 中的使用

在 Excel 365 Power Analytics for Excel 中允许使用动态数组。此功能仅包含在 Excel 365 中,在 Excel 2019、2016 等中不可用。

在以下示例中,我们只需将 =PA_Sets_And(A2:A11;B2:B6) 写入单个单元格 D2,然后 - 就像魔术一样 - 公式扩展到所需的三行长度。

Usage of Power Analytics for Excel set operations in Excel 365

在 Excel 2019、2016 中的使用,...

这里我们使用 PA_Sets_And 方法来查找单元格 (B2) 是否包含在整个集合 (A2:A11) 的范围内。不像 Excel 365 那样酷,但比 VLOOKUP 好一点 :-)

Usage of Power Analytics for Excel set operations in Excel 365

答案 3 :(得分:0)

您可以简单地使用以下公式获得结果

= IF(LOWER(A4)= LOWER(B4),“”,A4)

答案 4 :(得分:0)

我在几个方面感到惊讶:
(1)2020年现在.....在Excel中仍然没有设置功能
(2)投票率最高的答案(自2018年起)是非常不切实际的:在现实生活中,数据集并非整齐地插入空行,其中空值与另一个数据集不符;这是解决方案的前提。

最实用的解决方案(尽管仍然很尴尬; Microsoft吗?您听到了吗?)是借助数据透视表的解决方法:

  • 添加列以设置A,列名称为“ set_name”,并且列中的所有值均设置为“ A”->枢轴输入A
  • 将列添加到集合B,列名称为“ set_name”,并且列中的所有值均设置为“ B”->枢轴输入B
  • 在枢轴输入A下复制枢轴输入B(无列名;-)以形成关节范围->关节范围
  • 使用
    从关节范围创建数据透视表 ---“集合名称”用于形成数据透视表的列
    ---将透视功能设置为“ count()”

结果是一种“单次热编码”数据透视表,具有:

  • 第一列:A和B的并集(又名所有出现的值)
  • 第二列:仅对在A组中出现的元素使用1个值
    (注意:假设A仅包含UNIQUE元素。否则,
    值> 1是可能的)
  • 第3列:仅1组中出现的元素的1个值
    (与组A相同的警告)
  • 总计列:两组中都显示“ 2”值的值

通过第2列(也称为“集合A”),3(又称为“集合B”)和第4列(又称为“集合A AND集合B”)中的值,可以轻松地在不同的集合和交集上过滤生成的数据透视表)。