我如何获得不是联合的范围部分?

How do I get the part of a range that is not a union?

我知道我可以通过写得到两个范围的并集:

Dim r1 as range
Dim r2 as range
Union(r1, r2)

但是有没有我可以得到在 r1 或 r2 但不在联合中的范围?

Union() 方法 (MSDN Reference) 结合了整个范围,因此 r1r2 中永远不会有不在 [=14= 中的部分].

但是,如果您正在寻找重叠(以及不重叠的单元格),您可以查看 Intersect() 方法 () 子 TestIt()

Dim r1 As Range, r2 As Range, r3 As Range
    Set r1 = Range("A1:D4")
    Set r2 = Range("C3:F6")
    Set r3 = Intersect(r1, r2)
    r1.Cells.Interior.Color = RGB(255, 0, 0)
    r2.Cells.Interior.Color = RGB(0, 255, 0)
    r3.Cells.Interior.Color = RGB(0, 0, 255)
    If r3 Is Nothing Then
        MsgBox "Ranges do not overlap"
    Else
        MsgBox "r1 and r2 overlap at " & r3.Address
    End If
End Sub

Intersect()方法的图片表示:

有一些与查找 non-intersect 部分相关的有趣函数。我建议@TimWilliam 的回答

如果 x 属于 r1 => x 属于 r1 和其他东西的并集。 属于 r1 的东西不属于联合。 r2 也一样。

Sub CombinedMinusIntersect()

    Dim rng1 As Range, rng2 As Range, c As Range
    Dim rngInt As Range, rngUnion As Range
    Dim rngFinal As Range

    Set rng1 = Range("A1:B5,C6:D10")
    Set rng2 = Range("D9:G16")

    Set rngUnion = Application.Union(rng1, rng2)
    Set rngInt = Application.Intersect(rng1, rng2)

    If Not rngInt Is Nothing Then
        For Each c In rngUnion
            If Application.Intersect(c, rngInt) Is Nothing Then
                If rngFinal Is Nothing Then
                    Set rngFinal = c
                Else
                    Set rngFinal = Application.Union(rngFinal, c)
                End If
            End If
        Next c
    Else
        Set rngFinal = rngUnion
    End If

    rngFinal.Interior.Color = vbYellow

End Sub