フォームコントロールのボタンオブジェクトをVBAで捕まえる

フォームコントロールのボタンを捕まえる

マクロを呼び出すためのボタンをシート上に設置することがよくある。

シート上に設置したボタンをVBAで取得するにはどうすればよいのだろうか。

Nameプロパティを取得してみる

ボタンの上で右クリックすると、

f:id:akashi_keirin:20180924180908j:plain

このように、ボタンを選択した状態になる。

この状態で、イミディエイト・ウインドウに

?selection.name

と打ち込んで、[Enter]をバシッ!

f:id:akashi_keirin:20180924180800j:plain

このように、「Button 1」と出た。

何オブジェクトなのかは分からんが、Nameプロパティを持っており、パラメータが「Button 1」であることが分かった。

何型のオブジェクトなのか

今度は、TypeName関数を使ってみる。

同じくボタンが選択された状態で、イミディエイト・ウインドウに

?typename(selection)

と打ち込んで、[Enter]をバチコーン!

f:id:akashi_keirin:20180924180920j:plain

ご覧のように「Button」と出た。

親オブジェクトは何なのか

さらに、イミディエイト・ウインドウに

?typename(selection.parent)

と打ち込んで、[Enter]をドオォーーーン!

f:id:akashi_keirin:20180924180935j:plain

今度は、「Worksheet」が返った。

フォームコントロールのボタンオブジェクトを取得する

上の実験により、フォームコントロールのボタンオブジェクトは、

  • Worksheetオブジェクトの配下である
  • Button型のオブジェクトである
  • Nameプロパティを持つ



ということが分かった。

以上のことを念頭に、コーディングしてみる。

すると……、

f:id:akashi_keirin:20180924180955j:plain

なにーーーーっ!

入力候補に「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)で良いはず。

あとは、

f:id:akashi_keirin:20180924181005j:plain

コーディング中に、このように入力候補が出るぐらいだから「Caption」プロパティがあるはず。ゆえに、(2)の

btn.Caption = ActiveSheet.Range("A1").Value

で、ボタンのテキストをA1セルの文字列にする。

実行

リスト1testCommandButtonをボタンに登録して、

f:id:akashi_keirin:20180924181014j:plain

この状態でクリック。

f:id:akashi_keirin:20180924181023j:plain

無事にボタンのテキストが書き換わった。

おわりに

Buttonオブジェクトの構造については、オブジェクト・ブラウザーにも出てこないので、ちょっとわかりにくい。

infoment.hatenablog.com

こちらの記事にインスパイヤされて書きました。

続編

akashi-keirin.hatenablog.com