ExcelVBAについての質問です。
シートに2つ以上のActiveXコントロールボタンが配置されている場合、
どのボタンが押下されたか判定する方法はありますでしょうか。
以上、よろしくお願いいたします。
2018/01/18 10:03 追記
Private Sub CommandButton1_Click()
Call hogehoge
End Sub
Private Sub CommandButton2_Click()
Call CommandButton1_Click
End Sub
回答を下さった方、ありがとうございます。
補足させていただきます。
上記のようなソースで、「hogehoge」を実行するかどうかというのを、
押下されたボタンで判定したいのです。
CommandButton1クリック時:hogehogeを実行する。
CommandButton2クリック時:hogehogeを実行しない。
以上、よろしくお願いいたします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答4件
0
解決済ですが、別案を。
そもそも、ActiveXでボタンを作成する必要があるのでしょうか?
個人的には、ActiveXボタンは灰色でフォント調整もしにくいので、
シェイプにマクロを登録して使います。
※シェイプの方が色や形などが容易に変えられるので、
ボタンを分類に分けて塗り分ける等、視覚的に分かりやすくなります。
マクロを登録する作業と、
ActiveXボタンのClickイベントに関数をセットする作業でも、
前者の方がセットしやすいです。
そして、シェイプをクリックした時に呼ばれたマクロ内では、
Application.Callerで
クリックしたシェイプの名前が取得できます。
※シェイプ名は、シェイプをクリックした状態で、
左上(セル番地が表示される所)で設定できます。
クリックしたシェイプの名前が取得できれば、
名前で条件が分岐できます。
※数値で分岐するより、可読性があがると思います。
ご参考まで。
投稿2018/01/18 03:15
総合スコア1175
0
ベストアンサー
この質問が出るのは「ActiveXコントロール」ではなく「フォームコントロール」のボタンをシート上に配置した場合の方が多いような気がしますが。
ActiveXボタンの場合、例えば CommandButton1
というボタン名ならクリックイベントは CommandButton1_Click
というように、ボタン毎にクリックイベントが別れていると思います。
入り口(クリックイベント)が別れていますので、その時点で「CommandButton1が押された」という情報を覚えておけば、たとえその後共通関数が呼ばれたとしてもどの入口から入ってきたのか判別可能になると思いますが、どうでしょうか?
追記をうけて
おそらくCommandButton1_Clickにはhogehoge
を呼び出す以外の処理もあり、CommandButton2をクリックした際にはそのhogehoge以外の処理を同じように実行したい、ということだと思います。
こういう場合、共通で使用する処理は直接CommandButton1_Clickに記述せず、別関数とした方が扱いやすくなります。
下記のサンプルではCommandButton1_Click
の内容をそのままprcButtonClick
という別関数に載せ替え、hogehogeを実行するかどうかだけ呼び出し元によって切り分けるようにしています。
各ボタンでは、自分がどのボタンなのかをprcButtonClick
関数に渡すようにしています。
Private Sub CommandButton1_Click() Call prcButtonClick(1) End Sub Private Sub CommandButton2_Click() Call prcButtonClick(2) End Sub Private Sub prcButtonClick(ByVal viBtnNo As Integer) If viBtnNo = 1 Then Call hogehoge End If 'hogehoge以外の処理 End Sub
参考になれば幸いです。
投稿2018/01/18 00:56
編集2018/01/18 01:24総合スコア3020
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/01/18 01:23
2018/01/18 01:28 編集

0
質問の意図がわかりません。
追記されているコードでは既に実現できていますが、何が問題なのでしょうか。
CommandButton1_Click関数はCommandButton1がクリックされたときにしか呼ばれない。
CommandButton2_Click関数はCommandButton2がクリックされたときにしか呼ばれない。
なのでCommandButton1_Click関数でhogehogeを呼ぶようにしておけば良いと思いますが。
投稿2018/01/18 01:46
総合スコア17000
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/01/18 04:54

0
追記:jawaさんコメントにより自分が「複数のコントロールのハンドラーを同じにする」というケースに気づけてなかったことがわかりました。そういう作り方をしておられるなら「ハンドラーを別にする」というの手が分かり易いですが、ボタンが多くなると煩雑さは否めませんね。
http://www.k1simplify.com/vba/tipsleaf/callbuttonname.html
こういうページを見ると同一のハンドラーでクリックしたボタンを判定することもできるようです。
自分も知りませんでした・・・w;
普通にボタンのハンドラーを定義する方法でどのボタンがクリックされたかはわかる(ボタンごとに別のハンドラーを定義する)ことができると思います。その方法を採ればよいのではないですか?
ちなみに自分はとても古いOfficeしかインストールしていないので上記の説明とは少し違う操作になりますが基本的な考え方は同様だと思います。
投稿2018/01/18 00:29
編集2018/01/18 01:35総合スコア18404
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/01/18 03:19