2016-03-18 8 views
1

私のuserformのComboBoxの "change"イベントを処理するコードを記述しようとしています。ステッピング時にVBAコードの動作が異なります

私はしかし、それは動作しません

など、this質問の答えで行き、別のクラスを作成しました。新しいプロジェクトで同じコードを使用するとうまくいきますが、このプロジェクトのこのコードは、「ステップバイステップ」実行(F8)を使用すると動作することがありますが、通常の実行では実行されません。

他の人の似たような苦境を見ると、 "DoEvents"が追加されましたが、それは助けになりませんでした。

これは、ユーザーフォームに

Private Sub UserForm_Initialize() 

Dim ComboBox_Collection As Collection 
Dim ctrl As Control 
Dim cbc As ComboBox_Class 

Set ComboBox_Collection = New Collection 
    For Each ctrl In UserForm1.MultiPage.Pages(2).Controls 
    DoEvents 
     If TypeName(ctrl) = "ComboBox" Then 
      DoEvents 
      Set cbc = New ComboBox_Class 
      Set cbc.Control = ctrl 
      ComboBox_Collection.Add cbc 
      DoEvents 
     End If 
    Next ctrl 
Set cbc = Nothing 

End Sub 

私のコードであり、「ComboBox_Class」という名前のクラスモジュール、:

Private WithEvents TriggerComboBox As MSForms.ComboBox 

Public Property Set Control(CB As MSForms.ComboBox) 
    Set TriggerComboBox = CB 
End Property 

Private Sub TriggerComboBox_Change() 
    MsgBox ("yay") 
End Sub 
+0

実行したいことを教えてください。 –

+0

@ScottMarcus、私は、ユーザーフォーム上の特定の型のすべてのコントロールの "変更"イベントを処理する簡単なコードを用意したいと思います。 – mathgenius

答えて

2

ComboBox_Collectionは、フォームのにグローバル少なくともグローバル変数(、である必要がありますコードモジュール)、またはUserForm_Initializeサブの実行が終了するとすぐに消滅/範囲外になります

+0

ありがとう!それは、私はモジュールにコレクションを移動し、それを公開しました、今それは動作します! – mathgenius

+0

@mathgeniusクラスの外部からアクセスする必要がなければ、 'Public'にする必要はありません。そして、クラスの外でそれにアクセスする必要があるとしても、適切なカプセル化を保持するために、*パブリックプロパティGet'メンバとして*のコピー(おそらく配列)を公開する必要があります。 –

関連する問題