こんにちは、Ryoです。
ExcelのSheet上で特定のセルを選択した際にボタンなどからの実行ではなく、自動的に処理を実行させたいケースもあるかと思います。そのような処理もイベントとして実行することが出来ますので、今回はその内容について書いていきます。
1.サンプル概要
簡単な表ですが、以下画像のB列に記載された品番のセルを選択時に「出荷日」と数量×単価の合計金額をメッセージボックスで表示するものです。
その際にB列以外や空白セル、見出しを選択しても処理されてしまうのを防ぐ為に処理条件を設定し、品番の部分のみ実行される形にしています。
例として品番が記入されているセルB7を選択すると、以下のように表示されます。
2.サンプルコード
Private Sub Worksheet_SelectionChange(ByVal Target As Range) Dim Num, Unit_P As Long Dim Cell_Adr As String 'アドレスの相対参照指定はTarget.Address(False,False)でも可 Cell_Adr = Target.Address(RowAbsolute:=False, _ ColumnAbsolute:=False) '表の「見出し」、「範囲選択」はエラーとなるので除外する If Cell_Adr = "B3" Or InStr(Cell_Adr, ":") <> 0 Then Exit Sub 'B列で空白セル以外を処理対象とする If InStr(Target.Address, "B") <> 0 And Target.Value <> "" Then '数量 Num = Target.Offset(0, 1) '単価 Unit_P = Target.Offset(0, 2) MsgBox "選択した品番の出荷日は" & Target.Offset(0, 3) & _ "、合計金額は" & Format(Num * Unit_P, "#,###") & "円です", vbInformation End If End Sub
セルを選択した際に処理を行うにはSelectionChangeイベントを使用します。
この処理を実行する場合はシートモジュールに記述するので、ご注意ください。
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
処理内容
End Sub
この構文の引数Targetは選択セルや選択セル範囲を表しますので、サンプルでは.Addresとしてセル位置の取得や.Offsetで「数量」や「単価」を取得しています。
サンプルコードの内容についてですが、先ず変数Cell_Adrに引数Targetのアドレスを相対参照形式で取得しています。
Cell_Adr = Target.Address(RowAbsolute:=False, ColumnAbsolute:=False)
単一セルであれば(例)”B3″、範囲であれば(例)”B4:B8″の形で取得しますので、次のIf文で「見出し」(=B3)の位置か、「範囲選択」(=”:”含む)されているかを判定させ、該当する場合は終了させます。
If Cell_Adr = “B3” Or InStr(Cell_Adr, “:”) <> 0 Then Exit Sub
更に条件としては「B列」であり、且つ「空白」では無いことが必要なのでIf文で判定します。
If InStr(Target.Address, “B”) <> 0 And Target.Value <> “” Then
後はメッセージボックスで表示したい内容の処理なので、.Offsetで「数量」「単価」を取得してから、MsgBoxの中に反映させればOKです。
このように一見便利そうに思えますが、意図しないセルやセル範囲の選択時にエラーが出ないよう配慮が必要なので、実は少々面倒だったりするSelectionChangeイベントです。
3.まとめ
セルを選択しただけで自動的に処理を実行してくれますから、実運用例として私の場合は品番を入力するセルを選択したらユーザーフォームを表示させて項目を選択するなどで使ったりしてます。上にも書きました通り、少々面倒な部分もありますが用途によっては有用なので、機会があれば利用を検討するのも良いかと思います。
以上、セルやセル範囲を選択時に処理を行う方法についてでした!
今回の記事が何かの参考になれば幸いです。
Ryo