How can we perform common set operations (union, intersection, minus) in MS Excel?

前端 未结 4 1908
梦毁少年i
梦毁少年i 2021-01-05 15:00

For example, I have an xls where :

  • column A has list of items with property A
  • column B has list of items with property B

I need the fol

4条回答
  •  余生分开走
    2021-01-05 15:50

    Well, Microsoft Excel does not handle built-in set operations. But you can emulate then by VBA using MATCH function and error handling.

    Here is the code that worked for me (I presume that you have heading on the first line):

    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
    

提交回复
热议问题