【VBA】ボタンに登録されているマクロ名を調べたい
作成日:2025-10-09
更新日:2025-10-09

ボタンに
どのコードが
結びついているか
どのコードが
結びついているか
シート上のボタンに登録されているマクロ名を確認する
Private Sub ボタンに登録されているマクロ名をプリント確認する()
' ワークシート上の図形やボタンに登録されたマクロ名をリストアップする。
' F5キーで実行。対象シートをアクティブにしておく。
Dim wsTarget As Worksheet
Dim shpCurrent As Shape ' シート上の個々の描画オブジェクト
Dim strMacroName As String
Dim strOutputDetail As String ' Debug.Printに出力する整形済み文字列
Dim strCaption As String ' 図形やボタンの表示テキスト
'// ActiveXコントロールのTypeは msoOLEControlObject (Type 12)
Const MSO_OLE_CONTROL As Long = 12
'// シートを設定
Set wsTarget = ActiveSheet
Debug.Print String(60, "-")
Debug.Print "「" & wsTarget.Name & "」シートに存在するマクロのつながりを探索"
Debug.Print String(60, "-")
'// シートに散りばめられた全てのShapeを一つ一つ巡る
For Each shpCurrent In wsTarget.Shapes
' 変数の初期化
strMacroName = ""
strCaption = ""
strOutputDetail = ""
With shpCurrent
'// キャプション(表示テキスト)を、エラーを恐れず、堅牢に取得する試み
On Error Resume Next ' エラー発生を一時的に許容
If .Type = MSO_OLE_CONTROL Then
' ActiveXコントロールの場合: OLEObjectを介してCaptionを取得
strCaption = Replace(.OLEFormat.Object.Object.Caption, vbCrLf, "")
Else
' その他の図形・コントロールの場合: TextFrame2経由でキャプションを取得
If .HasTextFrame Then
strCaption = .TextFrame2.TextRange.Text
End If
' フォームコントロールのボタンやグループボックスのキャプションを捕捉
If .Type = 8 Then ' msoFormControl (フォームコントロールのグループボックスなど)
' DrawingObjectが存在し、Captionプロパティを持つ可能性を考慮
' フォームボタンの場合は.OLEFormat.Object.Captionでも取得可能だが、図形として処理
strCaption = .DrawingObject.Caption
End If
End If
On Error GoTo 0 ' エラーハンドリングを元に戻す
'// Shapeのタイプに基づいてマクロの結びつき(OnAction/イベント名)を探す
Select Case .Type
Case MSO_OLE_CONTROL ' ActiveXコントロール (Type 12)
' OnActionは使えない。シートモジュール内のオブジェクト名_Clickイベントを推測
strMacroName = .Name & "_Click"
strOutputDetail = _
"【Name】" & IIf(strCaption <> "", strCaption, "(キャプションなし)") & vbCrLf & _
vbTab & "◇ Type : ActiveXコントロール" & vbCrLf & _
vbTab & "◇ Shape Name : " & .Name & vbCrLf & _
vbTab & "◇ Macro Name : " & strMacroName & " (シートモジュール内)" & vbCrLf
Case Else ' 通常の図形、フォームコントロールなど
' OnActionプロパティにマクロ名が直接設定されているかを確認
strMacroName = .OnAction
If strMacroName = "" Then strMacroName = "(なし)"
strOutputDetail = _
"【Name】" & IIf(strCaption <> "", strCaption, "(キャプションなし)") & vbCrLf & _
vbTab & "◇ Type : その他(図形/フォームC)" & vbCrLf & _
vbTab & "◇ Shape Name : " & .Name & vbCrLf & _
vbTab & "◇ Macro Name : " & strMacroName & vbCrLf
End Select
Debug.Print strOutputDetail
End With
Next shpCurrent
Debug.Print String(60, "-")
Debug.Print "探索完了"
Debug.Print String(60, "-")
End Sub
実行結果の例
------------------------------------------------------------
「MENU」シートに存在するマクロのつながりを探索
------------------------------------------------------------
【Name】aaaaa
◇ Type : ActiveXコントロール
◇ Shape Name : Cmd01
◇ Macro Name : Cmd01_Click (シートモジュール内)
【Name】bbb
◇ Type : その他(図形/フォームC)
◇ Shape Name : Rectangle 1
◇ Macro Name : test.xlsm!Ex
------------------------------------------------------------
探索完了
------------------------------------------------------------
Explanation
主要な構文/テクニック名 | 説明 |
For Each...In ステートメント | コレクション(ここではShapes コレクション)内の全ての要素を順に処理し、反復作業を簡潔に実現 |
wsTarget.Shapes | ワークシート上の全ての描画オブジェクト(図形、テキストボックス、フォーム/ActiveXコントロールなど)を含むコレクション。これにより多種多様な要素を網羅的に操作可能 |
Shape.OnAction プロパティ | フォームコントロールのボタンや一般的な図形に直接登録されたマクロ名を取得。ActiveXコントロールには適用されないため、両者の扱いを分ける重要な境界線 |
On Error Resume Next / On Error GoTo 0 | エラーハンドリングの一時的な変更。特にキャプション取得のように、オブジェクトの種類によってプロパティが存在しない可能性がある箇所で、コードの実行を中断させず処理を継続させるための堅牢なテクニック |
Shape.Type プロパティ | 描画オブジェクトの具体的な種類を識別。msoOLEControlObject (Type 12) を使ってActiveXコントロールとその他のオブジェクトを明確に区別し、処理を分岐 |
出典: Office VBA リファレンス – For Each…Next ステートメント|Shape.OnAction プロパティ (Excel)|On Error ステートメント (VBA)
Vocabulary
| Macro Binding|マクロ結びつき |
| MsoShapeType|MsoShapeType |
| ActiveX Control|ActiveXコントロール |
| Form Control|フォームコントロール |
| OnAction|OnAction |
| Default Event|既定イベント |
| Caption Fallback|キャプション多段フォールバック |
| TypeName|TypeName |
| Immediate Window|イミディエイトウィンドウ |
| Auditability|監査性 |
2025-10-09
編集後記:
この記事の内容がベストではないかもしれません。
記事一覧
-
[VBA]開いているかwith FullName 【VBA】ブックが開いているか判定|StrComp で FullNameを調べる -
文字の位置を取得 【VBA】文字列から指定文字の位置を取得する|InStr/InStrRev -
[VBA]Redim とRedim Preserve 【VBA】配列の要素数を決める|ReDim vs ReDim Preserve & Pythonとの違い -
ボタンをリボンに設置 【VBA】ボタンをリボンに設定する -
[VBA]Vertical Paste1D array 【VBA】一次元配列を縦方向にシートに貼り付け【範囲をリサイズする】 -
[VBA]Cells or Range 【VBA】.Cells と .Range の使い分け目安|数千か数万か