私はこのようにあなたのクラスを修正したい:
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イベントを使用すると、ブック内の他のコードで未処理のエラーが発生した場合に、より頻繁にリセットされることを意味するはずです。
[フォーム]ボタンを使用すると、すべてのマクロに同じマクロを割り当てることができます。また、ActiveXボタンよりもずっと安定しています。 – Rory
こんにちは、Rory、私に戻ってくれてありがとう。これは多くのボタンとコードを持つ古いスプレッドシートです。私は今ActiveXコントロールを避けることを知っていますが、これが開発されたときにActiveXとして作成されました。また、ボタンの有効化と無効化の間には多くの相互作用があります。実行したいコードは、実際にはボタンのサイズ変更の問題を扱うコードです。すべてのボタンのクリックイベントの開始時にプロシージャを呼び出すのではなく、ボタンのクリックを捕まえる普遍的なイベントが必要な場合は、その余分なコードを実行して、いつものようにボタンの独自のクリックイベントを続行します。 – Stef