【发布时间】:2018-04-20 03:27:46
【问题描述】:
我有一个显示逐行验证错误的用户表单(在文本框中),我想用用户表单标签作为超链接来补充它,用户可以单击这些标签直接转到有问题的单元格。
我有动态构建标签的代码,并通过类模块添加了一个点击事件,但我无法让它触发类模块中的点击事件。
我确实从构建这种类型的标签和点击事件的工作代码修改了这段代码,但是该代码在用户窗体初始化时加载标签并将每个类对象放入一个集合中。我不知道这是否需要构建到我的解决方案中,但我玩过它但无法让它工作。
如果需要,这是我在用户窗体上放置标签的过程。如果需要验证,它会在另一个过程中运行。如果需要验证,则显示用户表单,并填写消息(以及现在创建的这个标签)。
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
【问题讨论】:
-
FWIW 我打开了feature request to have a Rubberduck inspection for this - 我们应该能够静态确定事件源超出范围,并发出警告 =)跨度>
-
@Mat'sMug - 太棒了。很高兴我的问题可能会改进一些软件:)