この記事でわかること!
- Excelファイルで印刷前に自動実行されるマクロの作り方がわかる。
- Excelのグループ化の概要と使い方がわかる。
印刷前に特定の行や列を非表示にしたい。
「印刷領域の中に、お客様には見せたくない列が含まれているため、お客様への提出用として印刷する際には自動でこの列を非表示にしたい。」
Excelに関して上記の依頼を受けました。
印刷の度に表示・非表示を切り替えるのが面倒ということでした。この問題をVBAで解決したいと思います。
セルの非表示よりもグループ化が良いのではないか。
Excelのグループ化機能(アウトライン)を使おう。
個人的にセルの非表示機能が大嫌いなので、セルの「表示・非表示」機能ではなく、Excelのグループ化の機能を使用することにしました。アウトラインとも呼ぶかと思います。
Excelのグループ化(アウトライン)とは?
グループ化とは列や行単位でセルをグルーピングして表示・非表示をボタンクリックで簡単に切り替えることができます。
グループ化(アウトライン)のメリット
セルの非表示の機能はExcelの作成者以外が非表示設定されていることに気づきにくいというデメリットがあります。データをコピペする時に非表示セルに気づかないまま非表示セルまでコピーしてしまう等、煩わしく感じる時があります。
セルのグループ化機能であれば非表示セルの上に開閉ボタンが表示されるため作成者以外も非表示セルがあることに気づきやすいです。表示・非表示を切り替える際もボタンクリックだけで切り替えることができるので、セルの表示機能より素早く切り替えることができます。
グループ化機能とイベントプロシージャを組み合わせて印刷時に自動的に非表示にします。
グループ化機能とイベントトリガー型のマクロを組み合わせて、印刷時に自動的にグループ化列を非表示にして印刷するようにします。
イベントプロシージャとは?
イベントプロシージャとは、何かの動作(トリガー)に反応して自動実行されるマクロのことです。通常マクロというと、ユーザの任意のタイミングでマクロメニューから使用するマクロを選びクリックすることで実行されますが、イベントプロシージャは自動実行されるのでマクロの実行作業を省略することができるので便利です。
このイベントプロシージャを使って、印刷前に自動的に「グループ化した列を非表示にする」マクロを仕込んでおけば、印刷のたびにマクロを実行したり、列の開閉ボタンを押したりという作業をショートカットできます。また、印刷時にうっかり非表示列を表示したまま印刷してしまうことも防げますので安心です。
イベントプロシージャで利用できるトリガーの例
- ファイルを開いたとき
- 印刷をしようとする前
- ファイルを閉じるとき
- 新しいシートを挿入したとき
上の動作を待ち構えて、いざトリガーが実行されたときにマクロを自動実行します。
>>> イベントプロシージャについてはこちらの記事
1. Excelにアウトラインを追加する方法(グループ化)
▲グループ化したい列全体を選択します。列全体を選択するにはアルファベットのところを一回クリックします。今回はC列だけをグループ化しますが複数列をまとめてグルーピングすることもできます。
グループ化すると外枠に開閉ボタンが付与されます。
2. VBAマクロを作成する
ここからマクロコードを書きます。2行の簡単なマクロです。
Alt+F11を押下してVBA Editor(VBE)を開きます。
ThisWorkbookモジューを開きます。
VBEの左側のプロジェクトウインドウからThisWorkbookモジュールを探してダブルクリックします。
BeforePrintトリガーを開きます。
ThisWorkbookモジュールのコードペインが開いたら、上部に2つリストボックスがあります。まず左側のリストボックスで「Workbook」を選択し、右側のリストボックスで「BeforePrint」トリガーを選択します。
Private Sub Workbook_BeforePrint(Cancel As Boolean) 'ここにプログラムを記述する。 End Sub
▲こういうBeforePrintトリガーを選択したことによって上記のコードが自動追加されました。private subとEnd Subの間に、実際に印刷する前に行う処理を書きます。
Private Sub Workbook_BeforePrint(Cancel As Boolean) MsgBox ("マクロによって印刷前にグループ化された列をすべて閉じます。") ActiveSheet.Outline.ShowLevels columnlevels:=1 End Sub
▲実際のコードはこちらです。2行追加しただけです。
Ctrl+sでマクロを閉じましょう。このExcelを次回開いたときもマクロを有効にするにはExcelの拡張子をxlsmにする必要があります。xlsmになっていない場合は名前を付けて保存で拡張子を変更してください。
Excelを印刷してみる。
▲Ctrl+pで印刷プレビューを開くとターゲットの列が表示されたままになっています。ですが実際に印刷すると非表示になるため問題ありません。これはマクロが動作するのは印刷の直前だからです。
印刷ボタンで印刷してみます。が、今回はテスト環境でプリンターが無いため出力先をプリンターではなくPDFにしています。
▲印刷ボタンを押すと、メッセージボックスが表示されるのでOkを押します。他社が使用するマクロの場合、マクロによって処理が行われていることを通知してあげた方が親切ですし後々自分の為にもなるかと思います。
▲印刷結果を確認してみます。
図のように表示したくない列を閉じた状態で印刷することができました。
印刷前(BeforePrint)のイベントトリガーを使ったマクロのアイデア
BeforePrintトリガーを使えば、アイデア次第で他にも下記のようなマクロを作成することができます。
BeforePrintトリガーを使ったマクロのアイデアの例
- msgboxを使って、列の表示・非表示を選択してもらってから印刷する。
- 印刷を強制的にキャンセルして、印刷禁止のファイルにする。
- 印刷前に特定のセルの値を確認し、入力漏れがある場合ユーザにメッセージを表示して印刷をキャンセルする。
是非、使ってみてください。
印刷前(BeforePrint)のイベントトリガーの注意点
BeforePrintトリガーはシートではなくブックが持つトリガーです。つまりシートごとに印刷の挙動を設定することができないので注意が必要です。例えば今回作成したマクロですと、もしExcelに複数シートが存在する場合、請求書のシートを印刷したときに別シートにもマクロの影響が及びます。
印刷しようとしているシートを判別してif文を使ってシートごとに処理を変更することはできなさそうです。(イベント発火時の引数がCancelしかないので。)
VBA・マクロ関連記事
まとめ
印刷前に列を非表示にするマクロについて紹介しました。
このブログではRPA・ノーコードツール・VBA/GAS/Pythonを使った業務効率化などについて発信しています。
参考になりましたらブックマーク登録お願いします!
▲Excel・Wordの基本的な使い方についての初心者向けの解説書です。かなり細かく丁寧に解説されています。著者の方のYouTubeチャンネルも併せて観るとより理解が深まるかと思います。
▲「Excel作業を自動化したいけどVBAはよくわからない・・・」という方でもPower Automate for Desktop(PAD)なら簡単に自動化できるかもしれません。PADは、Windows11にも公式搭載されたMicrosoftのRPAソフトウェアです。本書はPADでExcelなどのパソコン操作全般の自動化の基本がわかりやすく解説されています。
▲「Excel VBAの教科書」というとおりVBAの開き方から解説してるのですが網羅度が半端なくて満足感が高いです。(クラスモジュール・ユーザーフォーム・外部データ取り込み・JSON・Power Queryなど)。JSONやPower Queryは最近のExcelでの使用頻度高いかと思うので個人的にポイント高かったです。網羅度が高いゆえに分厚いです。個人的にVBA書でイチオシ。