VBA應用程序開發過程中,經常需要處理用戶選中的單元格區域,有的應用場景中,需要限制用戶選中區域位于同一頁中(以打印預覽顯示的分頁劃分),但是VBA對象模型中并沒有提供相應的接口,用于快速查詢單元格位于哪個打印頁面中,那么只能自己動手豐衣足食了。
示例代碼如下。
Function IsOnMultiPg(ByRef rRng As Range)Dim rData As Range, HPB As HPageBreakDim beforeC As Range, afterC As RangeIsOnMultiPg = FalseIf rRng.Cells.Count = 1 Then Exit FunctionSet rData = rRng.EntireRowFor Each HPB In ActiveSheet.HPageBreaksSet afterC = HPB.LocationSet beforeC = afterC.Offset(-1, 0)If Not ((Intersect(afterC, rData) Is Nothing) Or (Intersect(beforeC, rData) Is Nothing)) ThenIsOnMultiPg = TrueExit ForEnd IfNext
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 RangeFor Each r In Range("A50:D54,A50:D66").AreasIf IsOnMultiPg(r) ThenDebug.Print r.Address(0, 0) & ": 跨頁"ElseDebug.Print r.Address(0, 0) & ": 沒有跨頁"End IfNext
End Sub
【立即窗口】中輸出結果如下:
A50:D54: 沒有跨頁
A50:D66: 跨頁