Excel VBA中合并Range时如何避免区域自动合并?
在Excel VBA中创建包含大量独立Area的Range对象
我正在用Excel VBA开发大型复杂数据集的显示界面,为提升效率,计划先将所有值/公式预存入数组,同时准备好带格式信息的Range对象集合,待所有数据生成后一次性应用——这种方式比逐个更新单元格和格式区域效率高得多。
对于单元格颜色、字体这类格式,用Union方法构建Range效果很好,但外围边框这类格式需要保持Range的各个Area完整,否则会出现错误格式化的问题。我知道可以用Collection对象存储单个Range再遍历处理,但想找到直接创建带指定独立Area的Range对象的方法,而非替代方案。
以下代码演示了当前遇到的问题:
Option Explicit Function MergeRanges_KeepingAreasIntact(rIn1 As Range, rIn2 As Range) As Range '省略了空区域、跨工作表等错误检查以简化代码 Set MergeRanges_KeepingAreasIntact = rIn1.Parent.Range(rIn1.Address(False, False) & "," & rIn2.Address(False, False)) End Function Function MergeRanges_AreasNotIntact(rIn1 As Range, rIn2 As Range) As Range '省略了空区域、跨工作表等错误检查以简化代码 Set MergeRanges_AreasNotIntact = Union(rIn1, rIn2) End Function Sub Evaluate() Dim i As Long, rMerge As Range Debug.Print MergeRanges_KeepingAreasIntact(Sheet1.Range("A3:D7"), Sheet1.Range("A8:D12")).Address Debug.Print MergeRanges_AreasNotIntact(Sheet1.Range("A3:D7"), Sheet1.Range("A8:D12")).Address '######################################################## ' 尝试创建包含前100个对角单元格的Range,演示Range函数的限制 '######################################################## On Error Resume Next For i = 1 To 100 If i = 1 Then Set rMerge = Sheet1.Cells(1, 1) Else Set rMerge = MergeRanges_KeepingAreasIntact(rMerge, Sheet1.Cells(i, i)) End If If i <> rMerge.Cells.Count Then Debug.Print "Areas count: ", i, "Address string length:", Len(rMerge.Address(False, False)) Exit For End If Next On Error GoTo 0 '############################################################# ' 运行此过程的结果: '$A$3:$D$7,$A$8:$D$12 '$A$3:$D$12 'Areas count: 59 Address string length: 254 '############################################################# End Sub
现有方法的缺陷
MergeRanges_AreasNotIntact(基于Union)效率高,但当区域上下对齐且宽度相同、或并排且高度相同时,会自动合并区域,无法保留独立Area,不符合边框格式化的需求。MergeRanges_KeepingAreasIntact通过拼接地址字符串创建Range,能保留独立Area,但存在两个问题:一是反复转换地址字符串效率低下,二是Range函数的输入字符串长度限制为255字符,合并约58个区域后就会失效。
目前没有Range.Areas.Add这类方法,请问是否存在其他原生的Range对象控制函数,可以创建包含58个以上区域且保持每个Area独立的Range对象?
内容的提问来源于stack exchange,提问作者j74nilsson
相关产品推荐
相关产品推荐

