イベントとは、ユーザが特定の操作や動作などプロシージャ実行のきっかけとなる出来事のことを言います。マウス操作でのダブルクリック、右クリックやブックを開くなどがイベントとなります。このようなイベントが発生したときに自動的に実行されるプロシージャをイベントプロシージャといい、ユーザの操作に応じた実用的なアプリケーションを実現できます。
イベントプロシージャの作成場所は、オブジェクトモジュール内となります。ワークシートでのイベントはワークシートのオブジェクトモジュール内に、ブックのイベントはブックのオブジェクトモジュール内となります。
例えば、ワークシート「Sheet1」においてイベントプロシージャを作成する場合は、プロジェクトエクスプローラのSheet1の上でダブルクリックし、表示されるコードウィンドウに記述していきます。
では、VBEでオブジェクトモジュールを確認してみます。あらかじめSheet1のシート見出しを「VBA練習」と書き換えておくと、プロジェクトエクスプローラ上でSheet1(VBA練習)と変更されていることが確認できます。その上でダブルクリックし、コードウィンドウを表示すると下の図のようになります。
※Excel画面からワークシートのオブジェクトモジュールを表示するには、ワークシートの見出しを右クリックして「コードの表示」を選択します。
では、イベント時のプロシージャ作成を1つ例えて紹介します。作成の流れを理解してください。
ここでは、ワークシートがアクティブになったときをイベントとしてそのときに実行されるプロシージャを記述していきます。ワークシートがアクティブになるということは、そのワークシートが表示されたときになります。
まず、VBA練習のコードウィンドウが表示されていることを確認してください。(上の図の状態)そして、オブジェクトボックスの▼ボタンをクリックし、「Worksheet」を選択します。
コードウィンドウにはWorksheet_SelectionChangeイベントプロシージャが作成されます。次に、プロシージャボックスの▼ボタンをクリックし、「Activate」を選択します。すると、コードウィンドウにWorksheet_Activateイベントプロシージャが作成されます。
Worksheet_SelectionChangeイベントプロシージャは使いませんので、削除します。Worksheet_Activateイベントプロシージャ内に上の図のように記述します。
これは、Sheet1(VBA練習)のシートをアクティブにするとメッセージボックスが表示される内容となっています。Excel画面に戻り、一旦違うシートを選択し、次にVBA練習のシート見出しを選択するとメッセージボックスが表示されることが確認できます。
※イベントプロシージャの名前は、「オブジェクト名_イベント名」という形式で付けられます。この名前は、ユーザが選択したオブジェクトボックスとプロシージャボックスの両方の組み合わせで付けられます。プロシージャボックスには、オブジェクトボックスでオブジェクトの種類によって表示されるプロシージャ名は変わります。また、オブジェクトボックスで「General」が選択されている場合は、プロシージャボックスにはモジュール内にある宣言とすべての標準プロシージャの一覧が表示されます。
ワークシートのイベントには主に以下のようなものがあります。
イベント | 発生する条件 |
---|---|
SelectionChange | ワークシートでセルの選択範囲を変更したとき |
Change | ワークシートのセルの値を変更したとき |
BeforeDubleClick | ワークシートのセルをダブルクリックしたとき |
BeforeRightClick | ワークシートのセルを右クリックしたとき |
Activate | ワークシートがアクティブになったとき |
マウスなどでセルの選択範囲を任意に変えたときに実行するプロシージャを作成してみます。セル範囲の変更時のイベントはSelectionChangeイベントを利用します。
変更した後に選択されているセルは、Worksheet_SelectionChangeイベントプロシージャのRange型の引数Targetに渡されるので、これを使って変更した後に選択されているセルを操作します。
上の例を説明すると、まずRange型のオブジェクト変数を宣言します。引数Targetが参照するセル範囲とセル範囲C3からD6の共有セルへの参照をオブジェクト変数に代入します。もし、オブジェクト変数が空でなければ、OKという文字をオブジェクト変数が参照するセルに入力します。そして、最後にオブジェクト変数を初期化して終わっています。
この例で使われているIntersectメソッドは、引数1と引数2に指定したセル範囲の共有セルを返すもので、Applicationオブジェクトに対して使います。
Applicationオブジェクト.Intersect(Arg1、Arg2、…)
このIntersectメソッドを使うと、イベントプロシージャを実行させるセル範囲のセルが選択されたかどうかを確認できます。
上の例で言えば、変数Targetはユーザが選択範囲したセルですので、セルC3からD6と重なっている範囲だけにOKという文字を入力されることになります。つまり、セルC3からD6の範囲外にはOKという文字を入力させないためにIntersectメソッドを使っています。
下の図で考え方を確認してください。
セルをダブルクリックした時にイベントを発生させるには、BeforeDoubleClickイベントを使います。
ダブルクリックしたセルは、Worksheet_BeforeDoubleClickイベントプロシージャのRange型の引数Targetに渡され、セルを操作します。また、このイベントプロシージャの引数には、ブール型の引数Cancelも持っていて、これにTrueを設定することで、ダブルクリックした時に編集モードになるExcelの既定の機能をキャンセルできます。
上の例を説明します。Range型のオブジェクト変数を宣言し、引数Targetが参照するセル範囲とセル範囲B2:D5との共有セルへの参照をオブジェクト変数に代入します。
もし、オブジェクト変数が空でなければ、オブジェクト変数が参照するセルにNGという文字を入力し、引数CancelにTrueを設定し、ダブルクリックしても編集モードの機能をキャンセルします。最後に、オブジェクト変数を初期化してプロシージャが終わります。
つまり、セルB2からD5のセル範囲の中でセル上をダブルクリックするとNGが入力される処理が実行されます。通常、セルの上でダブルクリックするとセル内のデータを編集できますが、その機能を使えない状態にしていることも理解できるでしょう。
ワークシート上を右クリックしたときのイベントはWorksheet_BeforeRightClickイベントプロシージャを利用します。
下の例は、ワークシート上で右クリックすると出席者数をカウントし、セルC1にそのカウント数を入力するプロシージャです。ワークシート関数のCounta関数を使用し、文字列が入っているセル数をカウントします。数値であればCount関数を使用します。
ブックに関するイベントプロシージャでブックを操作してみましょう。ブックには、次のようなイベントがあります。
イベント | 発生する条件 |
---|---|
Open | ブックを開いたとき |
BeforeClose | ブックを閉じる前 |
NewSheet | 新しいシートをブック内に作成したとき |
ではまず、ブックを開いたときに当日の日付が表示されるようなプロシージャを作成してみます。下の図を参照してください。
ブック内でのイベントを記述するには、まずプロジェクトエクスプローラの①「ThisWorkbook」をダブルクリックし、②オブジェクトボックスで「Workbook」を選択します。すると、コードウィンドウにWorkbook_Open()プロシージャが作成されます。ブックを開いたときに発生させるのはOpenイベントです。ここでは、日付をメッセージボックスとして表示させてみます。以下のように記述します。
このブックを開くときのイベントを実行させるには、一旦ブックを保存し、閉じてから、再度このブックを開くことでイベントが発生することになります。
では、次にブックを閉じる前のイベントを作成してみましょう。
Excelなどのアプリケーションでは、内容を変更した後にそのままブックを閉じようとすると、変更したことを保存するかどうかのメッセージが表示されます。
ここでは、閉じる前に「ブックを閉じますか?」というメッセージを表示させ、「はい」のボタンが押されたら上書き保存し、「いいえ」のボタンが押されたらブックを閉じないようなプロシージャを作ります。以下のように記述してみてください。
上のように設定すれば、既定のメッセージとは違うものを作成することができます。
ブックの操作の中で、新しいシートを作成することはよくあるイベントです。新しいシートを作成したときにイベントを発生させるにはNewSheetイベントを利用します。Workbook_NewSheetイベントプロシージャの総称オブジェクト型の引数Shに新しいシートの作成が渡されます。
ここでは、新しいワークシートを作成したときに、シート名を入力させる入力ボックスを表示させ、その中に入力された文字列や数値をシート見出しの名前に変更するプロシージャとします。また、もし入力ボックスの中に何も入力されないときは、作成されたシートを削除します。そのとき、削除を促すメッセージが表示されないように設定します。
ワークシートを挿入すると入力ボックスが表示され、その中にシート名を入力すると新しく作成されたシート名が入力された名前に変更されます。