皆様こんにちは、ノグチです。
エクセルを使っていて、「エクセルのシートに入力したら、自動的に値をとってきてくれたらいいのに…」と思ったことはありませんか?
セルにVLOOKUP関数を埋め込んだり、ボタンを配置しておいて、ボタンにマクロをセットしておいて、ボタンクリックによって検索させることもできますが、関数は仕込みすぎるとエクセルが重くなってしまいますし、入力して毎回ボタンを押すのも面倒…
エクセルのシートに入力された得意先や仕入先名称の一部を入力すると即、マスタから正式名称を検索して取得してくれたら便利ですよね。
今回は、そんな願いを叶えてくれる(かもしれない)、WorksheetオブジェクトのChangeイベントをご紹介します。
イベントとは
まず、この記事で言うイベントとは、ボタンをクリックしたり、キーボードを操作したり、ファイルを開いたりといった、コンピューターに対してユーザーが行うアクションのことです。
多くのプログラムでは、ユーザーのアクションを引き金(トリガーとも言う)にして、様々な処理を実行させています。
VBAでもこのようなユーザーによる、プログラムにとって引き金になるアクションを「イベント」といいます。
イベントはオブジェクトモジュールに記述する
エクセルのイベントを記述するにあたって、基本的な決まり事が2つあります。
まず一つ目は、イベントはイベントを検知したいオブジェクトモジュール内に記述するということ。
例えば、WorksheetオブジェクトのChangeイベントの場合、Changeイベントを検知したいシートのオブジェクトモジュールに記述する必要があります。
Sheet1でChangeイベントを検知したいのであれば、Sheet1のオブジェクトモジュール内に記述する、ということですね。
イベントはオブジェクトモジュール内のイベントプロシージャに記述する
2つめは、イベント時に実行したい処理は、イベント専用のプロシージャ内に記述するということ。
イベントに対して専用のプロシージャが1つ用意される(イベントプロシージャといいます)ので、イベント時に実行したい処理は全てこのイベントプロシージャの中に書き込む必要があります。
エクセルのイベントにはどんなものがあるのか
エクセルVBAでも様々なイベントが用意されていて、このイベントに任意のコードを書いておくことによって、そのイベントが起こった時に任意の処理を自動的に実行させることができます。
代表例としてこんなものがあります。
イベント名 | オブジェクト | トリガー |
---|---|---|
Change | Worksheetオブジェクト | シートに変更が加えられたこと |
SheetActivate | Worksheetオブジェクト | シートがアクティブになったこと |
Calculate | Worksheetオブジェクト | シートの再計算が実行されたこと |
Open | Workbookオブジェクト | ブックが開かれたこと |
Changeイベントとは
今回の記事では、上で挙げたイベントのうち、今回はWorksheetオブジェクトのChangeイベントをご紹介します。
WorksheetオブジェクトのChangeイベントは、ユーザーがセルに文字を入力したり、削除したりなど、シートに対して何らかの変更を加えるアクションを行うことで発生するイベントです。
コードでは、このように記述します。
Private Sub Worksheet_Change(ByVal Target As Range) End Sub
先述した通り、Worksheet.メソッド、のようにコード内に記述するのではなくて、イベントに対してプロシージャが一つ用意されるので、このプロシージャの中に、シート上で変更があった場合に実行して欲しい処理を書き込んでいけばOKなのです。
引数のTargetには、シート上で変更があった範囲がRange型で渡されます。
VBEでコードを書く準備
では早速、Changeイベントにコードを書いていきましょう!
まず、シート名にマウスのカーソルを当てて、右クリックします。
右クリックで表示されたメニューの中から、「コードの表示」をクリック。
すると、見慣れたVBEの画面が開きます。
VBEの左側にある、プロジェクトエクスプローラーのカーソルが、「Sheet1」にあたっていますね。
この状態で、画面右側、コードウインドウの上にある2つのプルダウンメニューのうち、左側のメニューを開いて、「Worksheet」をクリックします。
このとき、コードウィンドウに「Worksheet_SlectionChange」のプロシージャができてしまう場合は、Worksheet_Changeプロシージャを作ってからそっと削除しておきましょう。
さて、左側のプルダウンメニューから「Worksheet」を選択すると、右側のプルダウンメニューの内容が変わるので、その中から「Change」を選びます。
すると、コードウインドウにWorksheet_Changeのプロシージャができますね。
これで、Changeイベントのコードを書く準備ができました!
Worksheet_Changeが実行されるタイミング
Worksheet_Changeプロシージャが実行されるタイミングも確認しておきましょう。
プロシージャの頭にブレークポイントを置いて、実際にセルに値を入力してEnterキーを押してみると…
この通り、即Worksheet_Changeプロシージャが実行されるのがわかりますね。
Changeイベントで入力されたセルの色を変える
Private Sub Worksheet_Change(ByVal Target As Range) If Target = "" Then Target.Interior.ColorIndex = 0 Else Target.Interior.ColorIndex = 3 End If End Sub
そしてシートに値を入力してみると…
こんな感じで、Worksheet_Changeプロシージャが実行されて、実際に変更があったセルの色を変えることができます。
最後に
今回は、WorksheetオブジェクトのChangeイベントをご紹介しました。
次回記事では、このChangeイベントを使ってセルに得意先名や仕入先名の一部を入力したら、マスタシートから得意先・仕入先の正式名称を取得させる方法をご紹介しています。
それでは、最後までお読みいただきありがとうございました!
連載目次:エクセルVBAのイベントを使ってもっと便利なツールにしよう!
エクセルVBAでリストの重複を排除する方法として、Dictionaryオブジェクトを使った重複排除の方法をご紹介しています。