我在从VBA Access中的类模块中嵌入的控件中触发任何事件时遇到问题。尽管在与此相关的各种论坛中进行了很多(很多!)对话,但我还没有找到任何帮助我的方法。据我所知,我正在遵循他们的所有建议(主要是,我总是使用" Access.Control"," Access.Label"等等所以它始终是相同的库使用,参考仍然存在于事件发生的时刻...),但它仍然没有发射! 在同一个项目中,我在几个类中遇到了同样的问题;我将以表格上的一组标签为例。
表单的load事件会创建一个像这样的第一个大组:
Private Sub Form_Load()
...
set mGroups = new CDocTree
mGroups.Make Me
End Sub
在CDocTree中,有三个成员变量声明如下:
Private WithEvents mVVPlan As CDocGroup
Private WithEvents mTestPlan As CDocGroup
Private mFrm As Form_FrmAlphaDocuments
和方法Make基本上做到了这一点:
Public Sub Make(frm As Access.Form)
Set mFrm = frm
With mFrm
Set mVVPlan = New CDocGroup
mVVPlan .Make .LblVVPlanBox, .LblVVPlanRef
Set mTestPlan = New CDocGroup
mTestPlan .Make .LblTestPlanBox, .LblTestPlanRef
End With
End Sub
最后,类CDocGroup的定义如下:
Private WithEvents mBox As Access.Label
Private WithEvents mRef As Access.Label
Public Event Clicked(grp As CDocGroup)
Public Sub Make(box As Access.Label, ref As Access.Label)
...
Set mBox = box
Set mRef = ref
End Sub
Private Sub mBox_Click()
Debug.Print "Event Click fired in CDocGroup on " & mBox.Name
RaiseEvent Clicked(Me)
End Sub
Private Sub mRef_Click()
Debug.Print "Event Click fired in CDocGroup on " & mRef.Name
RaiseEvent Clicked(Me)
End Sub
它就是:代码永远不会进入mBox_Click或mRef_Click。我做错了什么?
答案 0 :(得分:0)
感谢VBlades,它可以解决问题。
虽然令人愤火的是这样的事情应该是必要的,但我确实可以验证,如果我为某些控件而不是其他控件发出声明,我的事件只会触发具有空事件声明的控件。形式的模块。
所以要明确的是,在表单的模块中,对于我需要做出反应的每个控件,我添加一个空声明:
Private Sub LblVVPlanBox_Click()
End Sub
根本没有代码,但现在我的类中的事件触发并且类中的代码被执行。它有点难看,但仍然比在表格模块中复制20次相同的指令更好。
答案 1 :(得分:0)
如果有人像我一样浏览此帖子,试图弄清事件为何不触发的原因,那将是一个simpler solution on another forum。
基本上,当您在类模块中设置mBox / mRef时,请执行以下操作:
mBox.OnClick = "[Event Procedure]"
mRef.OnClick = "[Event Procedure]"
这将使类模块知道必须执行一个事件。因此,无需在表单代码中声明所有子项。