Excel多打印区域中如何查找ActiveCell所在的页码?
解决激活单元格页码查找失败的问题
原函数存在几个关键问题导致无法正确返回页码,以下是修正后的代码及问题说明:
修正后的函数
Function FindPage(r As Range) As Long ' 输入单个单元格区域,返回其所在打印页码;不在打印范围内返回0 Dim VCount As Long Dim HCount As Long Dim printRange As Range Dim LastRow As Long Dim LastCol As Long Dim firstRow As Long Dim firstCol As Long Dim V() As Long Dim H() As Long Dim i As Long, X As Long, Y As Long With r.Worksheet ' 优先使用自定义打印区域,无则用UsedRange On Error Resume Next Set printRange = .Range(.PageSetup.PrintArea) On Error GoTo 0 If printRange Is Nothing Then Set printRange = .UsedRange End If firstRow = printRange.Row firstCol = printRange.Column LastRow = printRange.Row + printRange.Rows.Count - 1 LastCol = printRange.Column + printRange.Columns.Count - 1 ' 检查单元格是否在打印范围内 If r.Row < firstRow Or r.Row > LastRow Or r.Column < firstCol Or r.Column > LastCol Then FindPage = 0 Exit Function End If ' 获取分页符数量 VCount = .VPageBreaks.Count + 1 HCount = .HPageBreaks.Count + 1 ReDim V(1 To VCount) ReDim H(1 To HCount) ' 填充纵向分页符列号数组 For i = 1 To VCount - 1 V(i) = .VPageBreaks(i).Location.Column Next i V(VCount) = LastCol + 1 ' 最后一页的右边界设为打印区域最大列+1,避免边界判断错误 ' 填充横向分页符行号数组 For i = 1 To HCount - 1 H(i) = .HPageBreaks(i).Location.Row Next i H(HCount) = LastRow + 1 ' 最后一页的下边界设为打印区域最大行+1 ' 确定单元格所在纵向分页位置 For X = 1 To VCount If r.Column < V(X) Then Exit For End If Next X ' 确定单元格所在横向分页位置 For Y = 1 To HCount If r.Row < H(Y) Then Exit For End If Next Y ' 修正页码计算逻辑:先纵向分页,再横向分页,符合常规打印页码顺序 FindPage = (X - 1) * HCount + Y End With End Function
原函数的问题点说明
- 打印区域判断错误:原函数仅依赖
UsedRange,但如果设置了自定义打印区域,UsedRange可能包含打印范围外的内容,导致判断错误。修正后优先使用PrintArea,无则 fallback 到UsedRange。 - 边界计算错误:原
LastRow和LastCol的计算方式有误(UsedRange.Rows.Count + UsedRange.Row会比实际最后一行多1),修正后改为printRange.Row + printRange.Rows.Count - 1,同时增加了打印区域起始行/列的判断,避免单元格在打印区域上方/左侧时误判。 - 分页边界判断漏洞:原函数最后一页的边界设为
LastCol/LastRow,当单元格正好在最后一列/行时,循环会走到VCount/HCount之后,导致X/Y值错误。修正后将最后边界设为LastCol+1/LastRow+1,确保边界单元格能正确匹配。 - 页码计算逻辑颠倒:原函数的页码计算是
Y + (X-1)*HCount,这是横向分页优先的顺序,不符合常规打印时“先打满纵向所有页,再切换横向”的逻辑,修正后改为(X-1)*HCount + Y。 - 数据类型溢出风险:原函数返回
Integer,当工作表页数超过32767时会溢出,改为Long支持更大范围。
使用方法
- 在Excel单元格中直接调用:输入
=FindPage(ActiveCell),回车后即可显示激活单元格的页码。 - 在VBA代码中调用:例如
MsgBox "当前激活单元格在第" & FindPage(ActiveCell) & "页"。
内容的提问来源于stack exchange,提问作者강호의 iDEVICE 3
相关产品推荐
相关产品推荐

