押されたボタンごとに処理を分岐する方法を解説します。
Application.Callerプロパティを使用します。
押されたボタンのオブジェクト名で処理を分岐
Sub 押されたボタンのオブジェクト名で処理を分岐するマクロ() Dim ボタン名: ボタン名 = Application.Caller ' ボタン以外からの実行を除外 If TypeName(ボタン名) <> "String" Then Exit Sub End If ' ここにボタン名ごとの処理 Select Case ボタン名 Case "ボタン 1" Case "ボタン 2" End Select End Sub
押されたボタンのオブジェクト名(図形の名前)を取得するには、
Application.Callerプロパティを使用します。
以下の画像のようなボタン・シェイプから実行すると、
「ボタン1」「ボタン2」「四角形1」を取得します。

このサンプルの通り、Formコントロールのボタン以外に、
図形(シェイプ)にマクロを登録して実行しても図形名を取得できます。
ただし図形(シェイプ)は「同名の図形を許す」仕様になっていますので、
完全な特定は不可能である点に注意してください。
なお、Application.Callerはボタン以外から実行された場合、
#REFエラーやRangeオブジェクトを返すことがあります。
このため受ける変数はVariant変数にして置き、
TypeNameがStringであるかの判定を書いておきましょう。
' ボタン以外からの実行を除外 If TypeName(ボタン名) <> "String" Then Exit Sub End If
押されたボタンの表示テキストで処理を分岐
ボタンや図形の表示テキストで処理を分岐する場合は、
以下のようにコードを記述します。
Sub 押されたボタンの表示テキストで処理を分岐するマクロ() Dim ボタン名: ボタン名 = Application.Caller ' ボタン以外からの実行を除外 If TypeName(ボタン名) <> "String" Then Exit Sub End If ' 押されたボタンの表示テキストを取得 Dim ボタン表示テキスト As String ボタン表示テキスト = ActiveSheet.Shapes(ボタン名).TextFrame.Characters.Text ' ここに表示テキストごとの処理 ' 例:ボタンに記載されたシートに移動 On Error Resume Next ThisWorkbook.Worksheets(ボタン表示テキスト).Activate On Error GoTo 0 End Sub
押されたボタンの表示テキストを取得するには、
- 対象のShapeオブジェクトをShapes(Application.Caller)で取得
- その表示テキストをシェイプ.TextFrame.Characters.Textで取得
という手順を踏みます。
これなら同じ表示名のボタンなら同じ処理になりますので、
ボタンの複製しやすさや、処理の視認性はこちらの方が良くなりますね。
なお、上記コードは図形からの実行にも対応するためShapesで書きましたが、
対象がFormボタンだとわかっている場合は以下のコードでもOKです。
ボタン表示テキスト = ActiveSheet.Buttons(ボタン名).Caption
押されたボタンの位置で処理を分岐
押されたボタンの位置によって処理を変えたい場合は、
以下のようにコードを記述します。
Sub 押されたボタンの位置で処理を分岐するマクロ() Dim ボタン名: ボタン名 = Application.Caller ' ボタン以外からの実行を除外 If TypeName(ボタン名) <> "String" Then Exit Sub End If ' 押されたボタンのオブジェクトを取得 Dim 実行ボタン As Shape Set 実行ボタン = ActiveSheet.Shapes(ボタン名) ' ボタンの設置位置を使った分岐 If 実行ボタン.Top > 100 And 実行ボタン.Left > 50 Then MsgBox "実行テスト" End If ' ボタンの設置セルを使った分岐 Dim ボタン設置行 As Long ボタン設置行 = 実行ボタン.TopLeftCell.Row ' 例:ボタンが設置された行にあるセルを処理 ActiveSheet.Cells(ボタン設置行, 1).Value = 1 End Sub
まずは先ほどボタンの表示テキストを取得したときと同様、
Shapes(Application.Caller)で実行ボタンをShapeとして取得します。
あとはShapeの持つ情報を自由に使うことができますので、
位置であれば.Topや.Leftを使って分岐を書くことができます。
といいつつTopやLeftは値の取得や判定が面倒なうえ、
行高・列幅を変えられてしまうと動きが変わってしまう不安定さもあるため、
実務では「TopLeftCell」を使った方が便利かもしれません。
こちらは「図形が設置された左上のセル」を調べることができ、
このRow、Columnを取得することで設置行・設置列を判定できます。
「ボタンの左隣のセルに処理を実行」
などを行いたい場合はこちらのプロパティを使いましょう。
押されたボタンの種類で処理を分岐
押されたボタンの種類で処理を分岐したい場合は、
先ほどと同様、一旦実行元のShapeオブジェクトを取得します。
あとはそのShapeオブジェクトの種類を、
TypeやAutoShapeTypeなどのプロパティで判定してください。
Sub 押されたボタンの種類で処理を分岐するマクロ() Dim ボタン名: ボタン名 = Application.Caller ' ボタン以外からの実行を除外 If TypeName(ボタン名) <> "String" Then Exit Sub End If ' 押されたボタンのオブジェクトを取得 Dim 実行ボタン As Shape Set 実行ボタン = ActiveSheet.Shapes(ボタン名) ' 押されたオブジェクトの種類で分岐 Select Case 実行ボタン.Type Case msoAutoShape ' オートシェイプ Case msoPicture ' 画像 End Select ' 押されたシェイプの種類で分岐 Select Case 実行ボタン.AutoShapeType Case msoShapeRectangle ' 四角形 Case msoShapeOval ' 楕円 End Select End Sub