以下の内容はhttps://www.limecode.jp/entry/utility/branch-by-application-callerより取得しました。


押されたボタンごとに処理を分岐する - Caller

押されたボタンごとに処理を分岐する方法を解説します。

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



以上の内容はhttps://www.limecode.jp/entry/utility/branch-by-application-callerより取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14