SheetFollowHyperlink事件的事件顺序

我有一本工作手册,列出过去几周人们的姓名和总体performance。 我被要求这样做,当他们的名字被点击时,这个人的细节会显示。 我当时提出的解决scheme是将所有超链接指向提醒他们打开macros的表单。

WorkSheet_Activate事件中,我将它们redirect到另一个工作表,其中填入了所选人员的详细信息。 这工作正常。 如果用户没有打开他们的macros,他们会得到一个友好的提醒,但如果他们这样做,他们立即被redirect。 只有一个问题。 由于超链接首先将它们带到其他地方,导致臭名昭着的“屏幕闪烁”。

在研究中,我发现了FollowHyperlink Events(尽pipe如此,我认为工作簿级事件最适合我的目的)。 但是,在我开始重build之前,我想确保这将解决“屏幕闪烁”问题。

在MSDN上,它指出当用户单击超链接时发生该事件。 虽然我似乎无法find任何直接说明此事件是在用户被引导到另一张表之前还是之后触发的任何地方。 如果之后立刻被触发,那对我来说真的不会有什么帮助,但是如果之前触发了,我可以在事件中放一个Application.ScreenUpdates = False ,这样可以解决我的问题。

TL; DR(已经到了这个地步): Workbook_SheetFollowHyperlink事件发生在用户指向超链接指向的地方之前还是之后?

要回答你的问题,在超链接之后触发事件。 您可以使用下面的代码演示这个:

 Private Sub Workbook_SheetFollowHyperlink(ByVal Sh As Object, ByVal Target As Hyperlink) Debug.Print "Workbook level: " & ActiveSheet.Name End Sub 

事件触发时, ActiveSheet是由超链接指向的表单。

我不确定直接解决问题的方法,即使单击超链接时也不会引发Click()事件。 但是, Worksheet级超链接事件处理程序将在Workbook级别处理程序之前调用,这可能会加快程序的速度,以至于看不到闪烁。

如果将Workbook级别事件保持原样,并将以下代码添加到包含超级链接的Worksheet中,则可以certificate这一点:

 Private Sub Worksheet_FollowHyperlink(ByVal Target As Hyperlink) Debug.Print "Worksheet level: " & ActiveSheet.Name Sleep 1000 Debug.Print "Leaving worksheet level event" End Sub 

经过几次实验(见下文),我得出结论:

  1. 允许用户在禁用macros时使用超链接列。
  2. 当启用macros时,隐藏当前的超链接列,并显示另一列,给用户一个不同的“超链接”,直接把它们带到你想要的地方。
  3. 第二个超链接可以很容易地被“模拟”,以便它拿起其他列超链接。 (见下文)

我希望他的帮助

有趣的是,我尝试了一些东西

 Private Sub Worksheet_SelectionChange(ByVal Target As Range) ' This does not fire if the user clicks directly on the hyperlink text ' it only fires if when click on the cell space that is not text With ActiveCell If Hyperlinks.Count Then MsgBox "hi" & .Hyperlinks(1).Range .Hyperlinks(1).Follow End If End With End Sub 

但是,您可以使单元格中的文本看起来像超链接,但实际上只是蓝色下划线的文本。 然后,您可以使用Worksheet_SelectionChange转到相关的单元格。

那么问题就成为如何存储相关的单元格。

您要存储它,以便在目标工作表上插入行和列时,引用将进行调整。 (例如不在注释中,或者对命名范围的描述等)。

根据您拥有多less数据,您可以select多种方式。

我想我会赞成这个:

在显示的单元格旁边有一个隐藏的列,它具有超链接。 显示的单元格有一个公式,设置为从隐藏列中获取值(我非常喜欢这个声音,因为您已经有了超链接列 – 所以只需修改上面的代码即可从列旁边的超链接点击的单元格可能使用偏移量)

 Private Sub Worksheet_SelectionChange(ByVal Target As Range) ' This does not fire if the user clicks directly on the hyperlink text With ActiveCell.offset(0,1) If Hyperlinks.Count Then .Hyperlinks(1).Follow End If End With End Sub 

你可能会混淆命名的范围,但这将是一个痛苦。

我刚刚意识到,我所尝试的将不会有什么帮助,因为当macros未启用时,您需要超链接才能工作!

所以为了使上面的工作,你可以改变用户启用macros时显示的列。 即当macros被禁用时(和左侧的列不被显示),超链接列就会显示出来。 启用macros后,隐藏超链接列,并显示左边的那个,这将导致SelectionChange事件运行。

(你需要小心如何使用其他超链接,因为任何有超链接的单元格都会响应这个事件,你可能需要使用十字路口来检查单击的单元格是否在一个包含“所有需要响应的单元格给用户点击他们的方式“。

所有上述听起来有点疯狂,但它会出现事件模型不利于停止屏幕闪烁。

我希望有一个更好的方式来做你想做的事情,但是为了什么是值得的,上面的事情可能会有所帮助。

哈维