質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.99%

  • VBA

    1420questions

    VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

  • Excel

    1222questions

    Excelは、マイクロソフト社が開発しているデータ集計や分析を行う表計算ソフトの一つです。文書作成や表計算、資料作成などの多彩な機能を備えており、統合パッケージであるMicrosoft Officeに含まれています。

ExcelVBAにおいて、どのActiveXコントロールボタンが押下されたか判断する方法

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 299

Martinez4_46

score 6

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を実行しない。

以上、よろしくお願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

checkベストアンサー

+1

この質問が出るのは「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 10:03 編集

    あらら・・・どちらも同じように「コントロール名_Click」などのハンドラーにイベントが結びつくものとばかり思っていました。自分の回答は不適切ということになりましょうか・・・
    ちゃんと確認してみます。

    キャンセル

  • 2018/01/18 10:06

    KSwordOfHasteさんの提示されたリンクにも記載されていますが、ActiveXコントロールのクリックイベントはボタン名で固定なのですが、フォームコントロールの場合は「マクロの登録」で作成済みのマクロを割り当てる形になります。
    複数のボタンに同じマクロを割り当てることもできますので、今回のように「どのボタンが押されたか判別したい」という要望がでてきやすいのです。

    キャンセル

  • 2018/01/18 10:23

    うーん、どちらも普通に定義すると「コントロール名_Click」というVBAマクロに結びつくように思えます。ひょっとすると自分の知識不足のため質問意図がわかっていないのかも知れません。

    キャンセル

  • 2018/01/18 10:28 編集

    なるほどそういうことですか・・・逆にコントロール名_Click以外に結び付けたことがないので自分の知識不足でしたね!お手数をおかけして申し訳ありませんでした。

    キャンセル

  • 2018/01/18 10:33 編集

    そうですね。フォームボタンも普通にボタン作成するとデフォルトでは「コントロール名_Click」というマクロを作成するように促されます。
    ただこれはデフォルトなだけで、好きなマクロ名で作成することもできますし、既存マクロを割り当てることもできます。
    作成後に別のマクロに割り当てなおす、ということもできます。

    ActiveXコントロールの場合は割り当てるマクロ名の選択などなく、強制的に「コントロール名_Click」でマクロ作成されると思います。
    ActiveXに「マクロの登録」はないので、後から別のマクロに割り当てるようなことも通常はできなかったと思います。

    キャンセル

  • 2018/01/18 10:47

    回答ありがとうございます。

    >おそらくCommandButton1_Clickにはhogehogeを呼び出す以外の処理もあり、
    >CommandButton2をクリックした際にはそのhogehoge以外の処理を同じように実行したい
    まさにその通りです。
    教えていただいた方法で、やりたかったことが実現できそうです。
    ありがとうございました。

    キャンセル

+1

解決済ですが、別案を。

そもそも、ActiveXでボタンを作成する必要があるのでしょうか?

個人的には、ActiveXボタンは灰色でフォント調整もしにくいので、
シェイプにマクロを登録して使います。
※シェイプの方が色や形などが容易に変えられるので、
ボタンを分類に分けて塗り分ける等、視覚的に分かりやすくなります。

マクロを登録する作業と、
ActiveXボタンのClickイベントに関数をセットする作業でも、
前者の方がセットしやすいです。

そして、シェイプをクリックした時に呼ばれたマクロ内では、
Application.Callerで
クリックしたシェイプの名前が取得できます。
※シェイプ名は、シェイプをクリックした状態で、
左上(セル番地が表示される所)で設定できます。

クリックしたシェイプの名前が取得できれば、
名前で条件が分岐できます。
※数値で分岐するより、可読性があがると思います。

ご参考まで。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/18 12:19

    回答ありがとうございます。

    シェイプのほうが使いやすそうですね。
    検討してみます。

    キャンセル

0

追記:jawaさんコメントにより自分が「複数のコントロールのハンドラーを同じにする」というケースに気づけてなかったことがわかりました。そういう作り方をしておられるなら「ハンドラーを別にする」というの手が分かり易いですが、ボタンが多くなると煩雑さは否めませんね。

http://www.k1simplify.com/vba/tipsleaf/callbuttonname.html
こういうページを見ると同一のハンドラーでクリックしたボタンを判定することもできるようです。
自分も知りませんでした・・・w;


普通にボタンのハンドラーを定義する方法でどのボタンがクリックされたかはわかる(ボタンごとに別のハンドラーを定義する)ことができると思います。その方法を採ればよいのではないですか?

https://support.office.com/ja-jp/article/フォームまたはコントロール ボタンにマクロを割り当てる-d58edd7d-cb04-4964-bead-9c72c843a283


ちなみに自分はとても古いOfficeしかインストールしていないので上記の説明とは少し違う操作になりますが基本的な考え方は同様だと思います。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

質問の意図がわかりません。
追記されているコードでは既に実現できていますが、何が問題なのでしょうか。
CommandButton1_Click関数はCommandButton1がクリックされたときにしか呼ばれない。
CommandButton2_Click関数はCommandButton2がクリックされたときにしか呼ばれない。
なのでCommandButton1_Click関数でhogehogeを呼ぶようにしておけば良いと思いますが。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/18 13:54

    恐らく、処理がほぼ一緒なんだけど、押されたボタンで微調整するというケースで、
    その調整処理を、1つの関数内で一元化しておきたい、
    という感じではないかと思います。

    キャンセル

  • 2018/01/18 13:58

    CommandButton1_ClickとCommandButton2_Clickから共通の関数を呼び出して、CommandButton1の時だけhogehogeを実行したい、と書いてあればわかるんですけどね。
    質問のコードを見る限りではこれでいいじゃん、と思ってしまいます。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.99%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • VBA

    1420questions

    VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

  • Excel

    1222questions

    Excelは、マイクロソフト社が開発しているデータ集計や分析を行う表計算ソフトの一つです。文書作成や表計算、資料作成などの多彩な機能を備えており、統合パッケージであるMicrosoft Officeに含まれています。