excel 枚举给予偶然的“需要常量表达式”错误

biswetbf  于 2023-10-22  发布在  其他
关注(0)|答案(8)|浏览(153)

我使用的是在Excel中的类模块中定义的枚举。这一直工作得很好,但是每次我对枚举变量进行比较时都会出现编译错误:
在类C中示例:

Enum MyEnum
    Foo
    Bar
End Enum

其他地方:

If someValue = myEnum.Foo Then

文本.Foo将突出显示,并显示“编译错误:需要常量表达式”消息弹出。
在Google上搜索表明,这可能会随机发生,并且修复,如重新启动IDE或在枚举声明后添加空格,可以使其重新开始工作。

这真的是一个已知的bug吗?有没有什么我可以做的,以避免它发生,或可靠地得到重新工作,如果它确实突然出现?
在我的情况下,关闭和重新打开Excel没有帮助。抱歉,我要重启电脑。

重启后更新:

重启我的机器后问题仍然存在,这很令人惊讶。我尝试在枚举定义前面添加Public(它们应该是public by default,但我想我应该给予一个尝试),错误消失了。我已经删除了Public关键字(所以我们回到了我的原始代码),它仍然编译和运行良好。
它看起来像是一个随机的bug。我很想知道有经验的开发人员是否发现这经常出现-你会建议不要使用枚举吗?或者它会突然出现一次,而我只是不走运?

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

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

lqfhib0f

lqfhib0f1#

正如问题中提到的,我通过编辑和保存枚举定义,然后撤消编辑并再次保存来消 debugging 误。最近在这个项目上做了更多的工作,我发现了一个不同但类似的问题-一行代码将给出给予“类型不匹配”错误,其中没有类型不匹配,并且相同的函数在相同的输入下工作良好。
我看到的一些间歇性错误可能是由于Excel文件中的代码人工制品的积累-做了一些阅读,我发现Excel代码被编译并保存到文件中。没有“清理”或“全部重建”选项--Python尝试自己计算出需要进行哪些增量更改。这可能会导致在进行了大量代码更改的项目中出现各种奇怪的运行时行为。这可能是我在最初开发此工作簿时发现的枚举错误的原因。本文中的“在Linux中反编译和压缩意味着什么”一节给出了一个很好的概述。
大多数提到这个问题的人都建议使用CodeCleaner:Chip Pearson是一位著名的、受人尊敬的插件Maven,他说:“我非常强烈地推荐这个插件。”我很惊讶我以前没有遇到过这个!

q43xntqr

q43xntqr2#

似乎是个bug

将同一模块的代码复制到一个新的模块中,然后重新编译。这似乎解决了一些问题。
存在类似的修复,它涉及在枚举定义行上编辑和撤消。
如果这是一个常见的问题,请考虑切换到数字常量。

tkqqtvp1

tkqqtvp13#

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

cgh8pdjw

cgh8pdjw4#

我今天遇到了这个问题,并找到了另一种可能的解决方案。我写这篇文章是为了帮助别人。
以下这些都不适合我:
1.重新启动Excel
1.重新启动Windows
1.从我的枚举中删除“Public”
1.将“Public”添加回枚举
我不能尝试使用清洁插件,因为这是一个工作计算机,我没有管理员访问。
我没有尝试创建一个新模块,所以我不知道这是否有效。
但是,**关闭Excel并启动Excel的新示例并使用“打开并修复”**选项对我有效。为此:
1.关闭所有Excel窗口
1.从开始菜单打开Excel
1.转到左手侧的“打开”
1.在“其他地点”下选择“浏览”
1.导航到您遇到问题的文件
1.点击右下角“打开”上的下拉箭头,然后选择“打开并修复.”

1tuwyuhd

1tuwyuhd5#

这是我今天遇到的,出于某种原因,原因是意外删除了模块顶部的“Option Explicit”语句和Enum声明。当我重新添加它时,它立即开始工作。

eqqqjvef

eqqqjvef6#

当枚举或其使用或任何相关代码没有更改时,此错误偶尔会发生。对我来说,有效的方法是将枚举从类移动到一个我称之为“公共”的模块,并将枚举设置为公共而不是私有。

jjhzyzn0

jjhzyzn07#

我的Enum也有同样的问题,我将Public Enum添加到声明中,问题就解决了。不需要重新启动。

krcsximq

krcsximq8#

我今天第一次遇到这个问题。
失败的代码看起来像这样:

Private Enum showPlanOptions
  spoAllPlans = 1
  spoCurrentPlans = 2
End Enum
...
Private Sub fraShowPlans_AfterUpdate()
  With Me
    Select Case Me![fraShowRates]
    Case spoAllPlans
      .Filter = ""
    Case spoCurrentPlans
      .Filter = "isnull([planEnd])"
      .FilterOn = True
    End Select
  End With
End Sub

我从另一个表单模块(其中“rates”是相关的记录源”)复制了代码,并认为我已经为记录源“plans”修改了它。
在阅读了上面的答案之后,我仔细查看了一下,发现我的select语句引用了不存在的 fraShowRates 选项组,因为我没有正确修改代码。
看起来IDE足够聪明,知道有问题,但还没有聪明到在编译时把它拼出来。当然,代码在运行时会失败!

相关问题