我有一个C# ExcelDna XLL
函数库,我在启动时从VSTO加载项注册。
this.Application.RegisterXLL(xllPath);
当我shell执行Excel文件(Process.Start
.xlsx
文件)时,大部分时间一切正常,函数在工作簿打开时进行评估。
以这种方式打开工作簿时,Excel会重用当前正在运行的EXCEL.EXE
进程(如果存在)。大多数时候这很好,但在某些情况下,例如,如果Excel
通过COM
打开然后关闭,那么当Excel实例关闭时,它并没有真正关闭,但是关闭所有加载项并取消注册所有XLLs
但仍然存活。当进程调用其中一个僵尸进程时,这些函数显然不再评估。
为了试图解决这个问题,我尝试使用.xlsx
文件作为命令行参数直接打开Excel,但在这种情况下,似乎存在某种竞争条件,并且工作簿在XLL
已完成注册,功能始终评估为#NAME
。如果修改并重新评估单元格,则函数会正确评估。调用Application.CalculateFull()
和所有可能的变体都无效。
如果我通过资源管理器打开一个文件(即双击它),那么奇怪的是它现在返回#N\A
而不是#NAME
,但仍然是同样的问题。
我甚至尝试注册XLL
,因此它会在启动时加载(see here),但仍然无效。
有没有其他人遇到过此问题并找到了一种可靠的方法来在打开Excel实例时评估XLL
函数?
答案 0 :(得分:0)
我们发现,如果加载项未正确加载且函数未计算,则执行全局搜索和替换(例如,搜索=
替换为=
)当常规recalc不起作用时强制重新计算。您可以使用VBA Application.OnTime