Excel VBA:处理超链接单击的子程序或函数

Excel VBA:处理超链接单击的子程序或函数,excel,vba,Excel,Vba,有相当多的信息可以找到,但我一直无法让它为我自己工作 我需要做的是有一个全局子程序,捕捉整个文档的超链接点击,而不仅仅是活动工作表。为什么?因为我的工作簿将在多个工作表中包含多个链接,除了位置(以及相邻单元格的内容等)之外,这些链接都是“相同”的 这很容易用按钮实现——只需将所有按钮连接到同一个宏即可——但我在使用链接时遇到了同样的问题 这适用于一个特定的工作表: 在Microsoft Excel对象->相关工作表中: Private Sub Worksheet_FollowHyperlink(

有相当多的信息可以找到,但我一直无法让它为我自己工作

我需要做的是有一个全局子程序,捕捉整个文档的超链接点击,而不仅仅是活动工作表。为什么?因为我的工作簿将在多个工作表中包含多个链接,除了位置(以及相邻单元格的内容等)之外,这些链接都是“相同”的

这很容易用按钮实现——只需将所有按钮连接到同一个宏即可——但我在使用链接时遇到了同样的问题

这适用于一个特定的工作表:

在Microsoft Excel对象->相关工作表中:

Private Sub Worksheet_FollowHyperlink(ByVal Target As Hyperlink)
    MsgBox "Link i Arket! " & Target.Range.Address
End Sub
当我单击相关工作表上的链接时,该工作表的VBA子例程将捕捉该单击并对其进行处理

我认为下面的代码“应该”适用于整个文档。也就是说,从工作簿中的任何图纸捕捉超链接单击。它不会(即,不会发生任何事情):

在Excel中,悬停时的链接显示:

file://path/to/workbook.xlsm - click once to follow blablabla

这里缺少什么?

通过使用WithEvents工作表对象创建一个类并将这些类存储在公共集合中,您可以对所有工作表重复使用相同的代码

模块1

Public objCollection As Collection

'Call on Workbook_Open
Sub CreateClasses()
Dim ws As Worksheet
Dim HyperlinksClass As cHyperlinks

    'Create A New Instance Of The Collection
    Set objCollection = New Collection
    'Loop All Worksheets
    For Each ws In Worksheets
        'Create A New Class For This Worksheet
        Set HyperlinksClass = New cHyperlinks
        'Add The Worksheet To The Class
        Set HyperlinksClass.obj = ws
        'Add The Class To The Collection
        objCollection.Add HyperlinksClass
    Next ws

End Sub
创建一个名为cHyperlinks的类

Private WithEvents pWS As Worksheet

Private Sub pWS_FollowHyperlink(ByVal Target As Hyperlink)

    'Code to handle hyperlinks here

End Sub

Property Set obj(ByVal objWS As Worksheet)

    Set pWS = objWS

End Property

对不起,我不知道,但我还没有在VBA中创建任何类。第一段代码,模块1,我可以插入模块1,我接受它。然后我是否创建一个新的类模块并插入第二位代码?我已经创建了一个名为“cHyperlinks”的新类模块(如示例所示),但是在其中插入第二位代码似乎没有任何作用。(当然,我已经添加了一些代码来处理超链接)。嗨,是的,没错。但是记住打开工作簿上的CreateClasses
Private WithEvents pWS As Worksheet

Private Sub pWS_FollowHyperlink(ByVal Target As Hyperlink)

    'Code to handle hyperlinks here

End Sub

Property Set obj(ByVal objWS As Worksheet)

    Set pWS = objWS

End Property