附加功能在复制的工作表中不起作用
Posted
技术标签:
【中文标题】附加功能在复制的工作表中不起作用【英文标题】:Addin functions not working in copied worksheet 【发布时间】:2014-03-06 04:17:42 【问题描述】:我有一个插件,它定义了一些在 excel 中不可用的数学函数。我已在模板工作表中安装并正常工作(位于模板工作簿中),但是当我将包含模板工作簿中的函数的模板工作表复制到新工作簿时,插件似乎停止工作并给了我一个名字?”调用函数的单元格出错。
有人知道发生了什么吗?提前致谢
编辑: 我应该更具体。插件用于用户定义函数 (UDF),位于 xla 文件中。上面,当我提到“模板工作簿”时,这实际上是不正确的。它是一个普通的工作簿 (.xls),我们根据需要将各个工作表从中复制到一个新的工作簿中。我将其称为我的“主”工作簿,以区别于“模板”。
由于我们有许多不同的“主”工作簿,我们会定期从中提取特定的工作表,因此我正在尝试自动化选择要复制的工作表的过程(使用工作表中的复选框)。一旦勾选了所有必要的复选框,就会按下一个按钮,创建一个新的工作簿,然后从各个主工作簿中导入所有需要的工作表。 UDF 在这个新工作表中不起作用。
根据以下响应者的一些提示和广泛的网络搜索,问题出在 UDF 函数引用本身。让我解释一下:
UDF 定义为:
公共函数 Ber(ByVal x As Double) As Double 结束函数
这在“主”TPLATE.xls 工作簿中运行良好。当我从中复制一张包含具有公式的单元格的工作表时,在新工作表中说“= Ber(A1)”,公式变为:“= TPLATE.xls!Ber(A1)”。
如果我随后在 Cell 的公式中手动租用正确的 UDF,它就可以工作。我不想这样做。
我找到了曾经有希望的解决方案,但似乎无法让它发挥作用: http://www.jkp-ads.com/Articles/FixLinks2UDF00.asp (注:点击绿框箭头继续文章)
有什么方法可以确保复制的工作表中的 UDF 保留对插件的正确引用?
我尝试了以下方法:
包含代码以仅用“=Ber(A1)”查找和替换“=”符号和“Ber(A1)”之间的任何文本 -> 不起作用
来自上述链接的解决方案。 -> 无法让它工作。
再次感谢您的帮助!
【问题讨论】:
你有什么样的插件?某种 UDF、COM、文档级别?您收到的错误意味着 Excel 找不到您正在使用的引用之一。可能是缺少命名范围错误引用(您是否定义了任何未复制的命名范围工作簿?)或者它可能找不到您的插件(函数调用或其他内容)。 【参考方案1】:更好的解决方案是将 UDF 代码放在 XLA/XLAM 插件中,而不是放在工作表模板中。有关说明,请参阅此链接
http://www.cpearson.com/excel/createaddin.aspx
【讨论】:
谢谢查尔斯。我已经编辑了我的问题,以提供有关我如何构建事物的更多详细信息。【参考方案2】:我想我已经找到了解决方案,并希望得到其他人的一些意见:
我创建了一个例程来更新调用 UDF 的链接。
Sub updatelinks()
ActiveWorkbook.ChangeLink Name:= _
"C:\Users\user.1\AppData\Roaming\Microsoft\AddIns\BesselAddIn.xla", NewName _
:=Application.UserLibraryPath & "BesselAddIn.xla", Type:=xlExcelLinks
End Sub
当我在将工作表导入新工作簿后调用它时(当工作表仍然处于活动状态时),它似乎可以为某些计算机完成这项工作,但不是全部。
这一切都让我想到,当调用 UDF 时,隐藏在 Excel 中的机器包括但通常不显示插件位置的完整路径名。
这些有意义吗?
【讨论】:
那是正确的:完整的路径在那里但被隐藏了。因此,只要 XLA 的路径没有改变,就可以了。因此,如果您需要在不同的计算机上进行这项工作,则 XLA 应该位于网络共享上或始终位于相同的硬编码位置,例如 C:\Myaddins\BesselAddin.xla 。请注意,XLL 中的 UDF 函数不会遇到此路径问题。以上是关于附加功能在复制的工作表中不起作用的主要内容,如果未能解决你的问题,请参考以下文章