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

ボタンに
どのコードが
結びついているか
どのコードが
結びついているか
シート上のボタンに登録されているマクロ名を確認する
Private Sub ボタンに登録されているマクロ名をプリント確認する()
Dim wsTarget As Worksheet
Dim shpCurrent As Shape
Dim strMacroName As String
Dim strOutputDetail As String
Dim strCaption As String
Const MSO_OLE_CONTROL As Long = 12
Set wsTarget = ActiveSheet
Debug.Print String(60, "-")
Debug.Print "「" & wsTarget.Name & "」シートに存在するマクロのつながりを探索"
Debug.Print String(60, "-")
' 1. 取得しうるすべてのShapeを一つずつ巡る
For Each shpCurrent In wsTarget.Shapes
strMacroName = ""
strCaption = ""
strOutputDetail = ""
With shpCurrent
' --- 図形の表示テキスト(キャプション)を安全に取得 ---
On Error Resume Next
' ① OLEObjectの場合:OLEFormatを介してCaptionを取得
If .Type = MSO_OLE_CONTROL Then
strCaption = Replace(.OLEFormat.Object.Object.Caption, vbCrLf, "")
Else
' ② 通常Shapeの場合:TextFrame2経由でキャプションを取得
If .HasTextFrame Then
If .TextFrame2.HasText Then strCaption = .TextFrame2.TextRange.Text
End If
End If
' ③ フォームコントロール(ボタンやグループボックスなど)のキャプションを捕捉
If .Type = 8 Then ' msoFormControl
On Error Resume Next
strCaption = .DrawingObject.Caption
End If
End With
On Error GoTo 0 ' エラーハンドリングを元に戻す
' --- Shapeのタイプに基づいてマクロの紐づけ(OnAction/イベント)を探索 ---
Select Case .Type
Case MSO_OLE_CONTROL
' ActiveXコントロール(Type 12)
On Error Resume Next
strMacroName = .OLEFormat.Object.Object.OnAction
If strMacroName = "" Then strMacroName = .Name & "_Click"
strOutputDetail = _
vbTab & "■" & IIf(strCaption <> "", strCaption, "(キャプションなし)") & vbCrLf & _
vbTab & " Type = ActiveXコントロール" & vbCrLf & _
vbTab & " Shape Name = " & .Name & vbCrLf & _
vbTab & " Macro Name = " & strMacroName & vbCrLf
Case Else
' 通常のフォームボタン
On Error Resume Next
strMacroName = .OnAction
strOutputDetail = _
vbTab & "■" & IIf(strCaption <> "", strCaption, "(キャプションなし)") & vbCrLf & _
vbTab & " Type = " & .Type & vbCrLf & _
vbTab & " Shape Name = " & .Name & vbCrLf & _
vbTab & " Macro Name = " & strMacroName & vbCrLf
End Select
Debug.Print strOutputDetail
Next shpCurrent
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
------------------------------------------------------------
探索完了
------------------------------------------------------------
概要(Summary)
このマクロは、アクティブシート上に存在する全てのShape(図形・ボタンなど)を走査し、対応しているマクロ名をDebug.Printで出力するツール。
特徴
- フォームコントロール(ボタンなど) と ActiveXコントロール の両方に対応。
.OnActionと.OLEFormat.Object.Object.OnActionの両経路をチェック。.TextFrame2や.DrawingObject.Captionを使ってキャプションも安全に取得。- 出力は見やすく整形され、マクロ名・Shape名・キャプションが一覧で確認できる。
さらに改善するなら(Performance & Maintainability)
- On Error Resume Next の範囲を限定
→ 予期しないエラーを抑えるため、With shpCurrent内部だけにスコープを絞る。 - Debug.Printの代わりにコレクションに格納→出力
→ 後でファイル出力したい場合に流用しやすくなる。 - 関数分割
→GetShapeCaption()とGetMacroName()の2関数に分けると再利用性が上がる。
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
編集後記:
この記事の内容がベストではないかもしれません。