
エクセルは2019です。
シート上にLabel1~Label120を配置してあります。
クリックされたLabelを認識したいのですが、
Private Sub Label1_Click()
Call Label_Click処理(1)
End Sub
これをLabelの数だけ並べるのを避けたい。
フォーム上にコントロールを配置場合のサンプルは複数散見されますが、シート上に配置した場合の例は見つけられませんでした。
どなたかアドバイスをいただけませんでしょうか。
A 回答 (6件)
- 最新から表示
- 回答順に表示
No.5
- 回答日時:
No3です。
>想像以上に面倒な処理が必要なことを理解しました。
>Labelの数だけ、イベント処理プログラムを記述することにします。
ん?
どうしてもActiveXでなければならない理由がある場合は仕方がないですが、フォームコントロールのラベルをシート上に配置するのでも良ければ(見た目や機能は、ほぼ同じはずです)、No3の前半の方法であれば複雑ではない
と思いますけれど?
ちなみに、こちらの方法であれば、コントロールのラベルに限らず、シート上の図形(=四角や楕円など)のオブジェクトでも使用することが可能です。
(図形の方が、立体的なボタンなどを作りやすいので・・)
仮に、イベント処理を個別に記述してゆく方法をとるにしても、(記述内容が同じなので)「マクロの記述自体をマクロで行う」という方法もないことではありません。
No.4
- 回答日時:
No.2です。
私が書いたコードってどっちだろう?
昔の事で記憶が置き去りにされたか?
>ちなみにシート上に配置するフォームコントロールの方です。
ではなく、ActiveXなんだろうか???
No.3
- 回答日時:
こんにちは
シート上のラベルといっても、「フォームコントロール」と「ActiveXオブジェクト」とがあって、どちらを使うかによって扱いが変わります。
フォームコントロールの場合は比較的簡単ですが、ActiveXオブジェクトの場合はそれなりに面倒です。
ご提示の、
>Private Sub Label1_Click() ~~
は、ActiveXオブジェクトのように見受けられますけれど・・・
・フォームコントロールの場合
Application.Callerで呼び出し元を取得できますので、これを利用すれば宜しいでしょう。
例えば、以下の処理を標準モジュールに作成しておきます。
Sub hoge()
Dim sp
Set sp = ActiveSheet.Shapes(Application.Caller)
MsgBox sp.Name
End Sub
ラベルを1個作成した段階で、マクロの登録で上記hogeを登録します。
(こうしておくことで、後は、コピペでマクロ登録済みのラベルを作成できます)
上記であれば、クリックした際に、そのラベルの名称が表示されます。
・ActiveXオブジェクトの場合
こちらの場合は、イベント処理を個別にしか設定できないようですので少々面倒です。
以下のページの中ほどにシート上に配置した場合の例がでていますので、ご参考になればと。
クラスでイベントを定義しておいて、そのクラスオブジェクトに設定する仕組みのようです。
(内容は確認していませんが、悪しからず)
https://gabekore.org/vba-control-array
想像以上に面倒な処理が必要なことを理解しました。
私のレベルでは理解が困難と思われますので、泥臭く、質問文に記したようにLabelの数だけ、イベント処理プログラムを記述することにします。
アドバイスありがとうございました。
No.2
- 回答日時:
15年程前にExcel2002で作成した、チェックボックスをクリックしたら配置している行を塗りつぶすコードです。
参考にならなければ蹴飛ばしてください。
ちなみにシート上に配置するフォームコントロールの方です。
・標準モジュールに
Private myCom(30) As New Class1
Private i As Integer
Sub try()
Dim objCom As Object
Dim r As Range
Set r = Worksheets("Sheet1").Range("A3:I3")
i = 0
For Each objCom In ActiveSheet.OLEObjects
If objCom.Name Like "CheckBox*" Then
objCom.Object = False
Set myCom(i).comC = objCom.Object
Set myCom(i).rC = r.Offset(i)
i = i + 1
End If
Next
End Sub
Sub try2()
Dim j As Integer
Application.ScreenUpdating = False
For j = 0 To i - 1
myCom(j).comC = False
myCom(j).rC.Interior.ColorIndex = -4142
Set myCom(j).comC = Nothing
Set myCom(j).rC = Nothing
Next
Application.ScreenUpdating = True
End Sub
------------------
tryは事前準備、try2は後処理でマクロからの実行でも良いですしボタンなどに組み付けても宜しいかと。
次がメインでクラスモジュールを追加し名前はデフォルトでClass1のまま。
・クラスモジュールに
Public WithEvents comC As MSForms.CheckBox
Public rC As Range
Private Sub comC_Click()
If comC.Value Then
rC.Interior.ColorIndex = 16
Else
rC.Interior.ColorIndex = -4142
End If
End Sub
古いコードでごめんなさい。

希望していたのは、ユーザーフォームは使用せずにシートに直接Labelを多数配置した場合の、クリックイベント確認を簡単な記述で済ませられないかと考えていました。
諦めて、Labelの数だけ処理プログラムを記述することにします。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
グラフのX,Y座標を取得したい
-
Excel VBA 定義されたプロージ...
-
モジュールからフォームのボタ...
-
acwzlibとは?
-
EXECEL VBA コマンドボタンか...
-
モジュールアップデートって何...
-
VBでグローバル変数を宣言するには
-
COBOL85からCOBOL2002移行
-
エクセルVBAでシートモジュール...
-
現在アクティブなフォーム名を...
-
VHDLにおける「generic」について
-
linux mintで(EE )Failed to lo...
-
ExcelVBA:パブリック オブジェ...
-
ユーザー定義関数に#NAME?が返...
-
クリアーとデリート
-
VBAで別モジュールへの変数の受...
-
Excel VBAでリンク切れをチェッ...
-
vba userFormのSubを標準モジュ...
-
違うモジュールでも同じ変数を...
-
ACCESSのVBAでPrivate Sub ~en...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excel VBAでリンク切れをチェッ...
-
Excel VBA 定義されたプロージ...
-
Application.OnKey:項目入力中...
-
Excel VBAで、ユーザーフォーム...
-
モジュールの最大数はいくつな...
-
グラフのX,Y座標を取得したい
-
VBA This Workbookモジュール...
-
ユーザー定義関数に#NAME?が返...
-
VBAで旧字体を異字体に一括で変...
-
モジュールとクラスの違いって...
-
Sub Workbook_Open()でユーザー...
-
acwzlibとは?
-
標準モジュールを削除したい。(...
-
エクセルVBAでシートモジュール...
-
VBでグローバル変数を宣言するには
-
【Excel VBA】標準モジュールに...
-
vba userFormのSubを標準モジュ...
-
【vba】フォームに書いてあ...
-
VBAで別モジュールへの変数の受...
-
マクロについて教えてください。
おすすめ情報