我正在使用Excel VBA中的类模块中定义的枚举。这一直很好,但每次我对枚举变量进行比较时,我都开始遇到编译错误:
在课程CExample中:
Enum MyEnum
Foo
Bar
End Enum
其他地方:
If someValue = myEnum.Foo Then
将突出显示文本.Foo
,并弹出“编译错误:需要常量表达式”消息。
在Google上进行的搜索表明,这可能会随机发生,并且在枚举声明之后重新启动IDE或添加空格等修复可以使其重新开始工作。
这真的是VBA中的已知错误吗?有什么我可以做的,以避免它发生,或如果它确实出现可靠的让VBA再次工作?
就我而言,关闭并重新打开Excel并没有帮助。对不起,我重新启动电脑。
重启后更新:
重启我的机器后问题仍然存在,这是令人惊讶的。我尝试在枚举定义前添加Public
(它们应该是public by default,但我想我会尝试一下),错误就消失了。我删除了Public
关键字(因此我们回到原始代码中),它仍然可以编译并运行正常。
看起来这是VBA中的随机错误。我有兴趣知道经验丰富的开发人员是否经常发现这种情况 - 你会建议不使用枚举吗?或者它是否在蓝色的月亮中突然出现,我只是不走运?
进一步发展6周后更新:
在开发这个项目的剩余时间里,这个问题没有再发生,所以看起来这是一个罕见的问题。
答案 0 :(得分:10)
正如问题所述,我通过编辑和保存枚举定义,然后撤消编辑并再次保存来消除错误。最近在项目上做了一些更多的工作,我发现了一个不同但相似的问题 - 一行代码会产生“类型不匹配”错误,其中没有类型不匹配,并且相同的功能,未更改,已经正常工作相同的输入。
我看到的一些间歇性错误可能是由于Excel文件中的代码伪像的累积 - 做了一些阅读,我发现VBA代码被编译并保存到文件中。没有“干净”或“全部重建”选项--VBA尝试自行解决需要进行哪些增量更改的问题。这可能会导致您进行大量代码更改的项目中出现各种奇怪的运行时行为。这可能是我在本工作簿的初始开发过程中发现的枚举错误的原因。本文中的“What It Means to Decompile and Compact in VBA”部分提供了一个很好的概述。
大多数提及此问题的建议使用VBA CodeCleaner:http://www.appspro.com/Utilities/CodeCleaner.htm。着名的VBA专家Chip Pearson说:“我非常强烈地推荐这个插件”。我很惊讶我之前没遇到过这个!
答案 1 :(得分:7)
似乎是一个错误。
将相同模块的代码复制到新代码,然后重新编译。这似乎解决了一些问题。
存在类似的修复,包括在枚举定义的行上编辑和撤消。
如果这是一个经常出现的问题,请考虑切换到数字常量。
答案 2 :(得分:1)
一个老问题,但刚刚经历过这个问题。删除了Enum上的公共定义器,它编译得很好。没有重启IDE。令人惊讶的是,这仍然存在。
答案 3 :(得分:1)
我今天遇到了这个问题,并找到了另一个可能的解决方案。我发帖是为了帮助其他人。
以下都不适合我:
我无法尝试使用 VBA 清洁加载项,因为这是一台工作计算机,而且我没有管理员权限。
我没有尝试创建新模块,所以我不知道这是否可行。
但是,关闭 Excel 并启动 Excel 的新实例并使用“打开和修复” 选项对我有用。要做到这一点:
答案 4 :(得分:0)
当未对枚举及其使用或任何相关代码进行任何更改时,此错误会不时发生。对我有用的是将枚举从类移到我称为“公共”的模块,并将枚举设为公共而不是私有。
答案 5 :(得分:0)
我的枚举存在相同的问题,我在声明中添加了公共枚举,并且问题停止了。无需重启。
答案 6 :(得分:0)
我今天遇到了这种情况,出于某种原因,原因是模块顶部的带有 Enum
声明的“Option Explicit”语句被意外删除。当我重新添加它时,它立即开始工作。