VBA类未从动态创建的窗体对象集合中执行



我知道这是以前问过的一个问题,我尝试过多个建议的解决方案,但要么我不太明白大多数解决方案是如何工作的,要么发生了其他事情
代码从动态创建的表单对象中构建集合,并将其发送到一个类,在该类中,它们被附加到要执行的事件,或者至少这就是计划。然而,它不想为每个对象执行事件代码,除非在编辑代码后一步一步地执行,然后只执行一次

我确实有一个工作版本的代码,但我想为运行时优化它,即使它正确地生成了表单和对象,并以与旧代码相同的方式将对象添加到集合中,它也停止了工作
然后我重写了代码,只是想看看问题出在哪里,但我似乎无法弄清楚。

这是简化的代码

Dim cEvents As Collection: Set cEvents = New Collection
Dim CntrlH As caCntrlHndlr
Dim OptBtn1 As MSForms.OptionButton
Dim OptBtn2 As MSForms.OptionButton
Dim ChkBx As MSForms.CheckBox
Dim Nm As String
Dim iMvT, iMvL, iOpt As Integer

iOpt = 16
iMvT = 12
i = 0
For Each vKey In .Keys

Set CntrlH = New caCntrlHndlr
Set ChkBx = S5ca1.Frame1.Controls.Add("Forms.CheckBox.1", "Slct" & i, True)
With ChkBx
.Caption = vKey
.Height = iOpt
.Width = Len(CStr(vKey)) * 20
.Left = 6
.Top = iMvT
End With

Set CntrlH.ChkBx = ChkBx

Nm = "X"
iMvL = 5
Set OptBtn1 = S5ca1.Frame2.Controls.Add("Forms.OptionButton.1", Nm & i, True)
With OptBtn1
.GroupName = Nm & i
.Caption = ""
.Height = iOpt
.Width = iOpt
.Left = 5
.Top = iMvT
End With
Set CntrlH.OptBtn1 = OptBtn1

Set OptBtn2 = S5ca1.Frame2.Controls.Add("Forms.OptionButton.1", Nm & i, True)
iMvL = 30
With OptBtn2
.GroupName = Nm & i
.Caption = ""
.Height = iOpt
.Width = iOpt
.Left = 30
.Top = iMvT
End With
Set CntrlH.OptBtn2 = OptBtn2

iMvT = iMvT + 20
i = i + 1
cEvents.Add CntrlH

Next vKey

S5ca1.Height = iMvT + 120
S5ca1.Frame1.Height = iMvT + 10
S5ca1.Frame2.Height = iMvT + 10
S5ca1.OK.Top = S5ca1.Height - 54
End With
End Sub

上面的代码只是它的一部分,所以不要担心最后的代码,这不是问题所在。

类代码

Public WithEvents ChkBx As MSForms.CheckBox
Public WithEvents OptBtn1 As MSForms.OptionButton
Public WithEvents OptBtn2 As MSForms.OptionButton
Private Sub ChkBx_Click()
MsgBox "ChkBx"
End Sub
Private Sub OptBtn1_Click()
MsgBox "OptBtn1"
End Sub
Private Sub OptBtn2_Click()
MsgBox "OpBtn2"
End Sub

尝试的解决方案

我知道,在Collection中每个项目有多个对象可能不是问题所在。我试过对每个项目使用一个项目,但似乎不起作用,而且脚本的工作版本有Collection设置。我曾尝试使用FrmObjct.OnClick="[Event Procedure]"事件来强制交互,除非我做错了什么,否则这是行不通的(我很确定我应用错了(。

考虑到问题的性质,我可能错过了一些非常简单的事情,但我似乎找不到那是什么,如果解决方案很简单,我很抱歉。这是我第一次上课。

谢谢你的帮助。

您需要在方法之外保留对cEvents集合的引用。否则,在方法完成执行后,您的集合将被销毁。

private cEvents as Collection
Public Sub YourSubFromYourPost()
set cEvents = new Collection
'// the rest of your code here
End Sub

最新更新