【发布时间】: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 调用上失败了。上一个调用应该失败,因为它进行了无效的分配,但在我实际使用创建的对象之前,它似乎并没有真正导致失败。