電子書籍の厳選無料作品が豊富!

エクセルは2019です。
シート上にLabel1~Label120を配置してあります。
クリックされたLabelを認識したいのですが、
 Private Sub Label1_Click()
   Call Label_Click処理(1)
 End Sub
これをLabelの数だけ並べるのを避けたい。
フォーム上にコントロールを配置場合のサンプルは複数散見されますが、シート上に配置した場合の例は見つけられませんでした。
どなたかアドバイスをいただけませんでしょうか。

A 回答 (6件)

No.2です。



画像の通りユーザーフォームなんて使ってませんよ?
シート上に配置したコントロールのみです。
    • good
    • 0

No3です。



>想像以上に面倒な処理が必要なことを理解しました。
>Labelの数だけ、イベント処理プログラムを記述することにします。
ん?

どうしてもActiveXでなければならない理由がある場合は仕方がないですが、フォームコントロールのラベルをシート上に配置するのでも良ければ(見た目や機能は、ほぼ同じはずです)、No3の前半の方法であれば複雑ではない
と思いますけれど?

ちなみに、こちらの方法であれば、コントロールのラベルに限らず、シート上の図形(=四角や楕円など)のオブジェクトでも使用することが可能です。
(図形の方が、立体的なボタンなどを作りやすいので・・)


仮に、イベント処理を個別に記述してゆく方法をとるにしても、(記述内容が同じなので)「マクロの記述自体をマクロで行う」という方法もないことではありません。
    • good
    • 1

No.2です。



私が書いたコードってどっちだろう?
昔の事で記憶が置き去りにされたか?

>ちなみにシート上に配置するフォームコントロールの方です。

ではなく、ActiveXなんだろうか???
    • good
    • 0

こんにちは



シート上のラベルといっても、「フォームコントロール」と「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
    • good
    • 1
この回答へのお礼

想像以上に面倒な処理が必要なことを理解しました。
私のレベルでは理解が困難と思われますので、泥臭く、質問文に記したようにLabelの数だけ、イベント処理プログラムを記述することにします。
アドバイスありがとうございました。

お礼日時:2022/01/13 16:51

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」の回答画像2
    • good
    • 0
この回答へのお礼

希望していたのは、ユーザーフォームは使用せずにシートに直接Labelを多数配置した場合の、クリックイベント確認を簡単な記述で済ませられないかと考えていました。
諦めて、Labelの数だけ処理プログラムを記述することにします。
ありがとうございました。

お礼日時:2022/01/13 16:55

onclickイベントで処理ができればひとつで済むがVBAにonclickがあったかな。

忘れた。
    • good
    • 0
この回答へのお礼

onclickは見当たらないようです。
他の方からのご回答でも想像より手間のかかる記述が必要なので、Labelの数だけ処理プログラムを記述することで今回の最終対応にいたします。
ありがとうございました。

お礼日時:2022/01/13 16:59

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!