向VBA Excel中动态创建的标签添加超链接
我在Userform上动态创建了多个标签。我想向已创建的标签添加超链接,是否有办法向这些标签添加超链接。下面是我如何动态创建标签的代码向VBA Excel中动态创建的标签添加超链接,excel,vba,hyperlink,Excel,Vba,Hyperlink,我在Userform上动态创建了多个标签。我想向已创建的标签添加超链接,是否有办法向这些标签添加超链接。下面是我如何动态创建标签的代码 Private Sub cmdViewReports_Click() Dim row_num As Long Dim fso As Object Dim src_path As String Dim dest_path As String Dim sub_folder As String Dim theLabel
Private Sub cmdViewReports_Click()
Dim row_num As Long
Dim fso As Object
Dim src_path As String
Dim dest_path As String
Dim sub_folder As String
Dim theLabel1 As msforms.Label
Dim inc As Integer
Dim my_files As Object
Dim my_folder As Object
Dim i As Integer
Dim ctrl As Control
'Check if the record is selected in listbox
If Selected_List = 0 Then
MsgBox "No record is selected.", vbOKOnly + vbInformation, "Upload Results"
Exit Sub
End If
'Folder Name to be created as per the 3rd column value in the list
sub_folder = Me.lstDb.List(Me.lstDb.ListIndex, 3)
sub_folder = Replace(sub_folder, "/", "_")
dest_path = "C:\abc\xyz\Desktop\FV\" & sub_folder & "\"
Set fso = CreateObject("scripting.filesystemobject")
If Not fso.FolderExists(dest_path) Then
MsgBox "No reports are loaded"
Exit Sub
End If
Set my_folder = fso.GetFolder(dest_path)
Set my_files = my_folder.Files
i = 1
For Each oFiles In my_files
Set theLabel1 = Me.Frame1.Controls.Add("Forms.Label.1", "File_name" & i, True)
With theLabel1
.Caption = oFiles.Name
.Left = 1038
.Width = 60
.Height = 12
.Top = 324 + inc
.TextAlign = 1
.BackColor = &HC0FFFF
.BackStyle = 0
.BorderStyle = 1
.BorderStyle = 0
'.Locked = True
.ForeColor = &H8000000D
.Font.Size = 9
.Font.Underline = True
.Visible = True
End With
inc = inc + 12
i = i + 1
Next
End Sub
下面是表单部分的外观
简要介绍一下我的用例:我有一些文件/报告(pdf、word等)需要附加到记录中。用户可以将其报告附加到记录中,也可以查看已附加的报告。因此,通过上面的代码,我能够生成文件夹中文件的标签;现在,当文件名显示在表单上时,我需要一个功能,即单击要打开该报告的报告(标签)
提前感谢 我建议您对每个标签使用以下代码:
Private Sub Label1_Click()
ActiveWorkbook.FollowHyperlink Label1.Caption
End Sub
- --->您需要的功能是
活动工作簿中的
FollowHyperlink
[版本:只是将答案格式化得更好]您只需稍加修改即可使用其中的大部分代码。您需要修改MyControl类以使用标签而不是CommandButtons。您还需要修改事件以传递文件名 一旦这些修改完成,您的代码也基本相同。以下是您的原始代码,经过简化和修改以说明此概念: UserForm
Option Explicit
Private WithEvents MyNotifier As Notifier
Private MyControls As Collection
Private Sub UserForm_Initialize()
Set MyNotifier = GetNotifier()
Set MyControls = New Collection
End Sub
Private Sub CommandButton1_Click()
Dim i As Integer
Dim inc As Integer
Dim theLabel1 As MSForms.Label
Dim mc As MyControl
inc = 0
For i = 1 To 2
Set theLabel1 = Me.Frame1.Controls.Add("Forms.Label.1", "File_name" & i, True)
With theLabel1
.Caption = "filename" & i
.Left = 100
.Width = 60
.Height = 12
.Top = 20 + inc
.TextAlign = 1
.BackColor = &HC0FFFF
.BackStyle = 0
.BorderStyle = 1
.BorderStyle = 0
'.Locked = True
.ForeColor = &H8000000D
.Font.Size = 9
.Font.Underline = True
.Visible = True
End With
Set mc = New MyControl
mc.Add theLabel1
MyControls.Add mc
inc = inc + 12
Next
End Sub
Private Sub MyNotifier_Click(ByVal Filename As String)
MsgBox Filename
End Sub
以下是修改后的支持文件,以供快速参考:
模块
Option Explicit
Private m_Notifier As Notifier
Public Function GetNotifier() As Notifier
If m_Notifier Is Nothing Then Set m_Notifier = New Notifier
Set GetNotifier = m_Notifier
End Function
通知程序类
Option Explicit
Public Event Click(ByVal Filename As String)
Public Function Click(ByVal Filename As String)
RaiseEvent Click(Filename)
End Function
Option Explicit
Private MyNotifier As Notifier
Private WithEvents MyLabel As MSForms.Label
Public Sub Add(ByVal c As MSForms.Label)
Set MyNotifier = GetNotifier()
Set MyLabel = c
End Sub
Private Sub MyLabel_Click()
MyNotifier.Click MyLabel.Caption
End Sub
MyControl类
Option Explicit
Public Event Click(ByVal Filename As String)
Public Function Click(ByVal Filename As String)
RaiseEvent Click(Filename)
End Function
Option Explicit
Private MyNotifier As Notifier
Private WithEvents MyLabel As MSForms.Label
Public Sub Add(ByVal c As MSForms.Label)
Set MyNotifier = GetNotifier()
Set MyLabel = c
End Sub
Private Sub MyLabel_Click()
MyNotifier.Click MyLabel.Caption
End Sub
我知道这个功能,但这不是我需要创建超链接的方式。由于我已经动态创建了标签,我不确定单击事件会发生在哪里。您仍然可以这样设置
标签\u click
,但请确保用户分配给标题的超链接是有效的超链接。@Tsirinianarakotoninina因为在运行时之前控件的数量是未知的,如何实现这一点?看看你的主要问题,你可以在函数中使用Dir(Labelxxx.Caption)
,只要结果不同于vbNullString
,那么文件就存在了。因此Dir
函数应该在赋值时测试每个Labelxxx.Caption
。然后,您可以在单击每个标签时使用FollowHyperlink
函数。请参见:它使用类,但我认为如果您想坚持使用动态创建的控件,这是唯一的方法。你有没有想过使用“静态”控件并隐藏/不隐藏它们?我最近回答了一个类似的问题,涵盖了这种情况。这应该会有帮助。@BrianMStafford说实话,对我来说理解代码有点困难。如果您能帮助我构建代码,这将意味着很多:)好的,下面是我所做的创建类模块clsMyEvents。添加了以下行“Option Explicit Public With Events File_name As MSForms。标记私有子文件_name_Click(ByVal链接为字符串)ActiveWorkbook.FollowHyperlink Address:=链接,NewWindow:=True End Sub”,就在代码中的结尾处(主要问题)我把这个Dim lblEvent作为clsMyEvents Set lblEvent=New clsMyEvents Set lblEvent.File\u name=theLabel1 MyEvents.Add lblEvent Next End Sub`我想把链接传递到clsMyEvents,怎么做?好了,下面是我创建类模块clsMyEvents的步骤。添加了以下行选项Explicit Public With events File_name As MSForms。标记私有子文件\u name_Click(ByVal链接为String)ActiveWorkbook.FollowHyperlink Address:=link,NewWindow:=True End Sub
就在代码中的结尾之后(主要问题)我有一个'Dim lblEvent As clsMyEvents Set lblEvent=New clsMyEvents Set lblEvent.File\u name=theLabel1 MyEvents.Add lblEvent Next End Sub'我想把链接传递到clsMyEvents,怎么做?这对搭档有什么事吗?你真是个天才。工作非常好,但这里唯一的事情是当我单击文件时,我在msgbox中看到文件名,我需要的是如果我单击文件,它应该在该位置打开文件,例如“C:\abc\xyz\Desktop\FV\”&sub\u folder&“\”&filename
。为了做到这一点,我需要使用ActiveWorkbook.FollowHyperlink地址:=**link**
。使用所需的逻辑替换MsgBox,在本例中,使用FollowHyperlink,将文件名添加到位置。