【问题标题】:In Excel, can I use a hyperlink to run vba macro?在 Excel 中,我可以使用超链接来运行 vba 宏吗?
【发布时间】:2015-04-28 00:17:48
【问题描述】:

我有一个包含多行数据的电子表格。我希望能够单击将使用该行中的数据运行宏的单元格。由于行数总是在变化,我认为每行的超链接可能是最好的方法。

   ROW MeterID   Lat    Long   ReadX  ReadY  ReadZ   CoeffA  CoeffB  CoeffC
   2   10f62gs   34.1   33.3   102.2  231.3  382.2   4.34    22.1    0.002
   3   83gs72g   34.4   31.4   109.2  213.1  372.1   2.23    12.7    0.023
   4   43gS128   33.3   32.2   118.8  138.7  241.8   1.94    5.08    0.107

有没有办法通过单击超链接并能够知道单击超链接的单元格的行来运行 vba 宏?

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    这对你有用

    Private Sub Worksheet_FollowHyperlink(ByVal Target As Hyperlink)
            MsgBox "Row " & ActiveCell.Row & " is clicked"
    End Sub
    

    【讨论】:

      【解决方案2】:

      运行宏的超链接更有趣的方式,看起来是下一个方法(超链接公式)。它不需要任何事件:

      1. 在单元格中编写超链接公式。这也可以在 VBA 中完成:
          Sub testCreateHyperlinkFunction()
             'Very important to have # in front of the function name!
             Range("A1:A5").Formula = "=HYPERLINK(""#MyFunctionkClick()"", ""Run a function..."")"
          End Sub
      

      下一个方法将是一个更引人注目的用途,能够保持已处理范围的初始单元格值(例如“A1:A5”):

      Sub testCreateHyperlinkFunctionBis()
        Dim rng As Range, arr As Variant, c As Range, i As Long
         Set rng = Range("A1:A5")
         arr = rng.Value
         For i = 1 To UBound(arr, 1)
           Range("A" & i).Formula = "=HYPERLINK(""#MyFunctionkClick()"", " & _
                  IIf(IsNumeric(arr(i, 1)), arr(i, 1), """" & arr(i, 1) & """") & ")"
         Next i
      End Sub
      
      1. 创建要调用的函数(在模块中):
          Function MyFunctionkClick()
            Set MyFunctionkClick = Selection 'This is required for the link to work properly
            MsgBox "The clicked cell addres is " & Selection.row
          End Function
      

      请注意确实需要 Set MyFunctionkClick = Selection 行。该函数需要以某种方式知道代码所指的单元格。如果缺少此功能,则会调用该函数两次,并且您会收到“引用无效”错误。

      1. 单击单元格,函数MyFunctionkClick() 运行...

      【讨论】:

      • 有趣的东西,我不知道可以在超链接语法中使用#Function() 调用函数!虽然我只是尝试了一个非常简单的应用程序并且该函数被调用了两次,然后我收到一条消息说“引用无效” - 很奇怪,我会调查
      • @jamheadart:我都没有,直到我发现它(我不记得何时何地......)。我的收藏或有趣的东西中有一些这样的代码。没有人知道一切......在我看来,重要的是学习并能够欣赏它真正有趣并且可能有用的东西:) 关于您的问题,这是您的功能中的错误。它的弱点是它不允许逐步调试。当错误存在时,它不会引发错误。它以这种方式工作两次并发出半 elocvent 消息。 代码不会因错误而停止!编码非常小心
      • @jamheadart:你错过了函数的核心... :) Set MyUDF = Selection
      • 大声笑,我什至没有意识到那条线在那里或它在做什么。现在工作正常,太棒了。谢谢!
      • @ jamheadart:也许编辑我的答案并强调这一点会很好......我认为它会自我理解。是不是...
      【解决方案3】:

      是的,您可以,按照以下简单步骤操作:

      1. 选择要在其中创建超链接的单元格
      2. 右击->超链接……
      3. 输入创建超链接的同一单元格的地址,然后为链接命名。见下图:

      将宏分配给超链接

      1. 点击确定。
      2. 超链接已创建。

      注意:单击此超链接不会执行任何操作,因为它已分配给相同的单元格地址。

      1. 现在按 Alt + F11
      2. 复制粘贴以下代码

      通过单击超链接运行 Excel 宏

      Private Sub Worksheet_FollowHyperlink(ByVal Target As Hyperlink)  
          'Check if the Target Address is same as you have given  
          'In the above example i have taken A4 Cell, so I am  
          'Comparing this with $A$4  
        
          If Target.Range.Address = "$A$4" Then  
              'Write your all VBA Code, which you want to execute  
              'Or Call the function or Macro which you have  
              'written or recorded.  
              MsgBox "Write your Code here to be executed"  
              Exit Sub  
          End If  
      End Sub  
      

      在上面的代码中,我们正在比较单元地址,然后执行一组代码或函数。还有另一种方法可以做到这一点。我们可以与目标名称进行比较并执行代码。在上面的示例中,我将超链接目标的名称指定为 MyMacro。

      Private Sub Worksheet_FollowHyperlink(ByVal Target As Hyperlink)  
          'Check if the Target Name is same as you have given  
          'In the above example i have given the Name of the HyperLink  
          'is MyMacro.  
        
          If Target.Name = "mymacro" Then  
              'Write your all VBA Code, which you want to execute  
              'Or Call the function or Macro which you have  
              'written or recorded.  
              MsgBox "Write your Code here to be executed"  
              Exit Sub  
          End If  
      End Sub  
      

      【讨论】:

        【解决方案4】:

        我只想添加另一种方法,灵感来自这里的一个答案,这是我过去使用过的。这意味着您不必创建超链接或帮助列来开始处理该行,您只需双击您要处理的行中的任何单元格:

        在你想要双击工作的工作表上使用这个:

        Private Sub Worksheet_Activate()
        Application.OnDoubleClick = "Module1.ProcessRow"
        End Sub
        
        Private Sub Worksheet_Deactivate()
        Application.OnDoubleClick = ""
        End Sub
        

        然后在Module1 中有一个处理活动单元格的例程:

        Sub processRow()
        MsgBox "Row " & ActiveCell.Row & " on " & ActiveSheet.Name & " was clicked"
        End Sub
        

        您还应该在工作簿事件中禁用 Excel 双击方法:

        Private Sub Workbook_BeforeClose(Cancel As Boolean)
        Application.OnDoubleClick = ""
        End Sub
        

        我发现双击方法对于很多过程来说非常非常方便和直观,例如使用从行中填充的数据调出一个用户窗体,或者将该数据传输到另一个工作表,可能带有计算或格式等。

        【讨论】:

          【解决方案5】:

          我认为与其费力地为每个单元格创建超链接,不如创建一个引用Activecell 属性的宏。接下来,为要运行的宏创建键盘快捷键。这样做:

          1. 按 ALT+F8
          2. 选择Options
          3. 选择一个键作为快捷键

          如果您已经有超链接,最好使用Hyperlink_Follow 事件触发宏。如果没有,请考虑我的建议。

          【讨论】:

          • 注意:Hyperlink_Follow 在打开超链接后触发
          【解决方案6】:

          刚刚使用 =HYPERLINK() 方法,发现此代码可以在 Excel 单元格中创建超链接:

          Sub testCreateHyperlinkFunction()
              Dim r As Range
              Set r = Range("A1")
              ' use SubAddress arg of Hyperlinks.Add method to link our function
              r.Hyperlinks.Add _
                  Anchor:=r, _
                  Address:=vbNullString, _
                  SubAddress:="MyFunctionkClick()", _
                  TextToDisplay:="Hyperlink text" 
          
              ' note: TextToDisplay arg is desirable here, 
              ' otherwise Excel will insert MyFunctionkClick() here
          
          End Sub
          
          Function MyFunctionkClick()
            Set MyFunctionkClick = Selection ' required!
            MsgBox "The clicked cell addres is " & Selection.row
          End Function
          

          优点:

          • Range.Hyperlinks(1).Follow 作品;
          • 防止用户不必要的链接更改;
          • 与文档中的其他链接统一“查看和填充”;

          缺点:

          • 调试 MyFunctionkClick() 仍然不可用;
          • 无法从 Excel GUI 更改超链接 - 只能从代码中更改;

          【讨论】:

            【解决方案7】:

            尝试使用由超链接调用的 VBA 宏。
            它的任务是在包含 =HYPERLINK 的行下方插入一行。
            VBA 似乎忽略了 .Insert

            Function HyperlinkFnc_AddRow()
              Set HyperlinkFnc_AddRow = Selection
              MsgBox "Next line of code: Adding a row below selected row " & Selection.Row
              Rows(Selection.Row + 1).Insert Shift:=xlShiftDown, CopyOrigin:=xlFormatFromLeftOrAbove
            End Function
            
            Sub Button_AddRow()
              ActiveSheet.Shapes(Application.Caller).TopLeftCell.Select
              HyperlinkFnc_AddRow
            End Sub
            

            观察
            当超链接函数调用 HyperlinkFnc_AddRow() 时
            (例如 =HYPERLINK("#HyperlinkFnc_AddRow()";"Invoking Function ""HyperlinkFnc_AddRow()"" 通过此超链接应在下面添加行"):

            1. “MsgBox”获得控制权。
            2. 以下带有“.Insert”的行被忽略(未插入一行)。

            通过按钮调用 Sub Button_AddRow() 显示,函数“HyperlinkFnc_AddRow”中的代码按预期工作(插入一行)。
            解决这个问题会很有帮助。

            【讨论】:

            • ActiveSheet.Shapes(Application.Caller).TopLeftCell.Select 确定按钮所在的单元格并选择它。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2013-07-01
            • 2016-08-03
            • 1970-01-01
            • 1970-01-01
            • 2020-12-15
            • 2021-07-25
            • 1970-01-01
            相关资源
            最近更新 更多