「承認者の名前が入力されていないと印刷させたくない」「特定の日付が入力されるまで、このシートは印刷禁止にしたい」など、Excelファイルに特定のルールを設け、それを満たさない限り印刷できないように制御したい、というニーズは少なくありません。
VBAの**「イベント」**という仕組みを使えば、このような印刷制限を簡単に実現できます。この記事では、印刷直前に自動で実行されるWorkbook_BeforePrint
イベントを利用して、印刷をキャンセルする方法を解説します。
【重要】コードを記述する場所
今回のコードは、ボタンなどをクリックして実行する通常の「標準モジュール」とは異なり、ThisWorkbook
モジュールに記述する必要があります。これは、ブック全体の動作(今回は「印刷」)を監視するための特別な場所です。
- Excelで
Alt
+F11
キーを押し、VBE(Visual Basic Editor)を開きます。 - 画面左側の「プロジェクトエクスプローラー」から、**
ThisWorkbook
**をダブルクリックします。 - 表示された右側の白いコードウィンドウに、以下のコードを貼り付けてください。
または、コードウィンドウ上部のドロップダウンで、左側を「Workbook」、右側を「BeforePrint」と選択することでも、プロシージャの雛形を自動で作成できます。
完成したVBAコード
以下が、「入力シート」のセルE5
に値が入力されていない場合、印刷をキャンセルするVBAコードです。
Private Sub Workbook_BeforePrint(Cancel As Boolean)
' 変数を宣言します
Dim targetSheet As Worksheet
Dim checkCell As Range
' チェック対象のシートとセルを設定
Set targetSheet = ThisWorkbook.Worksheets("入力シート")
Set checkCell = targetSheet.Range("E5")
' --- チェック処理 ---
' もしチェック対象のセルが空欄だったら
If IsEmpty(checkCell.Value) Then
' 1. ユーザーにメッセージを表示
MsgBox "印刷する前に、セル「" & checkCell.Address(False, False) & "」に承認者名を入力してください。", _
vbExclamation, _
"入力エラー"
' 2. 対象のシートとセルに移動
targetSheet.Activate
checkCell.Select
' 3. 印刷処理をキャンセルする
Cancel = True
End If
End Sub
コードのポイント解説
① Workbook_BeforePrintイベント
Private Sub Workbook_BeforePrint(Cancel As Boolean)
これは特殊なSubプロシージャで、ユーザーがブック内のいずれかのシートで印刷ボタンを押したり、印刷プレビューを表示しようとしたりした瞬間に、Excelが自動的に呼び出します。
② Cancel As Boolean 引数
このイベントの最も重要な部分が、引数として渡されるCancel
です。
Cancel
は、Excelから「印刷処理を続行しますか?中止しますか?」という状態を伝えられる、特殊な変数(フラグ)です。- このイベントが始まった時点では、
Cancel
の値はFalse
(中止しない)になっています。 - もし、コードの中で**
Cancel = True
と記述すると、それは「この印刷、中止します!」**とExcelに伝える合図になります。この命令を受け取ったExcelは、その後の印刷処理をすべて中断します。
③ 条件分岐とユーザーへの通知
If IsEmpty(checkCell.Value) Then
' ...
Cancel = True
End If
If
文を使い、「もし、チェック対象のセルが空欄だったら」という条件分岐を作ります。条件に合致した場合(=入力漏れがあった場合)にのみ、以下の3つの処理を行っています。
MsgBox
: ユーザーになぜ印刷できないのか、その理由をメッセージで伝えます。targetSheet.Activate
/checkCell.Select
: ユーザーがすぐに入力できるよう、対象のシートを表示し、該当セルを選択状態にします。Cancel = True
: 上記の通り、印刷処理そのものを中止させます。
まとめ
Workbook_BeforePrint
イベントを使えば、印刷という行為をトリガーにして、自作のチェック処理を割り込ませることができます。
- **
ThisWorkbook
**モジュールにWorkbook_BeforePrint
プロシージャを作成する。 - プロシージャ内で、必須項目の入力チェックなどの条件分岐を記述する。
- 条件を満たさない場合に、
MsgBox
でユーザーに通知し、**Cancel = True
**で印刷を中止させる。
この仕組みを利用することで、ファイルの運用ルールを徹底させ、入力ミスや記入漏れのある不完全な状態での書類が出力されるのを防ぐことができます。