【问题标题】:Excel Interop in .Net - Catch VBA errors?.Net 中的 Excel 互操作 - 捕获 VBA 错误?
【发布时间】:2014-10-02 08:04:05
【问题描述】:

类似于Errors when calling certain Excel VBA macros from C#,我想实现一个错误处理程序,它将捕获 VBA 错误并优雅地返回。

基本上,我在 Excel 中打开了一个任意宏工作簿,如果宏失败(即您收到带有“结束”和“调试”按钮的 VBA 错误对话框),我希望我的应用程序改为在内部处理它使用 VBA 的对话框。这主要是为了让有问题的书不会冻结处理(我正在使用各种队列来处理多个工作簿)。

我已经知道 DisplayAlerts=False 属性,并将 On Error Resume Next 插入到每个例程中,但我不想将其注入到所有内容中(特别是因为其中一些工作簿可能已经修改了上述设置和在例行程序中重置它们!)

到目前为止,我最好的想法是编写某种进程观察器来查找标题为“Microsoft Visual Basic”的窗口并发送键为“E”(单击结束按钮)。

我在一些地方读到有一个名为 Application.BreakOnVBAError 的属性可以设置为 False,但它似乎不存在于互操作程序集中。

【问题讨论】:

  • VB.NET vbscript vba
  • @Plutonix 我在 VB.Net 中编写这个包装器,因此是 VB.Net 标记...这是一个 VB.Net 应用程序,它实例化 Excel 的 COM 对象,然后调用 VBA 宏.目的是在 VB.Net 应用程序中处理潜在的 VBA 错误情况。

标签: vb.net excel error-handling excel-interop vba


【解决方案1】:

在 pinvoke.net 和 MWinAPI 的帮助下,我已经能够枚举在 Excel 的进程 ID 下创建的所有窗口,然后我可以深入了解对话框的元素(如果它是这样的对话框)作为 Microsoft Visual Basic 对话框)。

因为它是一个自动化实例,所以主窗口是隐藏的,所以唯一应该显示的是消息框和 VBA 错误框,然后我可以在必要时将键盘输入消息发送到结束脚本。

当然,这个方法永远不会点击“调试”按钮,所以我不应该看到 VBE 窗口,但以防万一我也处理。

可根据要求提供源代码?

【讨论】:

  • 是的,看看您是否仍然拥有它(或找到更好的选择;)
  • @Greedo Oof,对不起,我不确定我是否还有那个代码。 ? 我什至已经有一段时间没有安装 Office 或 Visual Studio,实际上......
  • @Greedo 你很幸运,我设法找到了我项目的旧副本。遗憾的是,没有来源,但二进制文件应该是可反编译的。 drive.google.com/drive/folders/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-02-28
  • 2017-04-28
  • 1970-01-01
  • 1970-01-01
  • 2011-05-12
  • 2012-04-29
  • 2010-10-15
相关资源
最近更新 更多