2017-10-11 3 views
0

ワークシートのコマンドボタンが押されたときに実行するコードがあります。私はuserformsのための同様のものを見たが、ワークシートのボタンを越えて(そ​​して限られた)働く何かを見つけることができない。私は次のコードでclsCmdButtonと呼ばれるクラスモジュールの作成限り持っているExcel-VBAすべてのワークシートをキャプチャするCommandButton Clickイベントを使用してユニバーサルコード

Private WithEvents cmdButton As MSForms.CommandButton 

Private Sub cmdButton_Click() 
'code i want to run 
End Sub 

私は、私はすべてのワークシートをループする必要があると思うし、その上にコマンドボタンや新品同様intialiseそれぞれを見つけますクラスのinsance。これはWorkbook_Openイベントで行うことができますが、コード化する方法がわかりません。誰でも助けてくれますか?

ありがとうございます!

+0

[フォーム]ボタンを使用すると、すべてのマクロに同じマクロを割り当てることができます。また、ActiveXボタンよりもずっと安定しています。 – Rory

+0

こんにちは、Rory、私に戻ってくれてありがとう。これは多くのボタンとコードを持つ古いスプレッドシートです。私は今ActiveXコントロールを避けることを知っていますが、これが開発されたときにActiveXとして作成されました。また、ボタンの有効化と無効化の間には多くの相互作用があります。実行したいコードは、実際にはボタンのサイズ変更の問題を扱うコードです。すべてのボタンのクリックイベントの開始時にプロシージャを呼び出すのではなく、ボタンのクリックを捕まえる普遍的なイベントが必要な場合は、その余分なコードを実行して、いつものようにボタンの独自のクリックイベントを続行します。 – Stef

答えて

2

私はこのようにあなたのクラスを修正したい:

Private WithEvents m_ctlButton As MSForms.CommandButton 

Private Sub Class_Terminate() 

    Set m_ctlButton = Nothing 

End Sub 


Private Sub m_ctlButton_Click() 
'code i want to run 
End Sub 

Public Property Set Button(ctlButton As MSForms.CommandButton) 

    Set m_ctlButton = ctlButton 

End Property 

はのは、私は怠け者だとして、これはクラス1であると仮定しましょう。

Option Explicit 
Dim colButtons As Collection 
Sub hookButtons(ws As Object) 
    Dim oBtn As Class1 
    Dim obj As OLEObject 
    Set colButtons = New Collection 
    For Each obj In ws.OLEObjects 
     If TypeOf obj.Object Is MSForms.CommandButton Then 
      Set oBtn = New Class1 
      Set oBtn.Button = obj.Object 
      colButtons.Add oBtn 
     End If 
    Next 
End Sub 

をし、最終的に、はThisWorkbookモジュールに、この追加:

今新しいモジュールでこれを追加するには、そのシートがアクティブにせずにボタンをクリックすることはできませんので

Private Sub Workbook_Open() 
    hookButtons ActiveSheet 
End Sub 

Private Sub Workbook_SheetActivate(ByVal Sh As Object) 
    hookButtons Sh 
End Sub 

を常に、アクティブなシートのボタンだけをフックする方が簡単です。 sheetActivateイベントを使用すると、ブック内の他のコードで未処理のエラーが発生した場合に、より頻繁にリセットされることを意味するはずです。

+0

それは素晴らしいです。 m_ctlButton_Click()イベントが発生していないことを除いて、素晴らしい動作します。コレクションは作成され、ボタンはその中にありますが、クリックされると、クラスイベントではなく独自のコードが実行されます。なぜどんなアイデア? – Stef

+0

私は恐れていません。私はコードをテストし、ここで動作するので、ボタンがやっていることが干渉していると推測しなければならないでしょう。それが動作していないことを示すブックへのリンクを投稿することができれば、分があるときは見ています。 – Rory

+0

こんにちは、私は問題を発見した。クラスイベントは、ボタン自身のイベントの後に発生します。ボタンコードが別のシートをアクティブにすると、ワークシートのアクティブ化イベントによって、作成されたクラスボタン、したがってそのイベントが強制終了されます。私は、ボタンイベントがそこに来る前にクラスイベントを発生させる方法がないと思いますか? – Stef

関連する問題