繁体   English   中英

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

[英]Excel vba Union method duplicates cells that overlap

我希望下面的宏显示6,但它显示8.我明白这是因为Union重复了重叠的单元格,就像我的例子中的单元格b1:b2一样:

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

我找到了这个问题的解决方案,但我很想知道为什么这是Union工作的方式,如果还有其他方法来解决这个问题,除了编写上述链接所建议的新功能。

是的,Union运算符实际上更像是SQL中的UNION ALL语句。 Excel的联盟运营商不会返回不同的一组细胞。

我发现很多关于20年前闭源设计决策的推测有点没有意义,尽管有趣的是要注意Excel-VBA处理Union网格的方式与Excel处理电子表格函数中的多个范围选择的方式。 在这:

在此输入图像描述

总和评估为12而不是10.因此,VBA的方法似乎是尝试提出一个Range对象,该对象与Excel本身如何处理重叠选择相对应。 这会将设计决策推迟到VBA之前的Excel。

如果Union没有做你想做的事,那么你需要编写一个不同的功能。 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,

union方法创建一个包含n个区域的范围。

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

此时要说明的是,连续范围必须是矩形。

因此,Union将创建最有效的连续范围块,但可能仍存在一些重叠。

CPearson的网站从一开始就存在,所以你不太可能找到更好的问题来源。 我不是CPearson )。

关心加雷思

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM