如何使 XLAM UDF 调用可移植?

Posted

技术标签:

【中文标题】如何使 XLAM UDF 调用可移植?【英文标题】:How to make an XLAM UDF call portable? 【发布时间】:2011-10-14 20:34:52 【问题描述】:

似乎当我在 XLAM 文件中调用 UDF 时,XLAM 文件的路径嵌入在电子表格中。当我从另一台机器(安装了相同的 XLAM 插件,只是安装到不同的路径)打开电子表格时,Excel 会抱怨“此工作簿包含指向其他数据源的链接......”这似乎不是XLL 中的 UDF 存在问题。有没有办法解决这个问题?

【问题讨论】:

【参考方案1】:

此行为是在 Excel 中实现 Addin UDF 方式的结果。

有 3 种方法可以缓解该问题:

使用强制特定路径的安装程序

向 XLAM 添加一些代码,检查每个打开的工作簿的链接,如果链接指向您的 XLAM 但在不同的路径中,它会进行查找和替换,以便更正路径。

将您的 XLAM UDF 转换为 XLL(如果 VBA 转换为 VB.Net 并使用 Excel DNA 或 Addin Express 来制作 VB.Net XLL)

【讨论】:

您是否碰巧有选项 2 的模板代码“向 XLAM 添加一些代码,检查每个打开的工作簿的链接,如果链接是到您的 XLAM 但在不同的路径中,它会查找并并替换,以便更正路径。”? 我没有代码(我使用选项 1),但您需要使用应用程序级事件来捕获 workbook.open,然后使用 Workbook.Linksources 方法获取列表链接,然后在所有工作表上循环进行查找和替换。缺点是用户仍然会收到有关链接的消息 - 你不能禁止它,因为可能还有其他链接 @SFun28:这可能是您正在寻找的模板代码。 jkp-ads.com/Articles/FixLinks2UDF00.asp【参考方案2】:

我知道我迟到了十年,但如果你把它放在 Workbooks 中。打开你正在共享的文件上的代码,它们将需要是 xlsm 文件,请记住,这会将公式中的所有外部链接更改为本地插件路径:

Sub AddInExternalLinkFix()
    Var = ActiveWorkbook.LinkSources(xlExcelLinks)
    Nwname = Application.AddIns.Item("YourAddInName").FullName
    If Not IsEmpty(Var) Then
        For iCounter = 1 To UBound(Var)
                ActiveWorkbook.ChangeLink Name:=Var(iCounter), newname:=Nwname, Type:=xlLinkTypeExcelLinks
        Next iCounter
    End If
End Sub

【讨论】:

以上是关于如何使 XLAM UDF 调用可移植?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Codeigniter 中使视图“可移植”?

如何使 thunk 独立于状态形状以使其可移植?

使我的 SSIS 包可移植 - 如何做到这一点?

无法使可执行文件可移植

使用 Visual Studio 项目使 Opencv 可移植并消除链接错误

使用 wmemset() 的代码的可移植性如何?