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