判断用户选择的Excel单元格区域是否跨页?

VBA应用程序开发过程中,经常需要处理用户选中的单元格区域,有的应用场景中,需要限制用户选中区域位于同一页中(以打印预览显示的分页划分),但是VBA对象模型中并没有提供相应的接口,用于快速查询单元格位于哪个打印页面中,那么只能自己动手丰衣足食了。

示例代码如下。

复制代码
Function IsOnMultiPg(ByRef rRng As Range)
    Dim rData As Range, HPB As HPageBreak
    Dim beforeC As Range, afterC As Range
    IsOnMultiPg = False
    If rRng.Cells.Count = 1 Then Exit Function
    Set rData = rRng.EntireRow
    For Each HPB In ActiveSheet.HPageBreaks
        Set afterC = HPB.Location
        Set beforeC = afterC.Offset(-1, 0)
        If Not ((Intersect(afterC, rData) Is Nothing) Or (Intersect(beforeC, rData) Is Nothing)) Then
            IsOnMultiPg = True
            Exit For
        End If
    Next
End Function

【代码解析】

第4行代码设置函数默认返回值为False,即没有跨页。

第5行代码判断参数rRng包含的单元格个数,如果是单个单元格,那么退出函数,函数返回值为False。

第6行代码获取指定单元格区域所在的行区域。

注意:为了简化示例代码,本过程仅仅检测单元格区域是否跨越行分页符,使用类似的方法,可以实现检测单元格区域是否跨越列分页符。

第7~14行代码循环遍历行分页符。

第8行代码获取行分页符之下的单元格,例如我的电脑打开示例文件,其第一个分页符位于54行和55行之间(各位读者系统默认打印机的设置将影响分页符的位置,可能与我的并不相同),那么HPB.Location返回值为A55。

第9行代码获取行分页符之上的单元格。

第10行代码判断afterC和beforeC是否和rData单元格区域都有交集。

如果满足上述条件,第11行代码设置返回值为True。

第12行代码退出循环过程。

测试代码如下。

复制代码
Sub Demo()
    Dim r As Range
    For Each r In Range("A50:D54,A50:D66").Areas
    If IsOnMultiPg(r) Then
        Debug.Print r.Address(0, 0) & ": 跨页"
    Else
        Debug.Print r.Address(0, 0) & ": 没有跨页"
    End If
    Next
End Sub

【立即窗口】中输出结果如下:

复制代码
A50:D54: 没有跨页
A50:D66: 跨页
相关推荐
码农君莫笑2 个月前
Linux系统上同时打印到物理打印机并生成PDF副本方法研究
linux·前端·chrome·打印·信管通
humors2213 个月前
两种文件类型(pdf/图片)打印A4半张纸方法
adobe·pdf·打印·图片·打印机
Py办公羊大侠4 个月前
Excel批量设置行高,Excel表格设置自动换行后打印显示不全,Excel表格设置最合适的行高后打印显示不全,完美解决方案!!!
python·excel·打印·openpyxl·自动换行·显示不全
差不多就得了吧5 个月前
手机文件可以打印出来吗
智能手机·打印·手机打印·手机如何打印
Amd7948 个月前
使用 nuxi preview 命令预览 Nuxt 应用
服务器·环境·nuxt·项目·命令·预览·构建
Code&Ocean8 个月前
iOS 收集打印日志
ios·打印·日志收集·nslog
△曉風殘月〆9 个月前
WPF打印控件内容
wpf·打印
nongka12209 个月前
微信文件如何直接打印及打印功能在哪里设置?
微信·打印·微信打印·微信小程序打印
nongka122010 个月前
华为手机怎么打印文件?
华为·智能手机·打印·微信打印