Excel VBA Compile抛出"用户定义的类型未定义"错误,但不会转到违规行代码

Tom*_*ock 21 debugging excel vba compiler-errors excel-vba

症状

这是编译Excel VBA项目时的一个症状.发生以下错误:

User-defined type not defined

但是,编译器不会突出显示产生此错误的代码,因此无法识别问题.

我已经知道并尝试过的

这是一个"用户定义的类型未定义"错误,我之前看到过的简单问题,例如命名As Strig而不是As String.但是,此特定错误仅在Debug > Compile VBAProject菜单选项期间弹出,并且当弹出错误消息框时,它不会突出显示错误发生的代码行.

经过大量的研究后我发现这个bug可能与缺少的引用有关,我已经排除了这个,因为我已经包含了所有需要的引用和Toolbox对象.

为了确保我没有遗漏任何明显的缺失Dim语句,我已添加Option Explicit到所有代码页(包括表单)以确保没有遗漏任何内容.运行编译时仍会显示错误.

还有一个已知的错误,表明由于使用二进制兼容性的VB6项目,已知问题会发生:

关闭二进制兼容性并编译项目.Visual Basic将突出显示包含未定义的用户定义类型的代码行.解决问题后,可以重新打开二进制兼容性.

我通过此问答找到了这篇文章,但是,我在标准Excel VBA编辑器中找不到此选项.

帮助拯救我和他人的理智!

我从Google搜索和其他问题中了解到,我不是唯一一个遇到此问题的人.

我已经尝试过手动完成代码,但实际上有太多行可行.

有没有办法在Excel VBA项目中关闭二进制兼容性?如果人们无法调试他们需要更改的内容,人们如何找到这个有问题的代码行?任何帮助都很可爱!

先感谢您.

编辑: 我找到了令人讨厌的代码行,所以我的特定问题就解决了删除该特定行后问题仍然存在 - 它是在其代码中引用的表单上的mispelt控件名称.这仍然无法解决您如何找到这个有问题的代码的特定问题.当这个错误发生时,我们是否能够找到找到有问题的代码的好方法,以便将来的其他人可以避免这种痛苦?

小智 8

我的解决方案不是好消息,但至少应该有效.

我的情况是:我有一个来自同事的.xlsm.1)我打开它并单击按钮:它工作正常.2)我保存文件,关闭excel,再次打开文件:现在它不再工作了.结论是:代码没问题但是excel无法正确管理引用.(我尝试删除重新添加引用但没有成功)

因此,解决方案是将每个引用的对象声明为Variant并使用CreateObject("Foo.Bar")而不是New Foo.Bar.

例如:

Dim objXML As MSXML2.DOMDocument
Set objXML = New MSXML2.DOMDocument
Run Code Online (Sandbox Code Playgroud)

取而代之:

Dim objXML As Variant
Set objXML = CreateObject("MSXML2.DOMDocument")
Run Code Online (Sandbox Code Playgroud)


小智 5

我遇到了完全相同的问题(当我尝试在用户窗体上实现接口时似乎总是发生。从这里下载并安装代码清理器。这是一个免费软件实用程序,它在很多情况下都救了我。打开你的 VBA 项目,运行该"Clean Code..."选项。请务必检查的“备份项目”和/或运行清洁之前“导出所有代码模块”到安全地点。据我了解,这个工具的出口,然后再进口的所有模块和类,消除了潜入代码中的编译器错误。对我来说就像一个魅力!祝你好运。


And*_*ASM 4

由于听起来您已经尝试了许多不同的潜在解决方案,因此您现在可能必须以漫长而有条理的方式进行此操作。

创建一个新的空白工作簿。然后将旧的工作簿逐一复制到其中。添加参考,编写一点代码来测试它。确保它编译,确保它运行。添加一个子程序或函数,再次编写一些测试子程序来运行它,并确保它可以编译。重复此过程,慢慢添加和测试所有内容。

您可以通过首先尝试较大的块来加快速度,然后当您发现触发问题的块时,将其删除并将其分成较小的块进行测试。

要么你会找到罪犯,要么你会得到一本神奇地没有问题的新工作簿。后者可能是由于工作簿文件中某种隐藏的损坏造成的,可能是在二进制 vbproject 部分中。

欢迎来到调试世界,无需调试器或其他有用的工具来为您完成繁重的工作!