VBA如何高效获取Union合并多区域的外接最小边界范围对象
实现方案说明
VBA没有内置直接获取Union合并区域外接边界范围的方法,你目前的遍历Areas集合的思路本身性能极高,时间复杂度仅和区域块数挂钩,不会遍历所有单元格,完全符合你不使用CurrentRegion、UsedRange、End相关方法的要求,仅需简化冗余逻辑、修正原代码的笔误即可。
方案1:优化版遍历实现(兼容性最好,性能最优)
修复你原代码中maxCol初始化错误的笔误,去掉冗余临时变量,代码更简洁:
Function GetOuterBoundingRange(rngUnion As Range) As Range Dim area As Range Dim minRow As Long, minCol As Long, maxRow As Long, maxCol As Long ' 初始化边界初始值 minRow = Rows.Count minCol = Columns.Count maxRow = 0 maxCol = 0 For Each area In rngUnion.Areas minRow = IIf(area.Row < minRow, area.Row, minRow) maxRow = IIf(area.Row + area.Rows.Count - 1 > maxRow, area.Row + area.Rows.Count - 1, maxRow) minCol = IIf(area.Column < minCol, area.Column, minCol) maxCol = IIf(area.Column + area.Columns.Count - 1 > maxCol, area.Column + area.Columns.Count - 1, maxCol) Next With rngUnion.Parent Set GetOuterBoundingRange = .Range(.Cells(minRow, minCol), .Cells(maxRow, maxCol)) End With End Function
方案2:极简地址处理实现(代码最短,适合同表场景)
如果不要求兼容跨工作表的Union范围,可以用地址替换的投机写法,不需要遍历:
Function GetOuterBoundingRange(rngUnion As Range) As Range Set GetOuterBoundingRange = rngUnion.Parent.Range(Replace(rngUnion.Address, ",", ":")) End Function
原理是把Union地址中分隔不同区域的逗号替换为冒号,Excel解析范围时会自动取所有边界的极值,直接得到外接矩形范围。
内容的提问来源于stack exchange,提问作者casewolf
相关产品推荐
相关产品推荐

