プロが教えるわが家の防犯対策術!

excel2003を使っています。
結構マクロは書くので、ボタンが貼られています。
このボタンが押されたときに、
どのボタンが押されたかで処理を分けてみたいと考えています。
ズバリ、どのボタンが押されたかを把握したいのです。

質問までの経緯ですが、
調べたところ、ワークシートイベントで「change」というのが在りますが、
シートの何処かが変わる必要があり、
ボタンを押しただけではイベントが起きません。

解決方法として考えられるのが、
各ボタンで本来のマクロを動かす時の最後に、
自分のIDを何処か決められたセルに置けば可能です。

これをやらずに、
(まさにイベントが起きたように)標題を解決する方法はありませんでしょうか。
宜しくお願いします。

A 回答 (4件)

各ボタンのマクロに組み込む方法がベストだと思いますよ。



例えば、https://umeyalabo.com/application-caller のマクロで
Sub ボタン1_Click()
 Range("A3") = Range("A3") + 1
 ボタンの文字を判定
End Sub

Sub ボタン2_Click()
 Range("A5") = Range("A5") + 1
 ボタンの文字を判定
End Sub

Private Sub ボタンの文字を判定()
Dim Button_Text As String
'押されたボタンの文字を判定
Button_Text = Worksheets(1).Buttons(Application.Caller).Text
 If Button_Text = "新規" Then
  MsgBox "新規ボタンが押されました。"
  ElseIf Button_Text = "更新" Then
  MsgBox "更新ボタンが押されました。"
 End If
End Sub
のように、各ボタンでそれぞれのマクロの最後(End Sub直前など)に
「ボタンの文字を判定」を組み込めば、どれかのボタンを押すたびに、
「ボタンの文字を判定」マクロも一緒に実行されるのですから。
    • good
    • 0
この回答へのお礼

わざわざコードまで頂き恐縮です。
本件は、貼っていただいたページの通り、
また今回書いていただいた通りが「これから作るのでしたら」ベスト、
は理解しております。

最初から書かなかったのがご迷惑を掛けてしまった原因ですが、
現在、何個もマクロの引き金ボタンが在るブックに在ることが必要で手を入れなくてはならなかったのです。

なので、一つのプロシージャーでと思っています。
結局は出来ないので、もう少し考えますが、
最終的には教えのように汎用procを作り、
片っ端から入れていくこととなるかもしれません。

兎に角、
今回はcallerを学びました。
さらにお手間を掛けてしまい申し訳ありませんでした。
これを持ってクローズさせていただきます。
毎回ですが、大変お世話になりました。

お礼日時:2021/08/06 16:06

たぶん、イベント処理で取得するよりApplication.Callerで処理した


ほうが、希望していることをするのに向いていると思いますよ
https://vbae.odyssey-com.co.jp/column4/s41402.html
https://umeyalabo.com/application-caller
    • good
    • 1
この回答へのお礼

何時もお世話になっております。
また、今回も的確な回答、ありがとうございました。

ただ、残念ながら、callerで方向はずばりなのですが、
これ自体の引き金をイベントにならないかというのが今回の要求なのです。

言ってみれば、
本件のcallerを動かすためにも何らかの引き金が必要です。
そのためにボタンを押したり、
それぞれの(現在動いている)マクロに引き金を組み込むことはしたくなく、
例えばに書いたように、
ワークシートイベント「change」のように、
何らかのボタンが押されたらそれを頼りに、ある動作を起こしたい、
ということです。

changeでもほぼ満足できるのですが、
changeではシートが幾らかでも動かなければトリガが引かれません。
今動いているマクロの中にはカウンターの更新だけが在り、
この場合は、イベントの引き金が起きません。

ということで、
今一つそこまで行っていますが、
という段階です。

お礼日時:2021/08/06 10:44

こんにちは


なさりたい事が良く分からないのですが、

>ボタンを押しただけで発生するイベントは無いか
何のボタンを指しているのか不明ですが、ボタン作成時に付けたマクロ名が実行トリガです。または、CommandButton?_Clickがイベントです。

シート上に作成されたシェイプボタンであればボタンにマクロを登録しないとイベントは無いです。
UserForm上であるならCommandButton?_Clickがイベントです。

>ボタンを押しただけではイベントが起きません。
? イベントとはVBAの実行トリガを指しているのではないのでしょうか?
ボタンをトリガーとするには、そのボタンにマクロを登録すれば良いだけでは? 

>どのボタンが押されたかで処理を分けてみたいと考えています。
これだけなら、各ボタンに実行したいプロシージャを登録すれば良いだけ
どのボタンか知りたければ押したオブジェクト名を取得すれば良い

1つのボタンでユーザーによって処理を分けたいと言う事でしょうか?
そうであるなら、やり方は色々あります。

Excelを使用するPCやWindowsのアカウントが違うなら
Private Sub Workbook_Open()時に
CreateObject("WScript.Network")を取得して
Static変数に代入して使用するとか、、
 
もし、Excelを使用するPCやWindowsのアカウントが同じなら
あらかじめUserFormにパスワードやIDを求めるTextBoxなどを配置したものを作成しPrivate Sub Workbook_Open()時にUserFormを呼びStatic変数に代入して使用するとか、、
Static変数の使い方としてはFunction に分岐処処理などを書いて
プロシージャ実行時にFunctionを呼ぶとか、、、

>調べたところ、ワークシートイベントで「change」というのが在りますが、シートの何処かが変わる必要があり、ボタンを押しただけではイベントが起きません。

確かに、
しかしボタンに (例として同じシートモジュールに)
Sub test()
Call Worksheet_Change(Range("A1"))
End Sub
を登録
Private Sub Worksheet_Change(ByVal Target As Range)
MsgBox ("Changeイベントが実行されました")
End Sub
実行出来ます。。。しかし、

上記のコードは下記の様にするべき(ボタンからもChangeイベントからも同じプロシージャが実行されます)
Sub Button() 'ボタンに登録
Call Sample
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
Call Sample
End Sub
Sub Sample()
MsgBox ("OK")
End Sub

>excel2003
正しく動く保証がないのでこの辺で
    • good
    • 0
この回答へのお礼

早速ありがとうございました。
ボタンとは、
プロジェクトの中で仕事をさせているマクロを起動するためのボタンです。
フォームの中で作ったボタンとか、コマンドボタンではありません。
単純に、シートに貼ったマクロ引き金のボタンです。

ということで、こまごまと書いていただきましたが、
申し訳ありませんでした。

お礼日時:2021/08/06 10:36

ここ何年も仕事をしないので忘れましたが、企業にアプリを納入していました。

企業はExcel がベースなので、複雑な動作や特殊な依頼にはVBAで作成しました。操作画面もWindows の画面と同じように作れますのでお勧めです。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!