通过超链接公式调用另一个 XLAM 中的函数 - Excel VBA

Posted

技术标签:

【中文标题】通过超链接公式调用另一个 XLAM 中的函数 - Excel VBA【英文标题】:Call Function in another XLAM via Hyperlink Formula - Excel VBA 【发布时间】:2021-12-03 23:56:30 【问题描述】:

我正在尝试使用 this answer,但将其设置在另一个 xlam 工作簿中的函数位置。

例子:

这适用于远程工作簿:

Sub Test()
  FuncName = "#MyFunctionkClick()"
  MyVal = "TestVal"
  Range("A1").Value = MyVal
  Range("A1").Formula = "=HYPERLINK(""" & FuncName & """, """ & Range("A1").Value & """)"
End Sub
Sub TestTwo()
 Application.Run ("'remotewb.xlam'!MyFunctionkClick")
End Sub
Function MyFunctionkClick()
 Set MyFunctionkClick = Selection 'This is required for the link to work properly
 MsgBox "The clicked cell addres is " & Selection.Row
End Function

但我没有运气尝试过:

Sub Test()
'Application.Run ("'Master Calc with Macro.xlsm'!SummarizeMaster")
'Application.Run ("'remotewb.xlam'!testremote")
'Application.Run ("'remotewb.xlam'!#MyFunctionkClick()")
'Application.Run ("'remotewb.xlam'!MyFunctionkClick") ' When calling from Remote WB it errored if I used ()
 'Range("A1:A5").Formula = "=HYPERLINK(""#MyFunctionkClick()"", ""Run a function..."")"
 ' Range("A1:A5").Formula = "=HYPERLINK(""#MyFunctionkClick()"", ""Run a function..."")"
 Range("A1:A5").Formula = "=HYPERLINK(""[remotewb.xlam]!MyFunctionkClick"", ""Run a function..."")"
 'Range("A1").Formula = "=HYPERLINK(""Application.Run (" 'remotewb.xlam'!MyFunctionkClick")"", ""Run a function..."")"
End Sub

【问题讨论】:

可以从另一个工作簿调用函数,但不能直接。我将尝试想象一个(相关的)场景并发布答案。我将尝试从“Personal.xlsb”调用一个函数,但它可以替换为包含该函数的任何工作簿。 【参考方案1】:

请尝试下一个场景:

    在另一个工作簿中创建一个函数。出于测试原因,最好将其放在“Personal.xlsb”中,因为我正在尝试:
Function GiveMeFive(x As Long, y As Long) As Long
    Debug.Print "In Personal.xlsb code: " & x + y 'not important, ONLY TO SEE IT WORKING with parameters in Immediate Window
    GiveMeFive = 5 'it can be calculated, but look to the function name :)
End Function
    在活动工作表中创建(必要的)超链接(可以在任何工作表中创建):
Sub TestCalFunctionHyp()
  Dim FuncName As String, myVal As String
  FuncName = "#MyFunctionHyp()"
  myVal = "Call external Function (parameters):4|3" 'just to see how to call it with parameters
  Range("A1").Value = myVal
  Range("A1").Formula = "=HYPERLINK(""" & FuncName & """, """ & Range("A1").Value & """)"
End Sub
    (直接)调用(通过超链接)函数的外观:
Function MyFunctionHyp()
Dim arr
 Set MyFunctionHyp = Selection
 arr = Split(Split(Selection.Value, ":")(1), "|")
 TestTwo CLng(arr(0)), CLng(arr(1)) 'calling the sub calling the one in the other wb
End Function
    调用其他工作簿中函数的子应如下所示:
Sub TestTwo(arg1 As Long, arg2 As Long)
 Dim x As Long
 x = Run("'C:\Users\YourUser\AppData\Roaming\Microsoft\Excel\XLSTART\PERSONAL.XLSB'!GiveMeFive", arg1, arg2)
   Debug.Print "Received from called function: " & x
End Sub

该函数使用其完整路径调用该函数,只是因为,如果保存该函数的工作簿未打开,它将打开它...

请注意调整路径以便使用您的真实YourUser...

我想在测试后收到一些反馈。如果有不清楚的地方,请随时要求澄清。

【讨论】:

我不能将宏代码存储在活动工作簿中,我的宏都存储在外部,需要能够在任何打开的工作簿上运行。 我认为它不可能 w 超链接公式,但现在我做了超链接,w 引用活动单元格,然后使用跟随超链接捕捉事件,这样应该可以工作 @FreeSoftwareServers 恐怕我抓不到你。 “这适用于远程工作簿”是什么意思? “远程工作簿”不是活动的吗?如果是这样,它不是 xlsm 类型吗?如果是这样,您/我可以以编程方式编写两段必要的代码(函数和子代码)。我无法从你的问题中理解你想要什么。很明显,用超链接公式直接调用另一个工作簿中的函数是不可能的。 #ThisWorkbook 的简写。在我的情况下,xlam 是存储函数的位置,它永远不是ActiveWorkbook,而只是一个包含宏的 excel 文件。你的解释基本上是让函数调用另一个工作簿中的函数,这意味着我必须将函数存储在ActiveWorkbook,但我永远无法控制ActiveWorkbook @FreeSoftwareServers 恐怕,我仍然无法得到你...你可以控制 ActiveWorkbook 运行 VBA 代码。它看起来完全相反:您尝试从另一个工作簿(活动的工作簿)控制加载项,运行其功能之一。我不明白为什么有这种必要性,因为与添加交互的正常方式是使其在功能区上暴露一些特定按钮,或者在特定拦截工作簿事件的情况下运行。我认为这是一种查看是否可行的奇特方法,我为这种情况提供了解决方案。

以上是关于通过超链接公式调用另一个 XLAM 中的函数 - Excel VBA的主要内容,如果未能解决你的问题,请参考以下文章

调用存储在 .xlam 文件中的 UDF 的 Evaluate() 函数并使其作用于另一张纸

如何使 XLAM UDF 调用可移植?

如何使用公式在单元格文本中间创建超链接?

C++工程中如何在一个文件中调用另一个文件中的变量

如何在一个HTML文件中调用另一个HTML的内容

根据另一列值禁用jqgrid中的超链接