通过超链接公式调用另一个 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的主要内容,如果未能解决你的问题,请参考以下文章