今回のサンプルは、Excel2002 / Excel2003 / Excel2010で動作を確認しました。
今月の相談
 ユーザーフォームにコマンドボタンを動的に配置しようと思い、マクロを書きました。配置はできたのですが、そのボタンをクリックして何かをさせるにはどうすればいいのでしょうか?事前にクリックイベントプロシジャをユーザーフォームのモジュールに記述してみましたが、反応していません。私のマシンがおかしいのでしょうか?

「先生!なんのこっちゃ、さっぱり意味がわかりません。この患者さん、病院を間違えてはいませんかねぇ?」
「いいや、間違えてはおらんよ」
「じゃあ、説明してください」
「うむ、ゲール君、ユーザーフォームは、わかるな?」
「あたり前田のクラッカー」
「その上に配置するCommandButtonもわかるな?」
「はい!ポチっとクリックするボタンです」
「それを動的に配置するとどうなるか?」
「なんですかぁ?」
「うむ、コントロールを動的に配置するとは、マクロを使ってユーザーフォームにコントロールを配置することじゃ」
「んまっ!そんなことができるんですか?」
「もちろん、できるとも」
「まるで、魔法のようです・・・でも、何でそんなことをするんですか?ボタンはマクロを書く前にフォームに配置しておく物ではありませんか」
「そうじゃな。通常コントロールの類は、VBEの画面で事前に配置しておくものじゃ。しかし、その数が不特定であったらどうかな?」
「不特定?そんなことあるわけないじゃありませんか。ボタンの数が不特定なんて。そんな状況でどうやってプログラムを書けって言うんですか!ボタンの数が決定してから発注してくれってんだ」
「まぁまぁ、そう興奮するでない。とりあえず患者さんのファイルを開いてみたまえ」
「どれどれ?う~ん、ワークシートの数だけ、ユーザーフォームにコマンドボタンを貼り付けているようです」

図1●動的にコマンドボタンを配置したUserform1
図1●動的にコマンドボタンを配置したUserform1
[画像のクリックで拡大表示]

「そうじゃ。ワークシートの数だけユーザーフォームにコマンドボタンを貼り付けている。と、言うことは?」
「って、言うことは・・・わからん!御前の話は、よ~わからん!」
「マクロを解読してみると、Workbook_OpenイベントでUserForm1を表示し、そのUserForm_Initializeイベントで、ワークシートの数だけ、フォームにボタンを貼り付けている」
「なるほど」
「これが動的配置じゃ」
「はい。でも、どうして、そんなことをするんですか?最初から、フォームにワークシートの数だけボタンを配置して、それを表示すればいいじゃないですか?」
「将来的に、都道府県の数が増減することを想定してのことじゃろうな」
「先生、お言葉ですが、都道府県の数なんてそう簡単には増えたり減ったりしませんよ」
「であるね~!しかし、可能性はゼロじゃない」
「まぁ、ゼロではないですね」
「都道府県が増減したとしたら?」
「ワークシートも増減します」
「そう、そして将来的に、ワークシートの数が増減したとしても?」
「したとしても・・・・おぉ!プログラムに手を加える必要が無い」
「その通りじゃ」
「ワークシートが増えたら自動的にボタンも増え、ワークシートが減ったらボタンも減る」
「ピンポン!ピンポン!ピンポン!」
「やったぁ!」

図2●動的にコマンドボタンを配置したUserform2
図2●動的にコマンドボタンを配置したUserform2
[画像のクリックで拡大表示]

「そして、Userform2は、市町村名。これは、たまに合併や分裂があったりするから、増減があるじゃろ?自動で対応してくれた方が便利なんじゃないかい?」
「あぁ、そう言えば、平成の大合併で、かなり減りましたね」
「じゃろ?」
「もう、暫くはないと思いますけど?」
「まぁ、よいではないか」
「お許しください、お代官様」
「よいではないか」
「お許しください」
「よいではないか」
「あれ~~~~~~~~」
「もういいかな?」
「はい。満足しました」

「では、話を元に戻そう。結論から言うと、動的に配置したコントロールにはイベントプロシジャがない」
「へ?」