23

症状

这是编译Excel VBA 项目时特有的症状。出现以下错误:

User-defined type not defined

但是,编译器不会突出显示产生此错误的代码,因此我无法确定问题所在。

我已经知道并尝试过的

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

经过大量研究,我发现这个错误可能与缺少引用有关,我已经排除了这一点,因为我已经包含了所有需要的引用和工具箱对象。

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

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

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

我通过这个问题和答案找到了这篇文章,但是,我在标准 Excel VBA编辑器中找不到这个选项。

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

我从谷歌搜索和其他问题中知道,我不是唯一一个遇到这个问题的人。

我曾尝试手动浏览代码,但行数太多,无法做到这一点。

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

先感谢您。

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

4

21 回答 21

7

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

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

所以解决方案是将每个引用的对象声明为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")
于 2014-04-10T18:25:13.047 回答
5

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

于 2014-07-03T21:04:47.640 回答
4

由于听起来您已经尝试了许多不同的潜在解决方案,因此您现在可能不得不以长期的有条不紊的方式来做这件事。

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

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

要么您会找到违规者,要么您将拥有一个神奇地没有问题的新工作簿。后者可能是由于工作簿文件中的某种隐藏损坏,可能在二进制 vbproject 部分中。

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

于 2013-11-13T17:42:21.527 回答
4

只是让大家知道我也有这个问题。问题不是代码,而是按钮调用的宏。(它一直在调用“createroutes.createroutes”宏,但我已将“createroutes”模块重命名为“routes”。)因此,通过将按钮指向正确的位置来解决问题。

于 2016-01-31T22:51:07.007 回答
2

我能够通过

  1. 完全关闭访问
  2. 重命名数据库文件
  3. 在 Access 中打开重命名的数据库文件。
  4. 接受各种安全警告和提示。
    • 我不仅选择了启用宏,而且还接受了将重命名的数据库设为可信文档。
    • 之前的文件也被标记为可信文档。
  5. 成功编译 VBA 项目,没有错误,没有更改代码。
  6. 编译成功后,我可以再次关闭 Access,将其重命名为原始文件名。我不得不回复相同的安全提示,但是一旦我打开 VBA 项目,它仍然编译没有错误。

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

  • 我发布此答案是因为我观察到的症状与其他症状略有不同和/或我的解决方案似乎很独特。
  • 至少在我遇到错误的部分时间里,我的 VBA 窗口显示了两个额外的“神秘”项目。遗憾的是,在解决错误之前我没有记录名称。一个是 ACXTOOLS 之类的东西。里面的模块无法打开。
  • 我认为最初的问题确实是由于代码错误,因为我在尝试更新其模块代码之前对表单进行了重大更改。但即使在修复代码之后,错误仍然存​​在。我知道代码有效,因为表单会加载并且没有错误。正如原始帖子所述,会出现“未定义用户定义的类型”错误,但不会出现任何有问题的代码行。
  • 在发现此错误之前,我确保添加了所有必要的参考。我不止一次地压缩和修复了数据库。我在各种修复尝试之间关闭了 Access 并多次重新打开该文件。我删除了可疑的违规表格,但仍然出现错误。我尝试了此处和其他论坛上建议的其他各种步骤,但没有解决问题。
  • 当我制作备份副本以尝试采取严厉措施(例如一次删除一个表单/模块)时,我偶然发现了此修复程序。但是打开备份副本后,问题没有再次出现。
于 2017-05-03T18:30:15.523 回答
2

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

于 2017-02-06T11:03:42.807 回答
1

我在一个普通的 VB6 程序中遇到了这个问题。原来我省略了一个类定义,而不是用户定义的类型。显然 VB 看到了类似“Thing.name”的东西,并假设 Thing 是一个 UDT。是的,这是一个严重的 VB6 错误,但你很难指望微软会支持他们 16 年前出售的东西。那么您使用的各种产品的版本是什么?这只有在 MS 支持的产品中出现时才有意义。

于 2014-08-19T03:24:08.017 回答
1

我知道这很旧,但是我遇到了类似的问题并找到了解决方法:

我从 Excel 移植到 Access 的模块遇到了同样的问题,在一个不相关的 UDF 中,我将“As Range”调暗,但 Access 中不存在范围。您可能正在使用变量类型而没有打开正确的参考库。

如果你有任何非标准的 dims 谷歌它们,看看你是否错过了工具下对该库的引用。

-E

于 2015-12-03T20:37:25.473 回答
1

可能的解决方案,您正在尝试通过 Excel VBA 使用 Powerpoint,但您没有先激活 Powerpoint 对象库。

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

于 2017-10-17T14:21:44.837 回答
1

供日后参考——

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

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"

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

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

于 2016-07-27T16:12:10.297 回答
1

当我在 MS Access 数据库中出现此错误时,我使用了 /decompile 命令行开关以及 Compact/Repair 选项。为我工作。我删除了一个引用,我确定我的代码不再使用并开始出现此错误。

于 2019-05-30T14:50:22.030 回答
1

对于 Scripting.Dictionary 类型,您可以使用后期绑定(如前所述):

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

哪个有效,但您没有获得代码自动完成功能。或者您使用早期绑定,但您需要确保 VBA 可以通过 VBA-->Tools-->References-->“Microsoft Scripting Runtime”添加对 Microsoft Scripting Library 的引用来找到 Scripting.Dictionary 类型。然后你可以使用:

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

...并且自动完成将起作用。

于 2017-06-02T06:45:52.307 回答
0

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

