|
▼ponpon さん:
こんばんは。
>>Sub sample1()
>>'各ボタンに登録するマクロ
>>' msgbox typename(application.caller)
>> If LCase(TypeName(Application.Caller)) = "variant()" Then
>> c_inf = Application.Caller
>> '配列を返します c_inf(1)---インデックス
>> ' c_inf(2)---コマンドバーの名前
>↑
>配列のことが十分わかっていないし、もちろん使いこなしていないのですが、
>c_inf()には、二つの値が配列ではいているということでしょうか?
> c_inf(1)---インデックス c_inf(2)---コマンドバーの名前
>私のイメージからすると、ボタンの名前?ボタンのコレクション?(この場合1,2,3,4,5,6,7,8,9,0)が、配列の値として、入っているような気がしたのですが・・・・・。
c_inf(1)には、ボタンに表示されている数字が入っているのではありませんよ!!
Captionとc_inf(1)が一致してしまった例題だったので紛らわしいですね。
c_inf(1)には、コマンドバー「サンプル」の中でのインデックスが入っています。
これは、作成されたコマンドバー「サンプル」の左から何番目のボタンか
という意味です。
コードをちょっとだけ変更します。
'===============================================================
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)
Const mystr As String = "の処理"
If LCase(TypeName(Application.Caller)) = "variant()" Then
c_inf = Application.Caller
'配列を返します c_inf(1)---インデックス
' c_inf(2)---コマンドバーの名前
MsgBox c_inf(1)
With Application.CommandBars(c_inf(2))
Select Case .Controls(c_inf(1)).Caption
Case "1" & mystr
MsgBox "1が押されたので、1の処理"
Case "2" & mystr
MsgBox "2が押されてしまった"
Case "9" & mystr
MsgBox "9なんか押して"
Case Else
MsgBox "その他の数字処理だよ"
End Select
'この場合は、ボタンに表示されている文字列で分岐しました。
'ボタンのCaptionプロパティです。
End With
End If
End Sub
'=================================================================
Sub 設定消去()
'作成したコマンドバーを削除
On Error Resume Next
Application.CommandBars(cbdnm).Delete
On Error GoTo 0
End Sub
これでいかがですか?
|
|