トップ > 逆引きで学ぶ ユーザーフォーム&コントロール > 追加章 遊ぶ!楽しむ!ユーザーフォーム > T-01 疑似セル上にマウスポインタがある場合のみ色を変更する

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

ページトップへ戻る
Copyright(C) 2009- 坂江 保 All Rights Reserved.