我设法修复错误如下:

  • 将所有模块、表单和类导出到硬盘
  • 从项目中删除所有内容
  • 保存了项目
  • 重新导入所有模块、表单和类,删除 cProgress 类并编译。
  • 错误消失了。
于 2014-10-08T04:52:06.650 回答
0

具有相同症状的不同问题:我实现了一个未定义的类。它被一个#if 包裹着,我认为它不应该让编译器看到它,但事实并非如此。删除 Implements 语句中的注释,一切都很好。我认为导入定义也可以工作......

于 2015-02-04T20:45:15.333 回答
0

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

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

就我而言,这尤其令人不安,因为我的 UDF 只用一个字母命名,例如x(),y()等,而且我还有包含句点的范围名称——' x.a'、' c.d' 等。每次我说,拼写错误一个范围名称——例如,'xh','用户定义的......'错误被抛出只是因为一个名为' x()'的 UDF 存在于我的项目中的某处。

花了几个小时。诊断。上述建议从项目中逐步删除代码,或者相反地剥离所有代码并逐步将其重新添加,这些建议都在正确的轨道上,但他们没有遵循。它与代码本身无关;它只与每个 proc 中第一行代码的名称有关,即命名 proc的Sub MyProcor行。Function MyProc正是当我在项目的一个完全不相关的部分中注释掉我的一个以 1 字母命名的 UDF 时,才发现错误消息。走了,从那里,又过了一个小时。左右,我能够概括所述规则。

除了句点 (' ') 以外的标点字符可能也会出现该错误,.但是范围名称中允许的非字母字符并不多;下划线 (' _') 是允许的,但以所描述的方式使用它似乎不会引发错误。

吉姆·卢德克

于 2014-09-11T05:02:20.393 回答
0

后期装订

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

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

也许该错误不是编译器错误而是链接器错误,因此具体行未知。微软的耻辱!

于 2014-01-28T14:57:00.340 回答
0

当代码停在该行时,我也看到了这个错误:

将 myNode 调暗为 MSXML2.IXMLDOMNode

我发现我必须通过工具 > 首选项添加“Microsoft XML,v6.0”。

然后它对我有用。

于 2020-04-29T16:25:17.683 回答
0

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

于 2016-07-12T12:26:01.123 回答
0

对于实际错误或直接修复它,我没有答案。

我可以报告导出所有代码和表单,然后将它们导入到新的工作簿中为我修复了它。所有的工作都恢复了,不需要再做任何事情来恢复工作了。既然这样有效,很明显它一定是 Excel 中的一个错误,或者新版本中仍然缺少它。

我确实知道这个 Excel (2007) 错误是如何工作的。它似乎与删除一个(或两个)类模块有关。(但不是每个类模块,每次都出于某种原因。)没有代码使用已删除模块的任何部分(或者新导入的版本也不起作用)。一个模块已被删减,只剩下一些注释(希望删除以后可能“丢失”的任何内容),因此没有任何代码可以将其与项目的任何其他部分联系起来。但是在我完全删除代码模块后不久就出现了错误。当返回已删除(但以防万一)的模块时,该错误也停止了。所以为了方便起见,这个项目已经打包了两个未使用的代码模块来避免这个错误。

然后看起来,某些已离开模块的某些元素以某种方式保留在 VBA 环境中,即使项目中任何地方的这些(在这种情况下有两个)类模块中没有使用任何内容。因此,调试/编译会找到该元素,因此缺少某些内容也就不足为奇了。由于缺少的东西在项目中没有任何地方可以突出显示,因此只有一条消息,没有其他任何事情发生。这将解释观察到的行为。

于 2020-05-28T03:09:18.990 回答
0

有点晚了,也不是一个完整的解决方案,但是对于没有任何明显原因(定义了所有引用等)而受到此错误打击的每个人来说,这个线程让我走上了正确的轨道。该问题似乎源于 MS Office VBA 编辑器中的一些与缓存相关的错误。

在对项目进行一些更改后,包括大约 40 个带有代码模块的表单以及 40 个类和 MS Access 2016 中的一些全局模块,编译失败。

注释掉代码显然不是一种选择,导出和重新导入所有 80 多个文件似乎也不合理。专注于最近发生的变化,我的怀疑集中在删除一个类模块上。

没有更好的主意,我重新创建了一个空的类模块,它的名称与以前被删除的相同。和voliá错误消失了!甚至可以在不再次出现错误的情况下再次删除未使用的类模块,直到将任何更改保存到以前包含涉及现在删除的类的 WithEvents 声明的表单模块。

即使在声明已被删除后,也不能完全确定 WithEvents 声明是否真的是触发错误的原因。并且没有线索如何实际找出(没有关于开发历史的信息)哪个 Form 可能是罪魁祸首......

但最终解决问题的是:

  1. 在 VBE 中 - 复制表单代码模块中的所有代码
  2. 在 Access 在设计视图中打开窗体并将Has Module属性设置为No
  3. 保存项目(这将删除与表单关联的任何代码)
  4. (不确定是否需要关闭并重新打开 Access,但我做到了)
  5. 在设计视图中打开表单并将Has Module属性设置回Yes
  6. 在 VBE 中将复制出来的模块代码粘贴回来
  7. 节省
于 2017-05-02T18:56:02.343 回答
0

当我继承另一位分析师的工作簿时,我遇到了同样的问题。他为工作表上的每个按钮分配了宏。当我更改模块的名称(不是过程名称)时,它引发了这个错误。修复很容易。让按钮_OnClick()在工作表中运行一个事件过程并明确地执行该过程Call MyProcedureName()

于 2019-05-30T18:04:58.893 回答