はじめに
シート上に配置するフォームコントロールのボタン(ActiveXでないもの)は、簡単に設置できるので便利です。
ただ、機能は限定的です。
シート上のボタンはButtonsというコレクションで管理されていますが、オブジェクト名を見つけるには少々苦労します。今回はシート上のボタンをコントロールするプログラムを紹介します。
ボタン オブジェクトを特定する
フォームコントロールのボタンのオブジェクトがどのように扱われているかは、マクロの記録を使うと判明します。
マクロの記録で以下のような操作を行いました。
1.マクロの記録開始
2.シート上にボタン(フォームコントロール)を配置
3.起動するマクロ名を登録
4.キャプション名を変更
分かりやすいようにコメントを追加しておきました。
Sub Macro1()
'
' Macro1 Macro
'ボタンを追加'
ActiveSheet.Buttons.Add(298, 35, 77, 30.5).Select
'マクロの登録
Selection.OnAction = "test"
'キャプション名変更
Selection.Characters.Text = "myButton"
With Selection.Characters(Start:=1, Length:=8).Font
.Name = "MS Pゴシック"
.FontStyle = "標準"
.Size = 11
.Strikethrough = False
.Superscript = False
.Subscript = False
.OutlineFont = False
.Shadow = False
.Underline = xlUnderlineStyleNone
.ColorIndex = 1
End With
End Sub
ボタンのオブジェクト名を取得
上記のコードからわかる事は、ボタンは ActiveSheet.Buttons というコレクション(配列)で管理されているという事です。
冒頭で、Addメソッドを使ってボタンを追加しています。引数はボタンの位置と大きさになります。
今回は、ボタンの追加はしないので使いません。ちなみにDeleteメソッドを使えばボタンの削除もかのうです。
マクロの記録ではSelectionを使っていますが、直接オブジェクトを指定できればSelection部分に置き換えることができます。
ボタンオブジェクトを表示
ボタンのオブジェクトは、コレクション(配列)で管理されているの、以下のプログラムで名前を取得できます。
Sub showButtonName()
Dim bt As Object
For Each bt In ActiveSheet.Buttons
Debug.Print bt.Name
Next bt
End Sub
ボタンを特定したい場合は、イミディエイトウィンドウに出力されたボタンのNameを以下のように指定すればボタンのオブジェクトを取得できます。
ActiveSheet.Buttons(“Button 1”)
もし、シート上にボタンが1つだけなら、ActiveSheet.Buttons(1)でもOKです。
ボタンのオブジェクト名は、Excel画面右上の名前ボックスにも表示されます。ここでは、”ボタン 1”と表示されていますが、日本語のオブジェクト名も存在するようです。

ここで、オブジェクト名とキャプション名を区別するようにしてください。
オブジェクト名は、プログラム内でボタンという部品を指し示す名前(Name)になります。
一方、キャプション名は、ボタンの表示されている文字列(Characters.Text)になります。
ボタンのキャプション名を設定
ボタン オブジェクトが特定できたので、マクロの記録で出力されたコードを書き換えてみます。
Sub myMacro1()
Dim bt As Object
Set bt = ActiveSheet.Buttons("Button 1")
bt.OnAction = "test" '登録するマクロ名
bt.Characters.Text = "myButton" 'ボタンのキャプション名
End Sub
先程のマクロの記録が出力したコードに比べると、たいぶスッキリしていますが、これは Addメソッドやキャプションの Font 設定を省いているためです。
このプログラムでは、ボタン オブジェクトを特定して、OnActionで実行するマクロ名をセットし、Characters.Textでボタンのキャプション名を設定しています。
押すたびにキャプション名が切り替わるボタン
ボタンのキャプション名が変更できたので、ボタンを押すたびに実行するマクロを切り替えるプログラムを書いてみましょう。
標準モジュールに以下のコードを書きます。
Sub changeMacro()
Dim bt As Object
Set bt = ActiveSheet.Buttons("Button 1")
If bt.Characters.Text = "ボタン 1" Then
showMessage1
bt.Characters.Text = "ボタン 2"
Else
showMessage2
bt.Characters.Text = "ボタン 1"
End If
End Sub
Sub showMessage1()
MsgBox "myMacro1"
End Sub
Sub showMessage2()
MsgBox "myMacro2"
End Sub
以下のようなボタンをシートに設置して、マクロの登録画面で、changeMacroを設定してください。

ボタンを押すたびにキャプション名が変化して実行するマクロを切り替えることができるようになります。
マクロの制御を切り替えたい時などに有効でしょう。
ボタンの表示・非表示を切り替える
ボタンのオブジェクトの Visible プロパティを使えば、ボタンの表示・非表示をコントロールできます。
1つ目のボタンを押すと2つ目のボタンの表示・非表示を切り替えられるプログラムを書いてみます。
以下のように2つのボタンを配置しておきます。

ボタン1、ボタン2のマクロを以下のように登録しておきます。
Sub ボタン1_Click()
If ActiveSheet.Buttons(2).Visible Then
ActiveSheet.Buttons(2).Visible = False
Else
ActiveSheet.Buttons(2).Visible = True
End If
End Sub
Sub ボタン2_Click()
MsgBox "ボタン2 Push"
End Sub
このプログラムでは、ボタン1がボタン2の表示・非表示をコントロールしています。
当然ですがボタンが非表示の場合、そのボタンに登録されたマクロは実行できなくなります。
マクロの実行を制御したい場合に有効です。
まとめ
シート上に配置するボタンに関しては、今回のフォームコントロールのボタン、ActiveXのボタンがあります。また、その他にもシェイプをボタンとして利用する事ができます。
基本的には、簡単に設定したい場合、フォームコントロールのボタンを使用し、色々な設定を変更したい場合は、ActiveXのボタンを使用するという風に使用している方が多いと思います。
一応、フォームコントロールのボタンでも限定的ではありますが変更できるプロパティがあるので覚えておくと便利かもしれません。
コメント