概要:なぜ標準機能では不十分なのか
Excelで複数シートから構成される報告書や資料を作成する際、もっとも頭を悩ませるのが「ページ番号の振り方」です。標準機能である「ヘッダー・フッター」の設定では、ブック全体を通した通し番号(「1/10」「2/10」など)を振ることは容易ですが、「シートごとに1からリセットしつつ、各シートの総ページ数も考慮したい」という要望や、「特定のシートだけはページ番号を表示させたくない」といった柔軟な対応は、GUIの設定だけでは限界があります。
特に、配布先から「各シートごとに完結したページ番号を振ってほしい」という指定を受けた場合、シート数が多いと手作業での修正はミスを誘発する最大の要因となります。本記事では、VBAを活用して、ブック内の全シートに対して「1/N」という形式のページ番号を、各シートの指定した位置(フッターの中央など)に自動で挿入・更新するプロフェッショナルな手法を解説します。
詳細解説:ページ番号制御のロジック
Excelのページ設定(PageSetupオブジェクト)は、VBAにおける操作対象として非常に強力です。ページ番号を制御するためには、以下のプロパティを理解する必要があります。
1. LeftFooter, CenterFooter, RightFooter: フッターの左・中央・右のエリアを指定します。
2. PageSetup.PageNumbersFirstPageNumber: 開始ページ番号を制御します。
3. ExecuteExcel4Macro: ページ数を取得するための古い手法ですが、現在ではPageSetup内の「&P」(現在のページ)や「&N」(総ページ数)という特殊文字を使用するのが一般的です。
しかし、単純に「&P / &N」と設定するだけでは、すべてのシートが「1/5」「2/5」…となってしまいます。各シートのページ数は「そのシートが何ページあるか」によって動的に変化するため、印刷設定を仮想的に適用し、各シートの実行ページ数を正しく認識させる必要があります。VBAでは、各シートに対して一度印刷プレビューに近い状態を内部的に計算させることで、正確な総ページ数を取得することが可能です。
サンプルコード:全シートのフッターにページ番号を自動挿入
以下に、開いているブック内のすべてのワークシートに対し、フッターの中央に「現在のページ / 総ページ数」を挿入する汎用的なプロシージャを提示します。
Sub SetPageNumbersOnAllSheets()
' 変数の宣言
Dim ws As Worksheet
Dim totalPages As Long
' エラーハンドリングを追加して堅牢性を確保
On Error GoTo ErrorHandler
' 全シートをループ処理
For Each ws In ThisWorkbook.Worksheets
' シートが表示状態でないとページ数が取得できない場合があるため、一旦アクティブに
ws.Activate
' ページ設定を初期化(念のため)
With ws.PageSetup
' フッターの中央にページ番号を設定
' &P は現在のページ、&N は総ページ数を表すExcelの特殊文字
.CenterFooter = "&P / &N"
' 念のため、余白や拡大縮小設定が影響しないよう調整可能
' .Zoom = False
' .FitToPagesWide = 1
' .FitToPagesTall = False
End With
Next ws
' 完了メッセージ
MsgBox "全シートのページ番号設定が完了しました。", vbInformation
Exit Sub
ErrorHandler:
MsgBox "エラーが発生しました: " & Err.Description, vbCritical
End Sub
このコードのポイントは、特殊文字「&P」と「&N」を使用している点です。Excel VBAにおいて、これらは自動的に「現在のページ数」と「そのシートの総ページ数」に置換されます。これにより、シートごとに独立した連番を振ることが可能となります。
実務アドバイス:ページ番号運用における注意点
プロの現場では、単にコードを動かすだけでなく、以下の「落とし穴」を回避する工夫が求められます。
1. 印刷範囲の自動計算:
Excelのページ数は、印刷範囲(PrintArea)に大きく依存します。もしシートに「印刷範囲が設定されていない」場合、データが入っているすべてのセルが印刷対象となり、意図しない空白ページが生成されることがあります。VBAで自動化する前に、必ず各シートの「印刷範囲」が適切に設定されているか、あるいは「印刷対象」が正しく選択されているかを確認するロジック(ws.PageSetup.PrintArea = “…”)をコードに組み込むことを推奨します。
2. 改ページプレビューとの整合性:
手動で改ページ位置を調整している場合、VBAで一括設定を行うと改ページ位置がリセットされる場合があります。マクロを実行する際は、事前に必ずバックアップを取るか、改ページ位置を固定する設定を確認してください。
3. シートの除外処理:
ブックの中には「表紙」や「目次」など、ページ番号を振りたくないシートが含まれることが多々あります。その場合、以下のように名前による除外判定を入れるのが定石です。
For Each ws In ThisWorkbook.Worksheets
' "表紙"という名前のシートはスキップ
If ws.Name <> "表紙" Then
ws.PageSetup.CenterFooter = "&P / &N"
Else
ws.PageSetup.CenterFooter = ""
End If
Next ws
4. ページ番号の開始位置変更:
もし「表紙」が1ページ目としてカウントされ、次のシートから「2」として開始したい場合は、`ws.PageSetup.FirstPageNumber` プロパティを調整します。ただし、シートごとにリセットする場合は「1」に固定するのが基本です。
まとめ:VBAによる標準化のメリット
Excelでシートごとに連番を振る作業を自動化することは、単なる作業時間の短縮にとどまりません。最大のメリットは「ヒューマンエラーの排除」にあります。手作業で1枚ずつ設定を確認し、修正するプロセスは、どんなに注意深い人間でも見落としが発生します。
VBAを用いて「すべてのシートのフッターを一括制御する」というルールを定義してしまえば、シートが増減しても、あるいは後からレイアウトが変更されても、マクロをワンクリックするだけで常に最新かつ正確なページ番号が維持されます。
本稿で紹介した手法は、実務レベルでそのまま利用できる堅牢なものです。ぜひ、日々の業務で作成するドキュメントの品質向上にお役立てください。Excel VBAを使いこなすことは、単なる「自動化」ではなく、自身の業務プロセスを「品質管理可能な状態」へと昇華させることに他なりません。今後も、こうした「実務直結型」のテクニックを積み重ね、Excelのポテンシャルを最大限に引き出していきましょう。
