銀河鉄道

【VBA】ボタンに登録されているマクロ名を調べたい

サムネイル
[VBA]buttonに何が登録されてるか

ボタンに
どのコードが
結びついているか

シート上のボタンに登録されているマクロ名を確認する

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で出力するツール。

特徴

  1. フォームコントロール(ボタンなど)ActiveXコントロール の両方に対応。
  2. .OnAction.OLEFormat.Object.Object.OnAction の両経路をチェック。
  3. .TextFrame2.DrawingObject.Caption を使ってキャプションも安全に取得。
  4. 出力は見やすく整形され、マクロ名・Shape名・キャプションが一覧で確認できる。

さらに改善するなら(Performance & Maintainability)

  1. On Error Resume Next の範囲を限定
     → 予期しないエラーを抑えるため、With shpCurrent 内部だけにスコープを絞る。
  2. Debug.Printの代わりにコレクションに格納→出力
     → 後でファイル出力したい場合に流用しやすくなる。
  3. 関数分割
     → 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|監査性 |

著者

author
月うさぎ

編集後記:
この記事の内容がベストではないかもしれません。

記事一覧