22

我正在使用 Excel VBA 的类模块中定义的枚举。这一直工作正常,但每次我对枚举变量进行比较时,我都开始收到编译错误:

在 C 类示例中:

Enum MyEnum
    Foo
    Bar
End Enum

别处:

If someValue = myEnum.Foo Then

文本.Foo将突出显示,并弹出“编译错误:需要常量表达式”消息。

在 Google 上的搜索表明这可能会随机发生,并且诸如重新启动 IDE 或在枚举声明后添加空格等修复可以使其重新开始工作。

这真的是 VBA 中的一个已知错误吗?我能做些什么来避免它发生,或者如果它突然出现,可以可靠地让 VBA 再次工作吗?

就我而言,关闭和重新打开 Excel 并没有帮助。对不起,我重新启动我的电脑。

重启后更新:

重新启动我的机器后问题仍然存在,这令人惊讶。我尝试在枚举定义前面添加(默认情况下Public它们是公开的,但我想我会试一试),错误消失了。我已经删除了关键字(所以我们回到我的原始代码),它仍然可以编译并运行良好。Public

看起来这是 VBA 中的一个随机错误。我很想知道有经验的开发人员是否经常发现这种情况——你会建议不要使用枚举吗?还是它突然出现在一个蓝色的月亮上而我只是不走运?

经过 6 周的进一步开发后更新:

在我开发这个项目的剩余时间里,这个问题没有再次出现,所以看起来这是一个罕见的问题。

4

7 回答 7

15

如问题中所述,我通过编辑和保存枚举定义消除了错误,然后撤消编辑并再次保存。最近在该项目上做了更多工作,我发现了一个不同但类似的问题 - 一行代码会给出“类型不匹配”错误,其中没有类型不匹配,并且相同的功能,未更改,一直在正常工作相同的输入。

我看到的一些间歇性错误可能是由于 Excel 文件中的代码伪影堆积造成的 - 经过阅读后,我发现 VBA 代码被编译并保存到文件中。没有“干净”或“全部重建”选项 - VBA 尝试自行确定需要哪些增量更改。这可能会在您进行大量代码更改的项目中导致各种奇怪的运行时行为。这可能是我在本工作簿的初始开发过程中发现的枚举错误的原因。本文中的“ VBA 中的反编译和压缩意味着什么”一节给出了很好的概述。

大多数提到这个问题的建议使用 VBA CodeCleaner: http: //www.appspro.com/Utilities/CodeCleaner.htm。著名且受人尊敬的 VBA 专家 Chip Pearson 说:“我非常强烈推荐这个插件”。我很惊讶我以前没有遇到过这个!

于 2013-11-28T12:23:23.700 回答
8

似乎是一个错误。

将相同模块的代码复制到新的,然后重新编译。这似乎解决了一些问题。

存在一个类似的修复,它涉及在枚举定义的行上进行编辑和撤消。

如果这是一个常见问题,请考虑切换到数字常量。

于 2013-02-12T10:47:06.237 回答
2

一个老问题,但刚刚经历过。删除了枚举上的公共定义器,它编译得很好。没有重启IDE。令人惊讶的是,它还在这里。

于 2017-04-03T13:11:13.843 回答
1

我今天遇到了这个问题,并找到了另一种可能的解决方案。我发布以防万一这可能对其他人有帮助。

以下都不适合我:

  1. 重新启动 Excel
  2. 重新启动 Windows
  3. 从我的枚举中删除“公共”
  4. 将“公共”添加回我的枚举

我无法尝试使用 VBA 清洁插件,因为这是一台工作计算机,我没有管理员访问权限。

我没有尝试创建一个新模块,所以我不知道这是否可行。

但是,关闭 Excel 并启动新的 Excel 实例并使用“打开和修复”选项对我有用。要做到这一点:

  1. 关闭所有 Excel 窗口
  2. 从开始菜单打开 Excel
  3. 转到左侧的“打开”
  4. 在“其他位置”下选择“浏览”
  5. 导航到您遇到问题的文件
  6. 单击右下角“打开”上的下拉箭头,然后选择“打开并修复...”
于 2021-05-24T22:48:02.567 回答
1

今天发生在我身上,由于某种原因,原因是模块顶部的带有Enum声明的“Option Explicit”语句被意外删除。当我重新添加它时,它立即开始工作。

于 2021-06-23T12:01:48.540 回答
0

我的 Enum 遇到了同样的问题,我在声明中添加了 Public Enum 并且问题停止了。无需重新启动。

于 2019-11-22T15:10:26.447 回答
0

当没有对枚举或其使用或任何相关代码进行任何更改时,此错误会不时出现。对我有用的是将枚举从类移动到我称之为“通用”的模块,并使枚举成为公共而不是私有。

于 2019-07-25T18:55:53.650 回答