gpt4 book ai didi

c# - 导致#NAME 的 Excel XLL 函数链接/竞争条件

转载 作者:太空宇宙 更新时间:2023-11-03 14:55:52 25 4
gpt4 key购买 nike

我有一个 C# ExcelDna XLL 函数库,我在从 VSTO 加载项启动期间注册了它。

this.Application.RegisterXLL(xllPath);

当我用 shell 执行一个 Excel 文件(Process.Start .xlsx 文件)时,大部分时间一切正常,函数在工作簿打开时计算。

以这种方式打开工作簿时,Excel 会重新使用当前正在运行的 EXCEL.EXE 进程(如果存在)。大多数时候这很好,但在某些情况下,例如,如果 Excel 通过 COM 打开然后关闭,那么当 Excel 实例关闭时,它不会它并没有真正关闭,而是关闭了它的所有加载项并注销了所有 XLLs 但仍然存在。当进程调用其中一个僵尸进程时,显然,这些函数不再求值。

为了解决这个问题,我尝试直接打开 Excel,使用 .xlsx 文件作为命令行参数,但在这种情况下似乎存在某种竞争条件,并且工作簿在 XLL 完成注册之前打开,并且函数始终计算为 #NAME。如果单元格被修改并重新求值,则函数会正确求值。调用 Application.CalculateFull() 和所有可能的变化均无效。

如果我通过资源管理器打开一个文件(即双击它)然后奇怪的是它现在返回 #N\A 而不是 #NAME 但它仍然是一样的问题。

我什至尝试过注册 XLL,因此它会在启动时加载 (see here),但它仍然无法正常工作。

有没有其他人遇到过这个问题并找到了一种可靠的方法来获取 XLL 函数以在打开 Excel 实例时进行评估?

最佳答案

我们发现,如果加载项未正确加载且函数未计算,则执行全局搜索和替换(例如搜索 = 替换为 =) 在常规重新计算不起作用时强制重新计算。您可以使用 VBA Application.OnTime

自动执行此操作

关于c# - 导致#NAME 的 Excel XLL 函数链接/竞争条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49188659/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com