2017-09-08 61 views
1

簡単に言えば、ここにある例:How to add events to Controls created at runtime in Excel with VBAを試してみましたが、自分のボタンをクリックしても何も起こりません。VBAユーザーフォームの動的に作成されたボタンにイベントを追加できません

私は一度にたくさんのボタンを作成していないのですが、ユーザーが特定の追加済みボタンをクリックするたびに新しいボタンが追加されます。

ボタン作成のためのコード:

'Finally the delete button 
Dim newb As MSForms.CommandButton 
'thisQuant is a var keeping track of how many buttons there are 
Set newb = FProducts.Controls.Add("Forms.CommandButton.1", "del" & thisQuant, False) 
Dim Button As New Class1 
Set Button.delButton = newb 

そして例で述べたように、新しいクラス:

Public WithEvents delButton As MSForms.CommandButton 

Private Sub delButton_Click() 
    MsgBox "test" 
    'quantProd = CInt(NewNota.ProductQuant.Caption) 
End Sub 

は、私は、Pythonから来て、VBAは非常に混乱しています。

+1

おそらくあなたはあなたのコードを[mcve]に表示する必要があります。他の解決法が機能するはずなので、最初のアプローチは*そのまま*そのままコピー/実装し、それが動作するかどうかを確認することです。必要に応じて新しいワークブックでそれを行います。私は他のソリューションでは、フォームのコンストラクタにボタン*配列*を作成していることに気付きました: 'Dim ButArray()As New Class2'(' Class2'はボタンイベントクラスのクラスモジュールです。 –

+3

これを行う最も一般的な問題は、Class1インスタンスをグローバルとして宣言することを忘れることです(つまり、モジュールの上部ではなく、サブモジュールではなく)。関数を呼び出す)ので、範囲外になり、ボタンを作成するコードが終了するとすぐに破棄されます。 –

+0

@TimWilliams Yup、ありがとうございました。モジュールで宣言できます。完全な回答を投稿する – Mojimi

答えて

4

このタイプのことを行う際によくある間違いは、Class1インスタンスまたはインスタンス/配列のインスタンスをグローバル(つまり、モジュールの上部で、SubまたはFunctionではなく)として宣言するのを忘れることです。 。

これをしないと、カスタムクラスインスタンスが有効範囲外になり、ボタンを作成するコードが終了するとすぐに破棄されます。

Dim Button As Class1 

Sub CreateButton() 
    Dim newb As MSForms.CommandButton 

    '... 

    'thisQuant is a var keeping track of how many buttons there are 
    Set newb = FProducts.Controls.Add("Forms.CommandButton.1", "del" & thisQuant, False) 

    Set Button = New Class1 
    Set Button.delButton = newb 

    '... 

End Sub 
関連する問題