在Excel/automation中强制加载加载项

在Excel/automation中强制加载加载项,excel,user-defined-functions,excel-automation,Excel,User Defined Functions,Excel Automation,我有一个Excel自动化插件,提供一组自定义项。即使在通过互操作API打开Excel时,我也希望这些UDF能够正常工作。我知道,当通过互操作API打开Excel时,Excel是通过参数/自动化启动的,该参数会生成Excel。为了解决这个问题,我添加了以下工作簿\u打开事件: 私有子工作簿\u打开 Application.addinsomeapp.DemoAddin.Installed=False Application.AddInsSomeApp.DemoAddin.Installed=True

我有一个Excel自动化插件,提供一组自定义项。即使在通过互操作API打开Excel时,我也希望这些UDF能够正常工作。我知道,当通过互操作API打开Excel时,Excel是通过参数/自动化启动的,该参数会生成Excel。为了解决这个问题,我添加了以下工作簿\u打开事件:

私有子工作簿\u打开 Application.addinsomeapp.DemoAddin.Installed=False Application.AddInsSomeApp.DemoAddin.Installed=True 端接头 此代码成功加载加载项。我在加载项中使用了一些日志来验证

我编写了一个调用UDF=myDemoFunction的测试工作簿。 通过C:\path\to\EXCEL.exe/automation C:\path\to\workbook.xlsm打开工作簿时,我观察到以下行为。 首先,在这种情况下,带有UDF的单元格显示正确的结果15.0。但是,公式显示为=SomeApp.DemoAddin.myDemoFunction,这通常仅在未加载加载项时出现。 当使用CTRL+ALT+F9重新计算或在VBA中执行Application.CalculationFullRebuild,甚至使用ThisWorkbook.Worksheets1.UsedRange.dirty all将所有填充的单元格标记为脏单元格时,将导致具有UDF的单元格显示NAME?。编辑其中一个UDF单元格时,选择F2,然后返回该工作表上的所有UDF,而不是使用该UDF的其他工作表上的所有UDF,突然再次返回正确的结果,公式再次更改为=myDemoFunction

所以我的问题是,如何触发Excel以编程方式识别外接程序

我的代码库要大得多,但下面是Automation加载项的精简版本,在VB.net中显示了这种行为:

导入可扩展性 导入System.Runtime.InteropServices 导入Excel=Microsoft.Office.Interop.Excel 公共类DemoAddin 实现IDTExtensibility2 作为Excel.Application的私有excelApp 公共子OnBeginShutdownByRef自定义As数组实现IDTExtensibility2.OnBeginShutdown 端接头 公共子OnAddInsUpdate ByRef自定义As数组实现IDTExtensibility2.OnAddInsUpdate 端接头 公共子OnStartupCompleteByRef自定义As数组实现IDTExtensibility2.OnStartupComplete 端接头 Public Sub OnDisconnectionRemoveMode作为ext_DisconnectMode,ByRef custom作为数组实现IDTExtensibility2.OnDisconnection Marshal.ReleaseComObjectexcelApp excelApp=无 端接头 Public Sub OnConnectionapplication作为对象,connectMode作为ext_connectMode,AddInSet作为对象,ByRef custom作为数组实现IDTExtensibility2.OnConnection excelApp=CTypeapplication,Excel.Application 端接头 公共函数myDemoFunction作为字符串 返回excelApp.Version 端函数 末级
调用所有从VBA中断的UDF就足够了。因此,更新后的工作簿_Open就起到了作用。下面的代码还进行了一些探索,以避免不必要地重新加载加载项,但这不是必需的。真正的神奇之处在于最后一行应用程序。运行myDemoFunction

私有子工作簿\u打开 确保已加载 端接头 公共子系统已加载 调试。为加载项打印探测 错误时转到NotLoaded 应用程序。运行myDemoFunction 出口接头 未加载: 调试。未加载打印加载项。重新加载。 Application.addinsomeapp.DemoAddin.Installed=False Application.AddInsSomeApp.DemoAddin.Installed=True 应用程序。运行myDemoFunction 端接头 这个解决方案需要知道exect UDF是什么,所以它是次优的