Excel VBA编译抛出一个“用户定义的types没有定义”的错误,但不会触犯代码行

症状

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

User-defined type not defined

但是,产生这个错误的代码没有被编译器突出显示,所以我不能确定这个问题。

我已经知道,并已经尝试

这是一个“用户定义的types没有定义”的错误,我曾经看到过,有些简单的问题,例如命名As Strig而不是As String 。 然而,这个特定的错误只是在Debug > Compile VBAProject菜单选项popup,当错误消息框popup时,它不会突出显示错误发生的代码行。

经过大量的研究,我发现这个bug可能与缺less的引用有关,我已经排除了所有需要的引用和工具箱对象。

为了确保我没有丢失任何明显缺less的Dim语句,我添加了Option Explicit到所有的代码页(包括表单),以确保没有丢失任何东西。 运行编译时仍然显示错误。

还有这个已知的错误 ,说明这个问题已经发生,因为VB6项目使用二进制兼容性:

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

我发现这篇文章通过这个问题和答案 ,但是,我不能在标准的Excel VBA编辑器中find此选项。

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

我从Google的search和其他问题知道,我不是唯一一个有这个问题的人。

我已经尝试过通过代码手动,但有太多的线路,可行的做到这一点。

有没有办法在Excel VBA项目中closures二进制兼容性? 如果人们无法debugging他们需要改变的东西,人们会如何发现这个有害的代码行? 任何帮助将是可爱的!

先谢谢你。

编辑: 我find了违规的代码行,所以我的问题得到解决 在删除特定行后,问题仍然存在 – 它是代码中引用的表单上的一个mispelt控件名称。 这仍然不能解决你将如何去发现这个问题的问题的特定问题。 当这个错误发生时,我们是否能够find一个很好的方式来find有问题的代码,以便其他人在将来可以避免这种痛苦?

既然听起来你已经尝试了许多不同的解决scheme,那么你现在可能就必须采取长期的方法。

创build一个新的空白工作簿。 然后逐个将旧的工作簿复制到其中。 添加一个引用,写一点代码来testing它。 确保它编译,确保它运行。 再添加一个子或函数,再写一个testing子来运行它,同时确保它编译。 重复这个过程,慢慢地添加和testing一切。

你可以通过首先尝试更大的块来加速这一点,然后当你find触发问题的块时,将其移除并将其拆分成更小的peices进行testing。

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

欢迎来到无debugging器或其他有用工具的debugging世界,为您做繁重的工作!

我的解决scheme不是好消息,但至less应该起作用。

我的情况是:我有一个来自同事的.xlsm。 1)我打开它,然后单击button:它工作正常。 2)我保存文件,closuresexcel,再次打开文件:现在它不工作了。 结论是:代码是好的,但Excel无法正确pipe理引用。 (我尝试删除重新添加引用没有任何成功)

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

例如:

 Dim objXML As MSXML2.DOMDocument Set objXML = New MSXML2.DOMDocument 

取而代之:

 Dim objXML As Variant Set objXML = CreateObject("MSXML2.DOMDocument") 

只是让你们都知道我也有这个问题。 问题不在于代码,而在于button所调用的macros。 (它一直在调用“createroutes.createroutes”macros,但是我把“createroutes”模块改名为“routes”)。因此,通过将button指向正确的位置来解决问题。

