フォームコントロールのボタンオブジェクトをVBAで捕まえる
フォームコントロールのボタンを捕まえる
マクロを呼び出すためのボタンをシート上に設置することがよくある。
シート上に設置したボタンをVBAで取得するにはどうすればよいのだろうか。
Nameプロパティを取得してみる
ボタンの上で右クリックすると、
このように、ボタンを選択した状態になる。
この状態で、イミディエイト・ウインドウに
?selection.name
と打ち込んで、[Enter]をバシッ!
このように、「Button 1
」と出た。
何オブジェクトなのかは分からんが、Name
プロパティを持っており、パラメータが「Button 1
」であることが分かった。
何型のオブジェクトなのか
今度は、TypeName
関数を使ってみる。
同じくボタンが選択された状態で、イミディエイト・ウインドウに
?typename(selection)
と打ち込んで、[Enter]をバチコーン!
ご覧のように「Button
」と出た。
親オブジェクトは何なのか
さらに、イミディエイト・ウインドウに
?typename(selection.parent)
と打ち込んで、[Enter]をドオォーーーン!
今度は、「Worksheet
」が返った。
フォームコントロールのボタンオブジェクトを取得する
上の実験により、フォームコントロールのボタンオブジェクトは、
Worksheet
オブジェクトの配下であるButton
型のオブジェクトであるName
プロパティを持つ
ということが分かった。
以上のことを念頭に、コーディングしてみる。
すると……、
なにーーーーっ!
入力候補に「Button
」がねえ!
しかし、それでもめげずにコーディングしてみた。
リスト1 標準モジュール
Public Sub testCommandButton() Dim btn As Button Set btn = ActiveSheet.Buttons(1) '……(1)' btn.Caption = ActiveSheet.Range("A1").Value '……(2)' End Sub
(1)の
Set btn = ActiveSheet.Buttons(1)
でButton
型の変数「btn
」にボタンオブジェクトをセット。
「Button
型」というぐらいだから、「Buttons
」コレクションの要素のはず。
んで、ActiveSheet
にはボタンは一つしかないのだから、Buttons(1)
で良いはず。
あとは、
コーディング中に、このように入力候補が出るぐらいだから「Caption
」プロパティがあるはず。ゆえに、(2)の
btn.Caption = ActiveSheet.Range("A1").Value
で、ボタンのテキストをA1セルの文字列にする。
実行
リスト1のtestCommandButton
をボタンに登録して、
この状態でクリック。
無事にボタンのテキストが書き換わった。
おわりに
Button
オブジェクトの構造については、オブジェクト・ブラウザーにも出てこないので、ちょっとわかりにくい。
こちらの記事にインスパイヤされて書きました。