小编Nei*_*ass的帖子

VBA枚举偶尔会出现"需要常量表达式"错误

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

在类CExample中:

Enum MyEnum
    Foo
    Bar
End Enum
Run Code Online (Sandbox Code Playgroud)

别处:

If someValue = myEnum.Foo Then
Run Code Online (Sandbox Code Playgroud)

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

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

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

在我的情况下,关闭和重新打开Excel没有帮助.对不起,我重新启动电脑.

重启后更新:

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

它确实看起来像是VBA中的随机错误.我有兴趣知道经验丰富的开发人员是否经常发现这种情况 - 你会建议不使用枚举吗?或者它是否在蓝色的月亮中突然出现,我只是不走运?

进一步开发6周后更新:

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

excel vba excel-vba

18
推荐指数
2
解决办法
6714
查看次数

如何避免VBA中的默认属性陷阱?

我偶尔只使用VBA,每次回到它时我会被以下的一些变化所困扰:

我有一个Range对象,currentCell用于跟踪我在电子表格中使用的单元格.当我更新它以指向不同的单元格时,我写道:

currentCell = currentCell.Offset(ColumnOffset:=1)
Run Code Online (Sandbox Code Playgroud)

问题是我忘记了Set关键字,所以上面的行实际上是使用Range对象的默认属性:

currentCell.Value = currentCell.Offset(ColumnOffset:=1).Value
Run Code Online (Sandbox Code Playgroud)

所以当前单元格的内容会被新单元格中的内容覆盖,而我的currentCell变量并没有改变为指向一个新单元格,当我意识到我第一百次犯了同样的错误时,我感到愤怒. .

可能没有一个更好的答案,而不是把一个贴在我的显示器上说"你有没有记得今天使用Set?",但如果有人有任何建议来帮助我,我会很感激听到他们.特别是:

  • 当您隐式使用默认属性时,有没有办法打开警告?我从来没有故意这样使用它们,Range.Value如果这就是我的意思,我总是打电话.
  • 是否有任何将变量标记为"只应用于从电子表格中读取"的良好做法?在我编写的大多数代码中,几乎所有变量都用于收集数据,如果某些事情无意中编辑了这样的单元格,那么获取警告会很方便.

excel vba excel-vba

10
推荐指数
2
解决办法
1343
查看次数

标签 统计

excel ×2

excel-vba ×2

vba ×2