|
▼ponpon さん:
おはようございます。
>>マクロの対象となるオブジェクトの識別名が取得できます。
>>呼び出し方法によって返されるデータの種類も違うでしょう?
>
>わかったような、わからないような(^^;
>マクロを何が呼び出しているかがわかるってことかな?
Helpには、「Visual Basic を呼び出した方法についての情報を返します」
とあるのでそういう認識でよいかと思います。
但し、呼び出し方によってApplication.Callerで返されるデータも違うと言う事です。
Typename関数を使って識別する方法を私は良く見ますし、
私もApplication.Callerのデータタイプを調べる場合はこれを使っています。
Typename関数の詳細は、HELPでチェックしてみてください。
ユーザー定義のコマンドバーを作成して、
そこにいくつかのボタンを配置した場合に
登録したマクロにこのApplication.Callerを使用すると
配列を返してくれます。以下のコードは、その例です。
標準モジュールに
'===================================================
Const cbdnm As String = "サンプル"
Sub 設定1()
'サンプルというコマンドバーを作成し、その中に10個のボタンを配置します
Dim cmdb As CommandBar
Dim cmd As CommandBarControl
Set cmdb = Application.CommandBars.Add(cbdnm)
dd = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 0)
For idx = LBound(dd) To UBound(dd)
cmdb.Visible = True
Set cmd = cmdb.Controls.Add(msoControlButton)
With cmd
.Style = msoButtonCaption
.Caption = dd(idx)
.OnAction = "sample1"
End With
Next
End Sub
'===============================================================
Sub sample1()
'各ボタンに登録するマクロ
' msgbox typename(application.caller)
If LCase(TypeName(Application.Caller)) = "variant()" Then
c_inf = Application.Caller
'配列を返します c_inf(1)---インデックス
' c_inf(2)---コマンドバーの名前
With Application.CommandBars(c_inf(2))
MsgBox .Controls(c_inf(1)).Caption & "のボタンが押されました"
End With
End If
End Sub
'=================================================================
Sub 設定消去()
'作成したコマンドバーを削除
On Error Resume Next
Application.CommandBars(cbdnm).Delete
On Error GoTo 0
End Sub
他にも種類があるかもしれませんから、試してみてください。
|
|