はじめに
Excelのシート上に配置したボタンや図形をクリックしたときに実行されるマクロを、状況に応じて動的に切り替えたいと思ったことはありませんか? 例えば、同じボタンを「開始」ボタンとして使い、一度クリックされたら「停止」ボタンに変化させ、実行される処理も切り替える、といったトグル機能です。
VBAを使えば、図形(Shape)オブジェクトの .OnAction プロパティを書き換えることで、その図形に登録されているマクロを自由に変更できます。
この記事では、ボタンをクリックするたびに、そのボタン自身の表示テキストと実行するマクロを相互に切り替える、実用的な「トグルボタン」の作り方を解説します。
登録マクロを切り替えるVBAサンプルコード
このマクロは、ToggleProcess という名前の図形(ボタン)を対象に、クリックするたびに StartProcess マクロと StopProcess マクロの登録を切り替えます。
完成コード
VB.Net
' 「処理開始」のマクロ
Sub StartProcess()
' 実際の処理をここに記述
MsgBox "処理を開始しました。", vbInformation
' --- ボタンの状態を「停止」モードに切り替える ---
With ActiveSheet.Shapes("ToggleProcess")
' .OnActionプロパティに、次に実行するマクロ名を設定
.OnAction = "StopProcess"
' .TextFrame.Characters.Textプロパティで、表示テキストを変更
.TextFrame.Characters.Text = "処理を停止"
End With
End Sub
' 「処理停止」のマクロ
Sub StopProcess()
' 実際の処理をここに記述
MsgBox "処理を停止しました。", vbInformation
' --- ボタンの状態を「開始」モードに切り替える ---
With ActiveSheet.Shapes("ToggleProcess")
' .OnActionプロパティを、StartProcessマクロに戻す
.OnAction = "StartProcess"
' 表示テキストを開始モードに戻す
.TextFrame.Characters.Text = "処理を開始"
End With
End Sub
実行前の準備
- シート上に図形(例: 角丸四角形)またはフォームコントロールのボタンを配置します。
- その図形(ボタン)を選択し、左上の名前ボックスで名前を
ToggleProcessに変更します。 ToggleProcessを右クリックし、「マクロの登録」で、最初に実行したいStartProcessマクロを割り当てます。- これで、ボタンをクリックするたびに表示テキストと実行されるマクロが切り替わるようになります。
コードの解説
With ActiveSheet.Shapes("ToggleProcess")
ActiveSheet.Shapes("図形名") という構文で、シート上の特定の図形オブジェクトにアクセスしています。フォームコントロールのボタンも、VBA上では Shape として扱えます。
.OnAction = "StopProcess"
この一行が、登録マクロを切り替える核心部分です。
.OnAction: 図形がクリックされたときに実行されるマクロの名前を、文字列で設定・取得するプロパティです。StartProcessマクロの中で、次回のクリック時にはStopProcessが実行されるように、自身の.OnActionプロパティを書き換えています。StopProcessマクロの中でも、同様にStartProcessに戻す処理を行っています。
.TextFrame.Characters.Text = "処理を停止"
図形の表面に表示されているテキストを変更するためのプロパティです。
.TextFrame: 図形のテキスト領域にアクセスします。.Characters.Text: その領域の文字列を取得・設定します。
.OnAction の変更と合わせて表示テキストも変更することで、ユーザーは次にボタンを押すと何が起こるのかを直感的に理解できます。
まとめ
今回は、.OnAction プロパティを使って、ボタンや図形に登録されたマクロを動的に切り替える方法を解説しました。
- 図形に登録されたマクロは
.OnActionプロパティで管理されている。 - マクロの中で、対象となる図形の
.OnActionプロパティを別のマクロ名(文字列)に書き換えることで、次回の動作を変更できる。 .TextFrame.Characters.Textも併せて変更すると、ユーザーにとって分かりやすいトグルボタンになる。
このテクニックを使えば、限られたスペースで多機能なインターフェースを構築したり、処理の状態に応じてユーザーの操作をガイドしたりと、より洗練されたシートアプリケーションを作成することができます。
