Excel vba联合方法复制重叠的单元格

我期望下面的macros显示6,但它显示8.我明白,这是因为联盟复制单元格重叠像单元格b1:b2在我的例子中:

Sub a() Dim myRange As Range Set myRange = Application.Union(Range("a1:b2"), Range("b1:b4")) MsgBox myRange.Count End Sub 

我发现这个问题的解决scheme,但我很想知道为什么这是联盟工作的方式,如果有任何其他方式来解决这个问题,除了写一个新的function,如上面的链接build议。

是的,Union运算符更像SQL中的UNION ALL语句。 Excel的联合运算符不会返回不同的单元格集合。

我发现推测20年前的闭源devise决策有点毫无意义,不过有趣的是,Excel-VBA处理Union网格的方式与Excel在电子表格function中处理多个范围select的方式相同。 在这里:

在这里输入图像说明

总和的计算结果为12而不是10.因此,VBA的方法似乎是试图提出一个Range对象,它与Excel本身如何处理重叠select相对应。 这将把devise决定推回到VBA之前的Excel。

如果Union不做你想要的,那么你需要写一个不同的function。 Chip Pearson是一位非常优秀的VBA程序员,所以如果他错过了任何简单的解决方法,我会感到惊讶。 你的实际问题讨论了工会的数量 。 如果这是你想要的,你可以写一个更小的函数:

 Function UnionCount(A As Range, B As Range) As Long Dim adjustment As Long If Not Intersect(A, B) Is Nothing Then adjustment = Intersect(A, B).Cells.Count End If UnionCount = Union(A, B).Cells.Count - adjustment End Function 

然后, UnionCount(Range("A1:B2"), Range("B1:B4"))评估为6。

HIL,

联合方法创build一个具有n个区域的范围。

有趣的是,这个Application.Union(Range("a1:c2"), Range("a1:c2"), Range("a1:c2"))创build了一个单独的区域。 事实上,对于其中一个范围包含所有其他范围的情况,您只能返回1个区域。 例如Application.Union(Range("a1:f2"), Range("b2:d2")) 。 另一个有趣的例子是Application.Union(Range("a1:f2"), Range("b2:d3"), Range("d2:e3"))这个合并范围(b2:e3)并创build了2个区域。

在这一点上要做的一点是,连续的范围必须是矩形的。

因此,联盟将创build最有效的连续的范围块,但仍可能有一些重叠。

CPearson的网站已经出现了,因此你很难find更好的问题来源。 ( 我不是CPearson )。

问候Gareth