プルダウンで選択すると、シート内の指定セルにジャンプするイベントプロシージャ
今回は、プルダウンメニューから選んだ文字列と同じ文字列を含む、同一シート内のセルにジャンプする(画面の一番上に表示させる)イベントプロシージャを紹介します。
プルダウンメニューから文字列を選ぶ度に、同じ文字列を含むセルを
このように一番上に表示されるようにしたいと思います。
VBAでは、ある操作をトリガーとして自動的に実行されるプロシージャを「イベントプロシージャ」と呼びます。自動実行のトリガーとなる操作のことを「イベント」といい、今回は、プルダウンメニュー(が設置されたセル)の内容を変化させる度に、
シート内の指定範囲を検索し、検索に一致するセルを一番上に表示させる・・・・・・。
というプログラムを自動実行させてみたいと思います。
ワークシートのセルがユーザー(または外部リンク)によって変更されたときに、プロシージャが自動的に実行されるようにするには、Worksheet_Change というイベントプロシージャを使用します。
Private Sub Worksheet_Change(ByVal Target As Range)
Dim myRange As Range
If Target.Address <> "$A$1" Then Exit Sub
Set myRange = Range("A2:A1048576").Find(Target.Value, LookAt:=xlWhole)
ActiveWindow.ScrollRow = myRange.Row
End Sub
※プログラムの解説
- Worksheet_Change という名前のイベントプロシージャを記述します。Worksheetというオブジェクトで、Change(変化)というイベントがあった時に自動実行されるプロシージャを示します。イベントプロシージャ名は、ユーザーが自由に変更することはできません。
- 引数の指定はイベントプロシージャごとに決まっており、Worksheet_Change では(ByVal Target As Range)とします。ワークシート内で変更があったセル(Range)が Target に格納されます。変数名の Target は任意ですが、引数の渡し方を指定する ByVal(※1)と、変数の型を指定する As Range は変更不可です。
- Ifで、変更があったセルのアドレスが$A$1(つまり、プルダウンメニューを設置したセル)以外であった場合は、プロシージャを終了し、何もしません。
- Findメソッドで、A2:A1048576(つまり、ジャンプ先の見出しが存在するセル範囲)を、プルダウンメニューで選択した文字列で検索し、一致したセル(Range)を返します。LookAt:=xlWhole の引数で、検索条件を完全一致にしています。
- ActiveWindow.ScrollRowで、検索に一致したセルのある行を上端に表示させます。ウィンドウ枠を固定している場合、 固定領域は対象外となります。
※コードの使用方法
- Private SubからEnd Subまでをコピーし、イベントが発生するオブジェクトモジュールに貼り付けて使用して下さい。つまり、book1のSheet1で発生するイベントに対してであれば、VBAProject(Book1) - Microsoft Excel Objects - Sheet1 モジュールに記述します。標準モジュールや、個人用マクロブックに記述しても実行されません。
同様の処理を、Workbook_SheetChangeというイベントプロシージャでも作成することができます。その場合は、ThisWorkbookモジュールにコードを記述します。Workbook_SheetChangeは、Workbookというオブジェクト(つまり、Book内の全てのシート)で、SheetChangeというイベントがあった時に自動実行されるプロシージャです。(Worksheet_Changeは一つのシートのみが対象)
※1
ByValは、引数が値渡しになります。参考に、省略またはByRefは、引数が参照渡しになります。ValはValue(値)の略で、RefはReference(参照)の略。
値渡しと参照渡しについては、thom (id:t-hom) さんのこちらの記事でわかりやすく解説されています。