我如何获得不是联合的范围部分?
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) 结合了整个范围,因此 r1
和 r2
中永远不会有不在 [=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
我知道我可以通过写得到两个范围的并集:
Dim r1 as range
Dim r2 as range
Union(r1, r2)
但是有没有我可以得到在 r1 或 r2 但不在联合中的范围?
Union()
方法 (MSDN Reference) 结合了整个范围,因此 r1
和 r2
中永远不会有不在 [=14= 中的部分].
但是,如果您正在寻找重叠(以及不重叠的单元格),您可以查看 Intersect()
方法 (
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