从 Excel 公式中的 UDF 中删除 AddIn 路径
Posted
技术标签:
【中文标题】从 Excel 公式中的 UDF 中删除 AddIn 路径【英文标题】:Remove AddIn path from UDF in Excel formula 【发布时间】:2011-06-20 16:54:38 【问题描述】:我的插件是xla,现在我用excelDNA,所以它变成了xll, 当我打开在以前版本的我的插件中构建的电子表格时, 对于 UDF,它显示带有 xla 路径的 myUDF。例如 "C:\Program Files\Installation folder\MyUDFs.xla!MyUDF", 当我单击编辑链接并将源更改为“C:...\MyUDFs.xll”时 我有一个弹出窗口说 “Excel 无法更新此工作簿中的一个或多个链接。要更新链接,请打开所有链接源文件(单击“数据”选项卡上的“编辑链接”)。 确保所有计算均已更新。按 F9" 我点击 OK,然后 MyUDF 的路径从 xla 变为 xll,例如C:\Program Files\Installation 文件夹\MyUDFs.xll!MyUDF 对于客户来说,这将破坏他们在以前版本中构建的所有电子表格(可能是 100+)。 我知道我可以编写一个 VBA 代码来从所有 MyUDF 中删除路径。但这并不理想,因为用户必须打开电子表格并将代码放入电子表格并运行。
我想知道客户是否有更好/更方便的方法来解决问题 谢谢
【问题讨论】:
找到了解决方法。我保留具有 VBA 代码的旧 xla 文件来注册 MyUDF。在新的 xll 中,我公开了具有相同签名的相同功能。当用户打开从以前的 Addin 构建的电子表格时(如果安装文件夹未更改),则没有问题。即 MyUDF 显示为 MyUDF,前面没有路径。我也试过这个,我更改了 C# 代码以注册 MyUDF 以从 xla 中的 MyUDF 返回不同的值,并且 helpID 指向来自 xla 的不同页面,看起来 C# 中的版本优先于 xla。我不知道这种方法是否有任何问题。 请参阅this question 以获得使用 VBA 参考的答案。 【参考方案1】:在内部,Excel 为 .xla 函数存储不同的信息 和一个 .xll 函数。这不是那么容易,所以你可以 与输入的函数兼容的 .xll 工作表作为 .xla 中的函数。
您还可以通过在 .xmlx 文件中浏览一下来了解 Excel 如何存储此信息。
这个 Wilmott 讨论可能是相关的: http://www.wilmott.com/messageview.cfm?catid=10&threadid=79763 对于您的情况,我可以建议的最好方法是将转换宏添加到 您的 .xll,并让用户在他们按下“修复”按钮时 打开尚未转换的电子表格。
【讨论】:
非常感谢,Govert。如何在我的 xll 中添加转换宏?你能举个简单的例子吗?我刚刚发现我发现的解决方法存在一个问题,相同的 MyUDF 在 Excel 中注册了两次 这是我最后使用的解决方案。我保留了我的 xla 插件,在 xll 中,我使用相同的签名注册了相同的 MyUDF(而几乎相同,可选参数在 xll 中不受支持,但在我的 xla 中使用)并设置 IsHidden = true。因此插入函数列表中只显示了一个 MyUDF。当您输入 =MyUDF 并单击函数向导时,xll 中的版本会显示在函数参数窗口中。在 Excel 2007 中,当我键入 =MyUDF 时,下拉菜单中没有任何功能。在 Excel 2010 中,当我键入 =MyUDF 时,会出现一个下拉菜单。因此该解决方案在 Excel 2010 中效果更好。 @toosensitive 嗨,您能解释一下您的解决方案吗?这如何解决将现有工作表链接到旧 xla 的问题? 例如在我的 xla 文件中,我有一个 UDF Public Function UDF1(param1, param2) As String ... return a value End Function 试试这个。假设我在 xla 文件中有一个 UDF1 作为 Public Function UDF1(param1, param2) As String ... 返回一个值 End Function 在我的 xll 中,我添加了另一个具有相同签名但作为隐藏 UDF 的 UDF1,即 [ExcelFunction(IsHidden = true)] public static object UDF1(param1, param2) .... return a value 我把旧的 xla 和我的 xll 放在一起,所以当旧的工作表可以工作时。如果您不想保留 xla,您可以添加一个按钮以从 UDF 中删除路径,当然您仍然需要在 xll 中添加与 xla 中相同的 UDF。【参考方案2】:这是我最后使用的解决方案。我保留了我的 xla 插件,在 xll 中,我使用相同的签名注册了相同的 MyUDF(而几乎相同,可选参数在 xll 中不受支持,但在我的 xla 中使用)并设置 IsHidden = true。因此插入函数列表中只显示了一个 MyUDF。当您输入 =MyUDF 并单击函数向导时,xll 中的版本会显示在函数参数窗口中。在 Excel 2007 中,当我键入 =MyUDF 时,下拉菜单中没有任何功能。在 Excel 2010 中,当我键入 =MyUDF 时,会出现一个下拉菜单。因此,该解决方案在 Excel 2010 中效果更好。
【讨论】:
以上是关于从 Excel 公式中的 UDF 中删除 AddIn 路径的主要内容,如果未能解决你的问题,请参考以下文章
从 Excel 与 VBA 调用时,VBA UDF 给出不同的答案