はじめに
Excelシートを操作画面として使う際、「特定のセルをダブルクリックしたら、関連する入力フォームを開きたい」と考えたことはありませんか? 例えば、顧客名のセルをダブルクリックしたら顧客情報フォームを、商品名のセルなら商品詳細フォームを開く、といった具合です。
VBAの Worksheet_BeforeDoubleClick
イベントを使えば、このような「ダブルクリックされた場所に応じて、実行する処理を変える」という、非常にインタラクティブな機能を実装できます。
この記事では、ユーザーがダブルクリックしたセルの場所を判定し、それに応じて異なる2種類のユーザーフォームを表示する、実用的なマクロの作り方を解説します。
セルに応じてフォームを切り替えるVBAサンプルコード
このコードは、シートモジュールに記述します。特定のワークシート(例: Sheet1
)のタブを右クリックし、「コードの表示」を選択して表示されるコードウィンドウに貼り付けてください。
この例では、以下の処理を実装します。
- C3セルをダブルクリック →
InputForm_User
(ユーザー情報フォーム)を表示 - C5:C10の範囲のセルをダブルクリック →
InputForm_Product
(商品情報フォーム)を表示
シートモジュールの完成コード
' シートがダブルクリックされたときに実行されるイベント
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
' --- C3セルがダブルクリックされたか判定 ---
If Not Intersect(Target, Me.Range("C3")) Is Nothing Then
' ユーザー情報フォームを表示
InputForm_User.Show
' ダブルクリック後の編集モードをキャンセル
Cancel = True
' --- C5:C10の範囲がダブルクリックされたか判定 ---
ElseIf Not Intersect(Target, Me.Range("C5:C10")) Is Nothing Then
' 商品情報フォームを表示
InputForm_Product.Show
' ダブルクリック後の編集モードをキャンセル
Cancel = True
End If
End Sub
コードの解説
Private Sub Worksheet_BeforeDoubleClick(...)
これは特別な名前のイベントプロシージャで、このコードが書かれているワークシート上で、いずれかのセルがダブルクリックされた瞬間に自動的に実行されます。このプロシージャには、2つの重要な引数が渡されます。
Target As Range
: ダブルクリックされたセル(範囲)そのものを表します。このTarget
がどのセルなのかを調べることで、場所の判定が可能になります。Cancel As Boolean
: この引数にTrue
を設定すると、ダブルクリックの本来の動作(セルの編集モードに入る)をキャンセルできます。フォームを表示する際には、通常True
に設定します。
If Not Intersect(Target, Me.Range("C3")) Is Nothing Then
この一行が、ダブルクリックされた場所を判定するための核心部分です。
Intersect
関数: 複数のセル範囲が交差する(重なる)部分を返します。もし範囲が全く交差しない場合はNothing
(何もない)を返します。Intersect(Target, Me.Range("C3"))
: 「ダブルクリックされたセル(Target
)」と「C3セル(Me.Range("C3")
)」の重なりを調べています。Is Nothing
: 重なりがないかどうかを判定します。Not ... Is Nothing
: 全体として、「重なりがない、わけではない」=「重なっている部分がある」という意味になります。つまり、「ダブルクリックされたセルがC3セルと重なっている場合(=C3セルがダブルクリックされた場合)」という条件式になります。
Cancel = True
ユーザーフォームを表示させた後、元のセルが編集モードに入ってしまうと不自然なため、この命令でダブルクリックのデフォルト動作をキャンセルしています。
まとめ
今回は、Worksheet_BeforeDoubleClick
イベントと Intersect
関数を組み合わせて、ダブルクリックされたセルに応じて表示するユーザーフォームを切り替える方法を解説しました。
Worksheet_BeforeDoubleClick
イベントで、ダブルクリック操作を検知する。Target
引数で、どのセルが操作されたかを知る。Intersect
関数で、Target
と特定のセル範囲の重なりを判定する。Cancel = True
で、セルが編集モードに入るのを防ぐ。
このテクニックを応用すれば、Excelシートをまるでアプリケーションのメニュー画面のように活用することができます。ユーザーにとって直感的で使いやすいツールを作成するために、ぜひマスターしてください。