T-01 疑似セル上にマウスポインタがある場合のみ色を変更する2022.05.03
次の書籍の第1章~5章を公開しています。
「Excel VBA 逆引きで学ぶ ユーザーフォーム&コントロール」
フォーム上にセルに見立てた格子状のラベルを配置しています。
便宜上それらをフォームのセルと呼んでいます。
次図は、フォームのセル上にマウスポインタがある場合、そのセルの色をピンク色に変更するサンプルです。
セルをクリックすると、セルに応じた処理が実行されます。
数値・ピリオド:テキストボックスに値を追加します
[ C ]:テキストボックスの値をクリアします
このような動作の実現にはいくつかの方法が考えられますが、最も簡単だと思われる方法で実装します。
サンプルファイル ダウンロード
※別の実装案
クラスモジュールを用いた方法でも実装可能です。
セルの大きさが行や列ごとに異なるような場合には、クラスを用いた方法が良いでしょう。
クラスモジュールとフォームのコントロールの連携はこちらをご覧ください。
準備 1
ユーザーフォームを挿入し、次のコントロールを追加します。
■TextBoxコントロール
役割:セルの値を表示
オブジェクト名:TextBox1
個数:1
幅・高さ:任意
Locked:True ロック設定にし、セルクリック操作以外での入力を制限します。
■Labelコントロール
役割:疑似セル 格子状に配置
オブジェクト名:FCells_(行番号)_(列番号)
個数:12
幅:30(ポイント)
高さ:30(ポイント)
BackColor:&H00FFFFFF&
BorderStyle:1 - fmBorderStyleSingle
■Labelコントロール
役割:イベント感知用
オブジェクト名:Label_Main
個数:1
幅:90
高さ:120
BackStyle:0 - fmBackStyleTransparent
BorderStyle:1 - fmBorderStyleSingle
準備 2
格子状に配置したLabelコントロールにオブジェクト名を設定します。
後の処理がしやすいように、名前に行列番号を入れておきます。
【例】FCells_2_3 共通ベース名:「FCells_」 行番号:2 列番号:3
イベント感知用のLabelを、格子状のLabelコントロールにぴったりとかぶせるような形で配置します。
ポイントは、イベント感知用のLabelコントロールが一番手前であることです。
感知用Labelが一番手前でない場合は、感知用Labelを選択した状態で、メニューバーの「書式」→「順序」→「最前面へ移動」を選択します。
サンプルコード
フォームモジュールに記述します。
'フォーム上にセルに見立てたラベルを格子状に配置しています 'そのラベル群を便宜上フォームセルと呼びます Option Explicit '定数 Private Const FCW As Single = 30 'フォーム上のセル幅 Private Const FCH As Single = 30 'フォーム上のセル高さ Private Const FCN As String = "FCells_" 'フォーム上のセルのベース名 '変数 Private strAddress As String '色変更セルアドレス
'■ラベルイベント(Label_Main) '+++ Clickイベント +++ Private Sub Label_Main_Click() If strAddress = "" Then Exit Sub Dim strValue As String strValue = Controls(strAddress).Caption With TextBox1 .Locked = False If strValue = "C" Then .Text = "" Else .Text = .Text & strValue End If .Locked = True End With End Sub
'+++ MouseMoveイベント +++ Private Sub Label_Main_MouseMove(ByVal Button As Integer, _ ByVal Shift As Integer, _ ByVal X As Single, _ ByVal Y As Single) If strAddress <> "" Then Controls(strAddress).BackColor = &HFFFFFF Dim strRow As String Dim strColumn As String strRow = CStr((Y \ FCH) + 1) 'マウス位置よりフォームセルの行を取得 strColumn = CStr((X \ FCW) + 1) 'マウス位置よりフォームセルの列を取得 strAddress = FCN & strRow & "_" & strColumn Controls(strAddress).BackColor = &HC0C0FF 'セルの色を変更 End Sub
'■フォームイベント(UserForm) '+++ MouseMoveイベント +++ Private Sub UserForm_MouseMove(ByVal Button As Integer, _ ByVal Shift As Integer, _ ByVal X As Single, _ ByVal Y As Single) If strAddress <> "" Then Controls(strAddress).BackColor = &HFFFFFF strAddress = "" End If End Sub
簡単な解説
イベント感知用のLabelコントロールを、格子状のフォームセルにぴったりと被せ、処理を実行しています。
LabelコントロールのMouseMoveイベントは、そのラベル上のX位置・Y位置を取得できるため、その位置によりラベル下のセルを特定しています。
フォームセルの名前に行列番号を入れることで、処理の簡素化を図っています。
フォームセルの色が変更された状態で、マウスポインタがLabelコントロール以外に移動する場合に備え、フォームのMouseMoveイベントにも色を戻す処理を加えています。
書籍紹介140以上のサンプルファイル付き!
知りたいがすぐわかる! やりたいがすぐできる!
「Excel VBA 逆引きで学ぶ ユーザーフォーム&コントロール」(Kindle版)
ユーザーフォームを扱えると、VBAでできることが大きく広がります!
本書では、知りたいこと、やりたいことから、逆引きで学びを深められます。
■ 購入:amazon