1

我完全不知道如何开始诊断这个,只是想知道是否有人有任何建议。我通过从 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 对我来说有点笨拙……有什么想法吗?

4

2 回答 2

0

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

于 2010-04-20T17:08:30.263 回答
0

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

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

抱歉没有“真实”的答案

于 2010-04-26T16:30:51.117 回答