VBA - 動的に作成されたコンボ ボックスが 1 つのフォームでは機能しますが、他のフォームでは機能しません。クラス モジュールの問題ですか?

VBA - 動的に作成されたコンボ ボックスが 1 つのフォームでは機能しますが、他のフォームでは機能しません。クラス モジュールの問題ですか?

こんにちは。読んでいただきありがとうございます。これはOZGRIDからのクロスポストです。https://www.ozgrid.com/forum/index.php?thread/1227932-dynamic-created-combo-box-working-on-one-form-b​​ut-not-other-class-module-issue/ まだ運がないので、解決次第更新します。

動的に作成されたコンボボックスを持つ 2 つのフォームがあり、同じクラス モジュールを参照しようとしています。

最初のフォームは期待どおりに動作し、新しいフォームのコードに問題は見当たりません。

クラス モジュール コードは次のとおりです。

Option Explicit
Private WithEvents m_ComboBoxEvents As MSForms.ComboBox
Public Property Set Box(RHS As MSForms.ComboBox)
Set m_ComboBoxEvents = RHS
End Property
Private Sub m_ComboBoxEvents_Change()
If REACTIONS.Visible = True Then
Debug.Print "hELlO"
'\\ WHEN COMBOBOX CHANGES ON REACTION FORM IT PASSES THE CAPTION INFORMATION FOR THE BUTTONS.
If Len(Box.Name) = 7 Then REACTIONS.Frame20.Controls("MyNCBtn" & Right(Box.Name, 1)).Caption = Box.List(Box.ListIndex, 1) ' will only work until 9
If Len(Box.Name) = 8 Then REACTIONS.Frame20.Controls("MyNCBtn" & Right(Box.Name, 2)).Caption = Box.List(Box.ListIndex, 1) ' will work until 99
End If
Debug.Print "Hi"
If UFSTDRDS.Visible = True Then
MsgBox ("Hello")
End If
End Sub
Public Property Get Box() As MSForms.ComboBox
Set Box = m_ComboBoxEvents
End Property

フォームコードはこちらです。

Sub Not_Working()
Dim clsComboBox As New cComboBox
Dim MyCBx As MSForms.ComboBox
Dim m_colComboBoxEvents As Collection ' If I remove this line I get variable undefined error in next line, but it is not required in the working code above
Set m_colComboBoxEvents = New Collection
Loop starts here
Set MyCBx = Me.MultiPage1.Pages(2).Controls.Add("Forms.ComboBox.1", "MyNCBox" & x, 1)
Dim MyCBxfill As Variant
MyCBxfill = ws1.Range("A1").CurrentRegion
With MyCBx
.Top = 280 + ((x - 1) * 30)
.Left = 250
.Width = 350
.Height = 20
.FontSize = 8
.FontName = "Times New Roman"
.ColumnCount = UBound(MyCBxfill, 2)
'.ColumnWidths = ",0"
.List = MyCBxfill
End With
Set clsComboBox = New cComboBox
Set clsComboBox.Box = MyCBx
m_colComboBoxEvents.Add clsComboBox, CStr(m_colComboBoxEvents.Count + 1)
Loop ends here
End Sub

ozgrid サイトをスクロールすると、test.xlsb という例があります (注意: テキストのやり取りはいくつかありましたが、まだ誰も解決策を提供していません)。そこにはさらに詳しい情報もありますが、その投稿には詳細を詰め込みすぎたと思います。何らかの理由で、クラスが機能しません。

まったく新しいアプローチや代替構文は気にしません。ただ、元のコンテキストでは機能するのに、新しいコンテキストでは機能しない理由が理解できないだけです。

既存のコードに対するご意見や改善点があれば、ぜひお知らせください。

よろしく

ジャスティン

答え1

Rory @ Ozgrid.com によって解決されました。詳細は以下のとおりです。

あなたのワークブックを見ていませんが、2 番目のコード内のコレクションの宣言が間違った場所にあります。この行:

Dim m_colComboBoxEvents As Collection

モジュール レベルである必要があります。そうでない場合、ルーチンが終了するとすぐに変数がクリアされ、クラスのインスタンスが残らなくなります。

関連情報