Excel (VBA)

Excel VBAに関するフォーラムです。
  • 掲示板への投稿には会員登録(無料)が必要です。会員登録がまだの方はこちら
  • 掲示板ご利用上のお願い」に反するご記入はご遠慮ください。
  • Q&A掲示板の使い方はこちらをご覧ください
トピックに返信
質問

 
(Windows 10全般 : Excel 2013)
複数コマンドボタンのクリック処理を共通化したい
投稿日時: 20/02/19 14:37:09
投稿者: マシュマロ312

Excelシート上にActive Xコントロールのコマンドボタンを複数作成し、どのボタンが押されたかで、2種類の処理に分けたいです。
クラスモジュールを利用して、イベント処理を共通化する方法があるようですが、
いろいろと調べて記述しているのですが全く分かりません。
ほとんどフォーム上のボタンの操作です。
私はシート上にあるボタンのイベント処理をしたいのです。
 
シートには、人の情報が一覧になっています。
 
一行ごとA列にcaption「A」のボタンとB列にcaption「B」のボタンを配置しています。
C列から右側には人に関するデータが入力されています。これが1つのレコードです。
 
データは100行程度あり、1人につき[A][B]のコマンドボタンがあるため、シート上には
ボタンが200個程度あります。
 
200個のイベントプロシージャを記述できないので、2種類の処理にどのように分ければいいでしょうか。
 
ボタンが配置されているシート名は「一覧」シートです。

回答
投稿日時: 20/02/19 15:23:03
投稿者: takesi

https://www.moug.net/faq/viewtopic.php?t=78985
参考になるとおもいます。
 
 
ボタン2個にして最上部に配置、ウインドウ枠の固定する
ボタンの処理はアクティブセル参照して、、、、
の方が楽なような気がします。
 

回答
投稿日時: 20/02/19 21:56:50
投稿者: ピンク

マクロボタンなら同じマクロを登録してApplication.Callerで
ボタンの位置情報、Textなどを取得できるので得た情報で
処理を分けられませんか
Sub Sample()
    With Sheets("Sheet1")
        MsgBox .Buttons(Application.Caller).Text
        MsgBox .Buttons(Application.Caller).TopLeftCell.Address(0, 0)
    End With
End Sub

投稿日時: 20/02/21 09:53:27
投稿者: マシュマロ312

takesi様
参考先を見ましたが、スキル不足で良く分かりませんでした。
AccessVBAと同様の書き方でしょうか。
 
また、上部に2個のボタンを作成し、ある人のレコードに配置した
チェックボタンをつけたものの処理を実施する方法も試みましたが、
一覧をフィルタに掛けると、チェックボタンが重なってしまい、これでは
出来ないと判断しました。
 
ピンク様
マクロボタンとはフォームボタンのことですか?
今回は訳がありActiveXコントロールで作成したいのです。
Application.CallerはActive Xコントロールでは利用できないようでしたので、
その方法は無理でした。
 
やはりどこのサイトを見ても、このような処理方法をやっているのは無さそうで
諦めるしかなさそうですね。。

回答
投稿日時: 20/02/21 11:32:39
投稿者: 半平太

>クラスモジュールを利用して、イベント処理を共通化する方法があるようですが、
>いろいろと調べて記述している
 
であれば、話は早いです。
 
クラスモジュールの名前を例えば「cBtn」とする。
※デフォルト名は「Class1」だがその名前では雰囲気が出ないので敢えて変更します。
 

’--------cBtnモジュールに↓----------------

Private WithEvents CommandBtn As msforms.CommandButton

Sub setinit(OLEo As msforms.CommandButton)
    Set CommandBtn = OLEo
End Sub


Private Sub CommandBtn_Click()
    'ここに当該セル(TopLeftCell)に関係してやりたい処理を書く

    MsgBox CommandBtn.TopLeftCell.Address & "のボタンがクリックされた"
End Sub

’--------ボタンがあるシートモジュールに↓----------------

Private cBtns() As cBtn

Sub 作業前処理()
    Dim OLE As OLEObject
    Dim cnt As Long
    
    For Each OLE In Me.OLEObjects
        cnt = cnt + 1
        ReDim Preserve cBtns(1 To cnt)
        Set cBtns(cnt) = New cBtn
        cBtns(cnt).setinit OLE.object
    Next
End Sub

 

回答
投稿日時: 20/02/22 08:01:06
投稿者: ロードランナー
投稿者のウェブサイトに移動

マシュマロ312 さんの引用:
Excelシート上にActive Xコントロールのコマンドボタン

 
この場合のコマンドボタンはOLEObjectで、このイベントをクラスでWithEventsはできるのですが、プロシージャボックスにはGot/LosfFocusしか選択できず、また標準モジュールからSetしてしようとすると「サポートされていません」となってしまいます。
 
先達もいろいろトライしていたようですが、この記事の最後には、「無理っぽい」とありました。
https://okwave.jp/qa/q4033874.html
 
そもそもシート上に200個もコマンドボタンを設ける、というユーザーインターフェイスを見直した方がいいと思います。

回答
投稿日時: 20/02/22 11:52:01
投稿者: 半平太

ロードランナーさん
 
OLEObjectじゃなく、
OLEObject.Objectですよ(紛らわしいですけど)。

トピックに返信