Mutable_Yunの業務改善ブログ

VBA勉強中の非エンジニア会社員向けのブログです。業務改善についても触れています。

VBA 3分で分かる便利なイベントの使い方 ワークブックにチェック機能をつける

今回はVBAで利用できるイベントについて解説していきます。できると便利なイベントに絞って簡単に解説していきます。頑張りましょう

この記事は中級です。
レベルについてはExcel VBAの実力(レベル)を定義してみる 初心者~三段をご参照ください。

目次

イベントとは

一般にイベントとは、PCからみて何かの影響を受けることです。エクセルVBAにおいてはエクセル側から見て、何かのアクションを受け取ることです。例えばワークブックが閉じられるとか、シートのどこかがクリックされるとか、そういうことです。ユーザーから見れば、ワークブックを閉じるとか、シートをクリックする事です。

「エクセル側から見て」、と言うのは「ユーザーから見て」だけでなく、ユーザーの操作ではない場合も含みます。マクロで閉じるのもエクセルアプリケーションから見て「閉じられた」事になります。

イベントが発生したときに行う処理はブックモジュールや、シートモジュールに記述する

イベントが発生したときに行う処理は、そのイベントが受け取ったオブジェクトにくっついているモジュールに記述します。ずばり、ワークブックにくっついているブックモジュールとシートにくっついているシートモジュールの2つです。この二つしかありません。

新しいブックを開いたときに初めからシート名のついたシートモジュールと、「この」ブックであるThisWorkbookというブックモジュールがある事から分かります。

プロジェクトエクスプローラ
新規のエクセルを立ち上げたばかりのプロジェクトエクスプローラ

便利なWorkbookのイベントプロシジャ

それでは具体的にイベントを見て行きましょう。ここではよく使うイベントに絞って解説していきます。イベントが発生した時に動作を行うプロシジャをイベントプロシジャと言います。

Workbookを閉じる前

まずはWorkbookのイベントからです。エディタの上のプルダウンからWorkbookとBeforeCloseを選択します。

イベントプロシジャを挿入する
エディタの上のプルダウンリストからWorkbookを選択とイベントを選択する

イベントプロシジャを記述するのに必要な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を選択します。

WorkbookのOpenイベントを選択する画面
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イベントのイベントプロシジャを使ってタスクスケジューラでマクロを毎日決まった時刻に実行する方法を解説します!