单击 Excel 中的超链接会在运行宏之前清除范围选择

Posted

技术标签:

【中文标题】单击 Excel 中的超链接会在运行宏之前清除范围选择【英文标题】:Clicking a Hyperlink in Excel Clears a Range Selection Before Running Macro 【发布时间】:2021-04-07 17:04:24 【问题描述】:

我正在从已放置在工作表单元格中的超链接运行宏。该宏要求用户从下表中选择一些单元格,然后将其转移到工作表上的另一个位置。问题是单击超链接会清除用户的选择,而是选择超链接的单元格。

我想做的事:让用户选择单元格,点击超链接,并能够通过宏引用选择范围。

备选方案 1:我之前实现过,但不得不将其删除:创建一个链接到宏的形状,因此用户在单击形状时不会清除选择...

这样做的问题是工作表是自动生成的并且非常复杂。当用户操作位于形状上方的行和表格时,我无法保持形状在工作表中的位置。因此,该形状要么变形,要么失去其位置并进入外太空(或出现在其他桌子的中间)。即使像这样固定形状位置也会发生这种情况:

Set sh = ws.Shapes.AddShape(msoShapeRoundedRectangle, l, t, w, h) 'Non-KtCpl
With sh
  sh.ShapeStyle = msoShapeStylePreset40
  sh.OnAction = "'macroName """ & ws.name & """, ""shapeName""'"
  sh.Placement = 1
End With

位置没有得到维持。

备选方案2:用户使用多选输入点击超链接后选择范围,即:

Application.InputBox("Please select the range from the sheet", Title:="Select Range", Type:=8)

备选方案 2 可行,但我真的很想知道我最初的问题是否可行。

谢谢!

【问题讨论】:

【参考方案1】:

我真的很想知道我最初的问题是否可行。

逻辑

    将先前的选择存储在范围对象中。 当用户点击超链接时,检查之前的选择和当前的选择,看看是否不一样,然后运行宏。

代码

这是你正在尝试的吗?我假设超链接在A1 中。根据需要进行更改。

Option Explicit

Dim rng As Range

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Intersect(Target, Range("A1")) Is Nothing Then Set rng = Target
End Sub

Private Sub Worksheet_FollowHyperlink(ByVal Target As Hyperlink)
    If rng Is Nothing Then
        MsgBox "Select relevant cells"
        Exit Sub
    End If
    
    If Not Intersect(Target.Range, Range("A1")) Is Nothing Then
        MsgBox "The range selected is " & rng.Address '<~~ Do what you want here
    End If
End Sub

行动中

【讨论】:

非常感谢您的回复!虽然我担心它会为工作表内发生的许多自动工作表更改产生大量开销,但可能会导致工作表溢出或显着减慢。你有什么想法? 嗯,我想了解我上面建议的代码将如何创建“大量自动工作表更改的开销”? 我的印象是每次工作表更改时,都会触发此宏。但实际上,您使用的是用户控制的 Worksheet_SelectionChange。 VBA 代码的其余部分仅操作对象。因此,仅当用户在工作表上单击时才会触发 - 并且有一个进一步的控件来确保他们的选择保留在 ListObject 中。它非常优雅,如果自动化代码进行 1000 次工作表操作,则不会导致 1000 次操作。

以上是关于单击 Excel 中的超链接会在运行宏之前清除范围选择的主要内容,如果未能解决你的问题,请参考以下文章

excel里的超链接需要先双击 然后才能单击打开

将 Excel 范围内的超链接传输到 Outlook 电子邮件

运行宏excel后清除“撤消”历史按钮

无法单击 QTextDocument [qt] 编辑的 QTextBrowser 中的超链接

VBA excel中批量创建超链接代码(连接当前文档中的sheet)

在一个excel文件里头有1600个PDF的超链接,如何批量下载?