我也遇到了同样的问题(当我尝试在用户窗体中实现一个接口的时候,总是会出现这种情况,从这里下载并安装Code Cleaner这是一个免费的工具,它为我节省了很多时间。 "Clean Code..."选项在运行clean之前,确保你检查了“备份项目”和/或“将所有代码模块导出到安全的位置”,据我了解,这个工具导出,导入所有模块和类,从而消除了编入代码的编译器错误,为我工作就像一个魅力!祝你好运。

我有一个普通的VB6程序有这个问题。 事实certificate,我省略了类定义,而不是用户定义的types。 显然VB看到了“Thing.name”之类的东西,并认为Thing是一个UDT。 是的,这是一个严重的VB6错误,但你很难指望微软支持16年前销售的东西。 那么您使用的是什么版本的各种产品? 这只有在MS支持的产品出现时才有意思。

我知道这是旧的,但我有一个类似的问题,发现一个修复:

我有一个模块,我从Excel移植到Access模块​​,在一个无关UDF我调暗'作为范围',但范围不存在于Access中。 您可能正在使用一个variablestypes,而没有打开正确的参考库。

如果你有任何非标准暗淡谷歌他们,看看你是否错过了在工具下的该库的参考。

-E

供将来参考 –

我在Microsoft Access的这段代码中遇到了这个问题,debugging器突出显示了注释行:

 Option Compare Database Option Explicit Dim strSQL As String Dim rstrSQL As String Dim strTempPass As String Private Sub btnForgotPassword_Click() On Error GoTo ErrorHandler Dim oApp As Outlook.Application '<---------------------------------Offending line Dim oMail As MailItem Set oApp = CreateObject("Outlook.application") 'this is the "instance" of Outlook Set oMail = oApp.CreateItem(olMailItem) 'this is the actual "email" 

我必须select以前未选中的参考。 他们是

Microsoft Outlook 15.0对象库
Microsoft Outlook视图控制

有一个类似的经验,但这是因为我已经在我的一个类中重命名了一个枚举。 我导出并重新导入了引用旧枚举的类,并且错误消息消失了。 这表明这是VBA环境中的caching问题。

我可以通过修复错误

  1. 完全closuresAccess
  2. 重命名数据库文件
  3. 在Access中打开重命名的数据库文件。
  4. 接受各种安全警告和提示。
    • 我不仅select了“启用macros”,还接受将重命名的数据库设置为“可信文档”。
    • 之前的文件也被标记为可信文档。
  5. 成功编译VBA项目,没有错误,没有改变代码。
  6. 成功编译后,我能够再次closuresAccess,将其重新命名为原始文件名。 我不得不回复相同的安全提示,但一旦我打开VBA项目,它仍然编译没有错误。

这个案例和观察的一点历史:

  • 我发布这个答案,因为我观察到的症状是有点不同于其他和/或我的解决scheme似乎是独一无二的。
  • 至less在部分时间里,我遇到了这个错误,我的VBA窗口显示了两个额外的“神秘”项目。 遗憾的是,在我解决错误之前,我没有记下名字。 其中一个就像ACXTOOLS。 里面的模块不能打开。
  • 我认为最初的问题确实是由于糟糕的代码,因为我已经在尝试更新其模块代码之前对表单进行了重大更改。 但即使修复代码后,错误仍然存​​在。 我知道代码工作,因为表单会加载,没有错误。 正如原来的post所述,“用户定义types未定义”错误会出现,但不会去任何违规的代码行。
  • 在发现这个错误之前,我确保添加了所有必要的参考。 我压缩并修复了数据库不止一次。 我closures了Access,并在各种修复尝试之间多次重新打开文件。 我删除了可疑的违规表格,但仍然有错误。 我尝试了其他论坛上提出的其他各种步骤,但没有解决问题。
  • 我偶然发现了这个问题,当时我做了一个备用拷贝,试图采取严厉措施,例如一次删除一个表单/模块。 但打开备份副本后,问题不再发生。

晚绑定

由于缺less参考,可能会发生此错误。 例如,当从早期绑定更改为后期绑定时,通过消除引用,可能会保留一些引用特定于所引用的引用的数据types的代码。

尝试包括参考,看看问题是否消失。

也许错误不是一个编译器错误,而是一个链接器错误,所以具体的行是未知的。 在微软耻辱!

多年以后,我发现了一个,如果不是的话,Excel中的“用户定义types未定义”错误的Microsoft错误的答案。 我正在运行Windows 2010的Excel 2010。

如果你有一个名为“ xyz() ”的UDF,那么如果你调用一个以该名称开头的不存在的实体, 然后是一个句点后跟其他字符 – 例如,如果你试图调用不存在的范围名称' xyz.abc ',愚蠢的应用程序会抛出错误的消息,之后它将您返回到您的工作表。

在我的情况下,尤其令人不安,因为我用一个字母来命名UDF,例如x()y()等,而且我也有范围名称,包括句点 – ' xa ',' cd '等。每次我拼错一个范围名称,例如'x.h','User-defined …'错误就被抛出,只是因为一个名为' x() '的UDF存在于我的项目的某个地方。

花了几个小时。 来诊断。 上面的build议是逐步从项目中删除代码,或者反过来剥离所有代码,然后逐步添加代码,这些build议都是正确的,但是并没有遵循。 它本身与代码无关; 它只能处理每个过程中第一行代码的名称,即命名过程的Sub MyProcFunction MyProc 。 当时我在项目的一个完全不相关的部分注释了我的一个字母名称的UDF,这个错误信息是msg。 走了,从那里,又一个小时。 或者如此,我能够如所述地概括这个规则。

也许这个错误也会出现在period(' . ')以外的标点符号中,但是在一个范围名称中不允许使用非alpha字符。 下划线(' _ ')是允许的,但以所描述的方式使用它似乎不会引起错误。

吉姆·卢德克

我昨天有同样的错误:我有两个类,cProgress和cProgressEx,在我的项目中,其中一个不再使用,当我删除cProgress类时,我被给了这个相同的编译错误。

我设法解决这个错误如下:

  • 将所有模块,表单和类导出到硬盘驱动器
  • 从项目中删除了所有的东西
  • 保存了该项目
  • 重新导入所有模块,表单和类,删除cProgress类,并编译。
  • 错误消失了。

另一个相同症状的问题是:我有一个没有定义的类实现。 它包裹着一个#if,我认为应该不允许编译器看到它,但不是这样。 将这个注释从Implements语句中移除,一切正常。 我认为导入定义也将工作…

我有同样的问题,如果您启用Microsoft脚本运行时,你应该是好的。 您可以在工具>参考>下执行此操作,然后选中Microsoft Scripting Runtime的checkbox。 这应该可以解决你的问题。

有点迟了,也不是一个完整的解决scheme,但是对于每个被这个错误命中而没有任何明显的原因的人(具有所有定义的参考等等),这个线程把我放在了正确的轨道上。 这个问题似乎来源于MS Office VBA编辑器中与caching相关的一些错误。

在MS Access 2016中对包含约40个代码模块外加40个类和一些全局模块的表单进行一些更改后,编译失败。

注释代码显然不是一种select,导出和重新导入所有80多个文件似乎也是不合理的。 关注最近发生的变化,我的怀疑集中在去除一个class级模块。

没有更好的想法,我重新使用了与之前删除的名称相同的空类模块。 而voliá错误消失了! 甚至有可能再次删除未使用的类模块,而不会再出现错误,直到将任何更改保存到之前包含WithEvents声明(涉及现在已移除的类)的表单模块。

不完全确定如果WithEvents声明真的是甚至在声明被删除后触发错​​误。 而没有线索如何真正找出(没有关于发展历史的信息)哪个forms可能是罪魁祸首…

但是最终解决这个问题的是:

  1. 在VBE中 – 从表单代码模块复制所有代码
  2. 在Access中打开devise视图中的窗体并将模块属性设置为
  3. 保存项目(这将删除与表单关联的任何代码)
  4. (不知道是否需要closures和重新打开Access,但我做到了)
  5. 在devise视图中打开窗体并将Has模块属性设置为
  6. 在VBE中粘贴复制出来的模块代码
  7. 保存

对于Scripting.Dictionarytypes,您可以使用迟绑定(如已经指出的那样):

 Dim Dict as Object Set Dict = CreateObject("Scripting.Dictionary") 

哪些工作,但你没有得到代码自动完成。 或者您使用早期绑定,但您需要确保VBA可以通过VBA – >工具 – >引用 – >“Microsoft脚本运行时”添加对Microsoft脚本库的引用来查找Scripting.Dictionarytypes。 那么你可以使用:

 Dim Dict as Scripting.Dictionary Set Dict = New Scripting.Dictionary 

…和自动完成将工作。

可能的解决scheme,您正试图通过Excel VBA使用Powerpoint,并且您没有首先激活Powerpoint对象库。

为此,请在VBA编辑器顶部菜单中select工具,参考,然后向下滚动以单击名为Microsoft Powerpoint xx.x对象库的库。 Office 2007是库12,每个Office版本都有不同的库。 仅供参考,我在激活2007库时遇到了一些奇怪的错误和文件损坏,但有人试图使用Excel 2003打开并运行此macros。旧版本的Excel无法识别较新的库,这似乎会导致问题。