【エクセルVBA】イベントを使ってもっと便利なツールにしてみよう!WorksheetオブジェクトのChangeイベント


エクセル,イベント,Change,Worksheet_change

皆様こんにちは、ノグチです。

エクセルを使っていて、「エクセルのシートに入力したら、自動的に値をとってきてくれたらいいのに…」と思ったことはありませんか?

セルに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の画面が開きます。

VBEの左側にある、プロジェクトエクスプローラーのカーソルが、「Sheet1」にあたっていますね。

イベント,VBE,プロパティウインドウ

この状態で、画面右側、コードウインドウの上にある2つのプルダウンメニューのうち、左側のメニューを開いて、「Worksheet」をクリックします。

このとき、コードウィンドウに「Worksheet_SlectionChange」のプロシージャができてしまう場合は、Worksheet_Changeプロシージャを作ってからそっと削除しておきましょう。

さて、左側のプルダウンメニューから「Worksheet」を選択すると、右側のプルダウンメニューの内容が変わるので、その中から「Change」を選びます。

イベント,VBE,プロパティウインドウ,Change

すると、コードウインドウにWorksheet_Changeのプロシージャができますね。イベント,VBE,Change,プロシージャ

これで、Changeイベントのコードを書く準備ができました!

Worksheet_Changeが実行されるタイミング

Worksheet_Changeプロシージャが実行されるタイミングも確認しておきましょう。

プロシージャの頭にブレークポイントを置いて、実際にセルに値を入力してEnterキーを押してみると…

VBE,イベント,セル入力,Change

この通り、即Worksheet_Changeプロシージャが実行されるのがわかりますね。

イベント,VBE,change,デバッグ

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

そしてシートに値を入力してみると…

change,イベント,セルの色,セル入力

こんな感じで、Worksheet_Changeプロシージャが実行されて、実際に変更があったセルの色を変えることができます。

Change,イベント,セルの色

最後に

今回は、WorksheetオブジェクトのChangeイベントをご紹介しました。

次回記事では、このChangeイベントを使ってセルに得意先名や仕入先名の一部を入力したら、マスタシートから得意先・仕入先の正式名称を取得させる方法をご紹介しています。

【エクセルVBA】ChangeイベントとEnableEventsプロパティで部分一致検索をする方法
WorksheetオブジェクトのChangeイベントと、ApplicationオブジェクトのEnableEventsプロパティを使って、セルに得意先名の一部を入力したら、マスタシートから正式名称を取得して入力セルに返す、というコードをご紹介しています。面倒かつ間違い易い入力作業は、出来るだけ簡略化したいですね。

それでは、最後までお読みいただきありがとうございました!

連載目次:エクセルVBAのイベントを使ってもっと便利なツールにしよう!

エクセルVBAでリストの重複を排除する方法として、Dictionaryオブジェクトを使った重複排除の方法をご紹介しています。

  1. 【エクセルVBA】イベントを使ってもっと便利なツールにしてみよう!WorksheetオブジェクトのChangeイベント
  2. 【エクセルVBA】ChangeイベントとEnableEventsプロパティで部分一致検索をする方法
  3. 【エクセルVBA】Validation.Addメソッドで入力規則のドロップダウンを作る方法
  4. 【エクセルVBA】Changeイベントと組み合わせてもっと便利に!検索にヒットした値をドロップダウンリストに表示する方法

タイトルとURLをコピーしました