ワークシートに沢山配置したコマンドボタンを見分ける方法は?

Question 56.2   Previous Next
早速ですが、シートにコマンドボタンをたくさん配置して、押されたコマンドボタンで変数を取得して、マクロを実行する方法はありますか。現在はコマンドボタンごとにマクロを登録しています。
取得する変数は 1から10までの数字で、コマンドボタンごとに n=1 というようにマクロを作成し対応しています。
コマンドボタンのネームを 1から10という名前にして、その名前を取得して数字へ変換すればいいのではと思いますがうまくいきません。 お手数ですがご教授ください。
Answer   Copyright (C) 2002.11.13 永井善王
良いアイデアと思いますが、結論から申し上げると困難ではないかと思います。

「現在はコマンドボタンごとにマクロを登録」ということですが、コントロールツールボックスの「コマンドボタン」か、フォームツールバーの「ボタン」のことかがはっきり分かりません。

もしも、コントロールツールボックスの方ならばワークシートのコード画面に、右図のようなイベントマクロが 10個あるかと思います。
また、フォームツールバーの方ならば、標準モジュールに右図のようなマクロが 10個あるでしょう。


いずれの場合も、コードの2行目の
n = 1 の右辺が異なるるだけのマクロが10個並ぶので、 「コマンドボタンごとにマクロを登録」しないで 「押されたコマンドボタンで変数を取得してマクロを実行する方法」、つまり、1つのマクロに集約できないかと思われるのは当然と言えましょう。

ですが、コントロールツールボックスの方であるならば、恐らく不可能かと思います。その理由は、個々のコマンドボタンとワークシートのコード画面のイベントマクロ(上図の上)が 1対1 で結びついているからです。

一方、フォームツールバーの方なら、どのボタンにも同じマクロを登録できますから、ひょっとするとできるのかも知れませんが、むつかしいようです。

1. 「コマンドボタンのネームを 1から10という名前にしてその名前を取得」する方法
右図のようなものだと想定すると、Captionプロパティで値を取得することになりますが、それは無理かと思います。

2. ボタンの名前を取得して末尾の数字を利用する方法
ワークシート上のボタンは図形としての名前を持っていますから、それを取得して末尾の数字を利用できないかという案です。 ボタンの名前は次のコードで取得できます。
    MsgBox ActiveSheet.Shapes(インデックス番号).Name
( )の中のインデックス番号はワークシートにボタンを描いたときの順に付番されますから、例えば 4 としてからこのマクロを実行すると、Button 4 と表示されます。何となくできそうな感じですが、クリックされたボタンが何番が分からないことには、このコードは利用できません。
そうなると、クリックされたボタンの番号を調べる方法ということになります。ところが、オプションボタンの場合は Valueプロパティの値を調べれば、オプションボタンの番号も分かりますが、(コマンド)ボタンではできないと思います。

以上により解決策としては次のようになるかと思います。(そもそもの主旨が分からないので外れていたら御免なさい)

1. 10個のマクロの内容が上図のように簡単で、よく似たものが並ぶことが鬱陶しいだけならば、そのまま我慢する
  (そのままの方が実行時間は速い)
2. オプションボタンに変更することが可能ならば、さらに研究する
3. ユーザーフォームのコマンドボタンに変更することが可能ならば、さらに研究する

 

Excel VBA Macro