【问题标题】:Automating Excel through the PIA makes VBA go squiffy通过 PIA 自动化 Excel 使 VBA 变得笨拙
【发布时间】:2011-02-10 05:59:32
【问题描述】:

我完全不知道如何开始诊断,只是想知道是否有人有任何建议。我通过从 C# 应用程序调用一些宏来生成 Excel 电子表格,并且在生成过程中它以某种方式中断。我有一个包含所有日志记录/错误处理逻辑的 VBA 类,我使用单例访问器对其进行实例化,如下所示:

Private mcAppFramework As csys_ApplicationFramework

Public Function AppFramework() As csys_ApplicationFramework
  If mcAppFramework Is Nothing Then
    Set mcAppFramework = New csys_ApplicationFramework
    Call mcAppFramework.bInitialise
  End If

  Set AppFramework = mcAppFramework
End Function

上面的代码在我生成电子表格之前运行良好,但之后就失败了。问题似乎是以下行;

Set mcAppFramework = New csys_ApplicationFramework

我以前从未见过失败。如果我向此处分配的变量添加监视,则类型显示为 csys_ApplicationFramework/wksFoo,其中 wksFoo 是同一工作簿中的随机工作表。似乎正在发生的事情是,虽然变量是正确的类型,但不是用我的框架类的新实例填充该插槽,而是使其指向现有工作表,相当于

Set mcAppFramework = wksFoo

正如人们所预料的那样,这是一个编译器错误。更奇怪的是,如果我在有问题的行上放一个断点,编辑该行,然后继续执行,它就可以工作。例如,我删除单词'New' 移出线,移回,重新输入'New' 并恢复执行。这以某种方式“修复”了工作簿,之后它就可以愉快地工作了,我的监视窗口中的变量类型显示为 csys_ApplicationFramework/csys_ApplicationFramework,正如我所期望的那样。

这意味着通过 PIA 操作工作簿会以某种方式暂时破坏它。我在 PIA 中所做的只是打开工作簿,使用 Excel.Application.Run() 调用几个宏,然后再次保存。如果有人认为相关,我可以发布更多详细信息。

我不知道 VBA 如何在幕后创建对象或如何调试它。我也不知道代码执行的方式如何在代码本身不改变的情况下改变。

如前所述,坦率地说,VBA 对我来说有点糊涂……有什么想法吗?

【问题讨论】:

  • 帮助不大,但我遇到了许多与此非常相似的奇怪/无法解释的 VBA 问题。不过我很好奇,您收到什么错误消息?
  • 我收到的实际错误消息是一个自动化错误(错误代码是 -2147319784 (80028018)),并且该错误声称 worksheet_deactivate() 方法失败。这发生在对 mcAppFramework.bInitialise 的调用上,大概是因为底层类型实际上没有那个方法!
  • 那么,代码是否在“Set mcAppFramework = New csys_ApplicationFramework”或“Call mcAppFramework.bInitialise”上失败?
  • 它实际上在 mcAppFramework.bInitialise 调用上失败了。上一个调用应该失败,因为它进行了无效的分配,但在我实际使用创建的对象之前,它似乎并没有真正导致失败。

标签: c# vba pia


【解决方案1】:

我建议 PIA 以某种方式无法正常工作。我建议取消注册它们,从您的 PC 中删除它们的所有实例,然后重新生成它们。

当然,这不是我想给出的合理解释,但有时 COM 似乎只是不想表现。我很想知道当事情像这样崩溃时到底会发生什么,但我唯一看起来工作的事情就是在黑暗中进行大量刺伤,然后一旦奇怪的拒绝工作再次随机消失,我就会尝试改进一个合理的解释.

抱歉没有“真实”的答案

【讨论】:

    【解决方案2】:

    如果您查看任务管理器,是否有任何 excel 实例在后台运行?只是好奇它是否正在创建一个 Excel 对象并且没有正确处理它。

    【讨论】:

    • 恐怕只有一个 - 我试图非常精确地说明我是如何进行自动化的,一旦我在我的 Excel 包装器上调用 Dispose,应用程序对象就会消失......
    猜你喜欢
    • 2011-10-17
    • 1970-01-01
    • 2020-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-22
    相关资源
    最近更新 更多