Developer

【ExcelVBA】イベントプロシージャの挿入方法②
2021.10.03
Lv1

【ExcelVBA】イベントプロシージャの挿入方法②

イベントプロシージャの挿入方法②

前回に引き続きイベントを使用したマクロの実行について紹介していきます。

前回はイベントプロシージャとは何か、どのように作成するかということを紹介しました。まとめを引用しておきましょう。

イベントに対応する(そのイベントの発生をトリガーとした)マクロを作成することで、特定の操作によってマクロを自動実行することができる。
このマクロのことをイベントプロシージャと呼び、戻り値・プロシージャ名・引数はあらかじめ決められているものにしなくてはならない。

今回はより実用的にイベントプロシージャを使用する方法を見ていきます。

前回作成したサンプルについて

前回作成したプログラムを少し整理しておきましょう。

Private Sub Worksheet_Change(ByVal Target As Range)
    MsgBox "こんにちは!"
End Sub
  • セルの任意の場所の値を変更したときのイベントを使用(Changeイベント)している
  • イベントが発生したときにメッセージ「こんにちは!」が表示される
  • 別のシートではメッセージは表示されない

3点目の別シートでメッセージが発生しないのは、プロシージャを作るときに「Sheet1」を選んでいたからです。

「イベントとは」の回で紹介したようにイベントは「ブック」に関するものと「シート」に関するものがありました。「Change」イベントはシートに関するものだったので、このようにそれぞれのシートに対してイベントプロシージャを定義していくことになります。今回のケースでは、Sheet1のChangeイベントに設定したため他のシートではメッセージが表示されていません。
改めてどのようなイベントがあったか振り返っておきましょう。

イベントプロシージャを実用的に使用する

さて、実用的にChangeイベントのイベントプロシージャを使うためには、次のようなことを可能にする必要があります。

  • あるシートの特定の範囲(セル)だけマクロを実行する
  • 計算結果をセルに反映したい
  • 変更したセルの値を知りたい

どのケースにおいても問題は1つに集約することができ、「変更したセルがどこなのか」がわかれば解決することができます。
しかし、前回のサンプルではそのシート上の全てのセルで実行され、どのセルを変更しても同じ結果(メッセージが表示)となってしまいました。

この問題を解決するために、VBAのイベントプロシージャでは「引数」を使用します。
どのセルが変更されたのかがわかるように、引数にその変更されたセルオブジェクトが代入されてくるようになっています。

では、プログラムを見てみましょう。

Private Sub Worksheet_Change(ByVal Target As Range)
    MsgBox "こんにちは!"
End Sub

このプロシージャで定義されている引数は次のような意味となります。

  • ByVal:値渡し
  • Target:Targetという名前
  • As Range:Range型の引数

この引数を使い、次のようにプログラムを変更してください。

Private Sub Worksheet_Change(ByVal Target As Range)
    MsgBox Target.Address
    MsgBox Target.Value
End Sub

A1セルに「TEST」と入力してみましょう。

このようにメッセージで「$A$1」と表示されます。これはセルのアドレスですね。「$」が2か所付いているのは「アドレスの絶対参照」という意味になりますが、本記事とは関係のない部分になりますので無視して頂いて構いません。

「OK」をクリックしてみましょう。

続けてメッセージが表示され、「TEST」と表示されます。これはセルの値になっています。

このように引数「Target」からは変更したセルのアドレスを表す文字列や、セルに入力したデータなどセルに関する様々な情報を参照することができます。これは、Targetが文字列ではなくRangeオブジェクトとなっているからです。
Rangeオブジェクトの操作に関してはこちらも本記事と主線からはずれてしまうため一旦解説は省略しますが、オブジェクトになっていることでセルに関する情報を取得できたり、あるいはセルに関する操作を行うことも可能になっています。

まとめ

より実践的なイベントプロシージャを作るためには引数を利用することが欠かせない。
引数には、その操作を行った(イベントが発生した)セルに関する情報がRangeオブジェクトとして格納されている。このオブジェクトを使用することでセルに関する様々な情報を取得したり、セルを操作したりすることが可能となる。

確認問題

以下の「○○○」に当てはまる文言を解答してください。

シートの変更(Change)イベントのイベントプロシージャは次のようになっている。

Private Sub Worksheet_Change(ByVal Target As Range)
    MsgBox Target.Address
    MsgBox Target.Value
End Sub

この引数にあたる部分のそれぞれの意味は次の通りである。

  • ByVal:値渡し
  • Target:○○○
  • As Range:○○○
答え

シートの変更(Change)イベントのイベントプロシージャは次のようになっている。

Private Sub Worksheet_Change(ByVal Target As Range)
    MsgBox Target.Address
    MsgBox Target.Value
End Sub

この引数にあたる部分のそれぞれの意味は次の通りである。

  • ByVal:値渡し
  • Target:Targetという名前
  • As Range:Range型の引数

次回も引き続き、「イベントについて」です。