单击类模块中的事件不成功

我有一个用户窗体显示逐行validation错误(在文本框中),我想补充用户的表单标签作为超链接,用户可以点击直接进入有问题的单元格。

我有代码,dynamic地build立标签,并通过类模块添加了一个单击事件,但我不能得到它的类模块中点击事件触发。

我从工作代码中修改了这个代码,这些代码构build了这种types的标签,并且在运行中单击事件,但是代码在用户启动时加载标签,并将每个类对象放入一个集合中。 我不知道是否有必要build立我的解决scheme,但我玩了它,不能得到它的工作。

这里是我的程序,如果需要的话,在用户表单上放置标签。 如果需要validation,它将在另一个过程中运行。 用户窗体比显示,填写消息(这是一个标签,现在创build),如果需要validation。

Sub PlaceLinkLabel(SayWhat As String, WhichSheet As String, WhichRange As String) Dim lblNew As MSForms.Label Set lblNew = frmValidationMessage.Controls.Add(bstrProgID:="Forms.Label.1", Name:=SayWhat, Visible:=True) With lblNew With .Font .Size = 10 .Name = "Comic Sans MS" End With .Caption = SayWhat .Top = 55 .Height = 15 .Left = 465 .Width = 100 End With Dim clsLabel As UserFormLabelLinks Set clsLabel = New UserFormLabelLinks Set clsLabel.lbl = lblNew With clsLabel .WhichRange = WhichRange .WhichSheet = WhichSheet End With 'not sure if this is needed or not 'Dim pLabels As Collection 'Set pLabels = New Collection 'pLabels.Add clsLabel End Sub 

这里是UserFormLabelLinks类模块:

 Option Explicit Private WithEvents pLabel As MSForms.Label Private sWhichRange As String Private sWhichSheet As String Public Property Set lbl(value As MSForms.Label) Set pLabel = value End Property Public Property Get WhichSheet() As String WhichSheet = sWhichSheet End Property Public Property Let WhichSheet(value As String) sWhichSheet = value End Property Public Property Get WhichRange() As String WhichRange = sWhichRange End Property Public Property Let WhichRange(value As String) sWhichRange = value End Property Private Sub pLabel_Click() MsgBox "hi" 'when i click label, this does not fire 'Application.Goto ThisWorkbook.Worksheets(WhichSheet).Range(WhichRange), True 'ActiveWorkbook.FollowHyperlink ("#" & WhichSheet & "!" & WhichRange) End Sub 

一旦PlaceLinkLabel退出, MSForms.Label对象将超出范围,就像UserFormLabelLinks对象引用一样; 因此你正在创build一个标签,但是这是一个让人遗忘的事情,只要到达End Sub就不能以编程方式访问,因此事件永远不会被触发。

您需要一个专用字段来保留UserFormLabelLinks对象引用(并因此通过封装的pLabel字段保留MSForms.Label引用):

 Option Explicit Private clsLabel As UserFormLabelLinks 

然后在程序中删除这一行:

 Dim clsLabel As UserFormLabelLinks 

换句话说,将该局部variables提升到一个字段,并在程序完成后保持它。

另一种有效的方法是:

Private pLabels As Collection放置在存放PlaceLinkLabel的模块上

并使用

 If pLabels Is Nothing Then Set pLabels = New Collection pLabels.Add clsLabel 

PlaceLinkLabel模块的末尾