今回はVBAで利用できるイベントについて解説していきます。できると便利なイベントに絞って簡単に解説していきます。頑張りましょう
この記事は中級です。
レベルについてはExcel VBAの実力(レベル)を定義してみる 初心者~三段をご参照ください。
目次
イベントとは
一般にイベントとは、PCからみて何かの影響を受けることです。エクセルVBAにおいてはエクセル側から見て、何かのアクションを受け取ることです。例えばワークブックが閉じられるとか、シートのどこかがクリックされるとか、そういうことです。ユーザーから見れば、ワークブックを閉じるとか、シートをクリックする事です。
「エクセル側から見て」、と言うのは「ユーザーから見て」だけでなく、ユーザーの操作ではない場合も含みます。マクロで閉じるのもエクセルアプリケーションから見て「閉じられた」事になります。
イベントが発生したときに行う処理はブックモジュールや、シートモジュールに記述する
イベントが発生したときに行う処理は、そのイベントが受け取ったオブジェクトにくっついているモジュールに記述します。ずばり、ワークブックにくっついているブックモジュールとシートにくっついているシートモジュールの2つです。この二つしかありません。
新しいブックを開いたときに初めからシート名のついたシートモジュールと、「この」ブックであるThisWorkbookというブックモジュールがある事から分かります。
便利なWorkbookのイベントプロシジャ
それでは具体的にイベントを見て行きましょう。ここではよく使うイベントに絞って解説していきます。イベントが発生した時に動作を行うプロシジャをイベントプロシジャと言います。
Workbookを閉じる前
まずはWorkbookのイベントからです。エディタの上のプルダウンからWorkbookとBeforeCloseを選択します。
イベントプロシジャを記述するのに必要なPrivate Subプロシジャが挿入されます。ここは変更しないようにしましょう。このプロシジャはブックが閉じる直前に実行されます。普通にエクセルブックを使う時も、保存せずに閉じようとすると、本当に閉じていいかどうかを確認するメッセージボックスが表示されますよね。あれと同じタイミングで実行されます。
Private Sub Workbook_BeforeClose(Cancel As Boolean) If Cells(1, 1) = "" Then MsgBox "A1セルが空白です。" End End Sub
これは閉じる瞬間にA1セルが空白の時に実行されます。Subプロシジャの前にCancelと言う名前の変数が引数として与えられています。この変数を使う事により閉じる操作をキャンセルさせることができます。
Private Sub Workbook_BeforeClose(Cancel As Boolean) If Cells(1, 1) = "" Then MsgBox "A1セルが空白です。" Cancel = True End End Sub
Cancel = TrueをIf~End If文の中に追加しました。これで、A1セルが空白の時、閉じようとするアクションをキャンセルする事ができます。具体的な使いどころとしては、何か手作業を前提とするフォーマットがあって、作業が終わったときに本来入力されているべき場所が入力されていたり、誤っていると思われる値が入っている時に、閉じる前に確認を促す、と言うような使い方ができます。
Workbookを開いた後
次に開いたときのイベントプロシジャを作ってみます。作り方はBeforesCloseの時と同じです。ThisWorkbookのブックモジュールをダブルクリックして、WorkbookとOpenを選択します。
Private Sub Workbook_Open() MsgBox "開いたよ!" End Sub
これでこのブックを開いた時に、いきなり「開いたよ!」を表示させることができます。実用的な自動化ツールをVBAで作るときは処理対象のブックではなく、ツールとしてのエクセルマクロブックを用意しますよね。
と言う事は、このツールが開いたときにまずさせたいことをする事ができます。例えば、ユーザーフォームを表示させるなどですね。あるいは、マクロブックをユーザーが別シートを開いた状態で保存して閉じてしまったような場合に、メインの画面に戻ることなどもできます。マクロブックの初期化はWorkbookのOpenイベントがうってつけですね。
以下は、便利な使い方の例です。
Private Sub Workbook_Open() Sheet(1).Activate UserForm1.Show End Sub
イベントプロシジャを使うに当たり、気をつけること
イベントプロシジャはシートモジュールやブックモジュールに記述したんですよね。これらのオブジェクトにくっついたモジュールは、本来、そのシートなり、ブックなり固有の処理を記述する場所です。
と言う事は、開いた後、だらだらと一般的なコードを書くべきではない、と言う事です。開いたときに実行されるイベントなら、処理が長くなるのであれば、標準モジュールに記述したプロシジャを呼び出すべきです。
Private Sub Workbook_Open() Call メイン_main End Sub
こんな感じですね。
他にもいろいろなプロシジャがあるので、いろいろと試して使い勝手の向上を図りましょう!次は、Openイベントのイベントプロシジャを使ってタスクスケジューラでマクロを毎日決まった時刻に実行する方法を解説します!
<お知らせ>
Excel VBAでクラスやオブジェクトの概念と使い方を丁寧に解説し、ワンランク上の実力を目指すガイドを書きました。この本で本物の実力を身に付けて一皮むけてみませんか?
books.rakuten.co.jp