控件事件未在VBA类模块中触发

时间:2017-02-05 19:33:40

标签: vba class ms-access events

我在从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。我做错了什么?

2 个答案:

答案 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]"

这将使类模块知道必须执行一个事件。因此,无需在表单代码中声明所有子项。