【问题标题】:Excel XLL function linkage / race condition causing #NAMEExcel XLL 函数链接/竞争条件导致#NAME
【发布时间】:2018-03-17 07:17:57
【问题描述】:

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

this.Application.RegisterXLL(xllPath);

当我执行一个 Excel 文件(Process.Start.xlsx 文件)时,大多数情况下一切正常,并且在工作簿打开时评估函数。

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

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

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

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

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

【问题讨论】:

  • "当 Excel 实例关闭时,它并没有真正关闭" ,我相信这是您需要关注的唯一问题。当通过 COM 打开 Excel 时,您是否致电 workbook.close()excel.Quit()?你不应该得到一个僵尸 Excel 实例。
  • 如果是我打开了 COM 实例,那就没问题了。问题是任何人都可以留下一个悬空的 COM 实例。
  • 好的,那么也许您可以尝试使用/x 开关启动 Excel(以获取新实例)。 support.office.com/en-us/article/…
  • 试过了。 “尝试……”

标签: c# excel excel-dna xll


【解决方案1】:

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

自动执行此操作

【讨论】:

  • 我明白了,但我想问题是知道你什么时候处于那种状态。对我们来说,宏也不是一个可行的解决方案,因为工作簿可能是 xlsx,或者宏可能被禁用。
  • 您已经在分发​​ XLL 插件;因此您还可以分发 .XLAM 插件并要求安装两者。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-03
  • 2014-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-20
  • 1970-01-01
相关资源
最近更新 更多