VBAの勉強を始めてみた

色々試しています。

プルダウンで選択すると、シート内の指定セルにジャンプするイベントプロシージャ

今回は、プルダウンメニューから選んだ文字列と同じ文字列を含む、同一シート内のセルにジャンプする(画面の一番上に表示させる)イベントプロシージャを紹介します。

 

プルダウンメニューから文字列を選ぶ度に、同じ文字列を含むセルを

f:id:kouten0430:20180630172203j:plain

 

このように一番上に表示されるようにしたいと思います。

f:id:kouten0430:20180630165355j:plain

 

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 モジュールに記述します。標準モジュールや、個人用マクロブックに記述しても実行されません。

    f:id:kouten0430:20180630170704j:plain

同様の処理を、Workbook_SheetChangeというイベントプロシージャでも作成することができます。その場合は、ThisWorkbookモジュールにコードを記述します。Workbook_SheetChangeは、Workbookというオブジェクト(つまり、Book内の全てのシート)で、SheetChangeというイベントがあった時に自動実行されるプロシージャです。(Worksheet_Changeは一つのシートのみが対象)

 

※1
ByValは、引数が値渡しになります。参考に、省略またはByRefは、引数が参照渡しになります。ValはValue(値)の略で、RefはReference(参照)の略。
値渡しと参照渡しについては、thom (id:t-hom) さんのこちらの記事でわかりやすく解説されています。

thom.hateblo.jp