因此这里有一个bug: 在一个64位的VBA宿主环境中(例如Access 365 64位或Excel 2016 64位),创建一个类模块SomeClass
:
' this needs to be here to trigger the bug:
Private Sub Class_Terminate()
End Sub
然后是一些模块 Test
:
Function ReturnFalse(o As Object) As Boolean
ReturnFalse = False
End Function
Sub Test()
Debug.Print ReturnFalse(New SomeClass)
If ReturnFalse(New SomeClass) Then
Debug.Print True
Else
Debug.Print False
End If
End Sub
现在,如果您使用的是32位VBA主机并在立即窗口中运行“Test”,则预期结果将显示出来:
False
False
然而,如果您使用的是64位 VBA 主机,则出现以下情况:
False
True
如果您删除或重命名 Class_Terminate()
子例程,则正确的输出将显示。
我已将此错误追踪到此最小示例。显然,问题似乎是使用临时对象 (new SomeClass
在这里) 破坏了 IF
条件的评估,使其看起来无论如何都是条件值为 True
。
好吧,这是个严重的错误,因为64位编译器很疯狂,所有的 IF
都会出问题。
所有的 IF
?那 WHILE
呢?
While ReturnFalse(New SomeClass)
Debug.Print "Oh no!"
Wend
是的,WHILE
也有问题,因为它会在循环中打印“哦不!”。
这是一个大问题,我在所有版本的Office中都可以重现:
- Microsoft® Access® für Microsoft 365 MSO (16.0.14026.20294) 64-Bit
- Microsoft Access 2016 MSO (16.0.9029.2167) 64-Bit
- Microsoft Access 2013 (15.0.4420.1017) MSO (15.0.4420.1017) 64-Bit
当然,在 Excel 中也有这个问题。
总结:我在拥有的所有Office版本中都发现了这个bug,从2013年开始,可能已经有至少8年了。
好的,之前有其他人受到这个bug的影响吗?是的:
去年的这篇帖子:
VBA takes wrong branch at If-statement - severe compiler bug?
excel.uservoice.com上的这篇帖子(显然是Microsoft的用户建议箱或者什么)来自2018年10月:
好的,那我们来报告一个bug吧。
如果在与其他人测试后,代码出现了错误,而实际上不应该出错,则可以使用Excel中的Smile按钮直接向Microsoft报告此问题。
什么?
- 打开Excel > 文件 > 反馈 > 发送不满意反馈
- 通过UserVoice - 点击以下链接查看其他人的反馈并提供反馈 - https://excel.uservoice.com/
这不是关于新图标颜色方案的建议。这是一个8年前的bug,使得具有宏的Access应用程序和Excel表格计算错误答案(还阻止了我们迁移到Office 64位,因为我们无法把代码取出)。
现在我有几个问题:
- 如何解决这个bug?
- 这里是否有人拥有相当可观的SLA或更好的联系,愿意支持我的请求?
- 是否有一种直接报告VBA bug的方式?(因为我们目前怀疑在64位VBA中存在更多的bug)
- 我在UserVoice上做了一个新的报告。你认为它能得到投票支持吗?https://access.uservoice.com/forums/319956-access-desktop-application/suggestions/43660329-fix-this-64-bit-vba-compiler-bug-temporary-object
更新:交叉发布到
更新2:
我有机会在Office 365 for Mac安装上尝试这段代码(其中Win64被定义为true
),该bug在那里没有出现。所以现在只是电脑问题。
更新3:
帖子发布到了HN和The Register:
https://www.theregister.com/2021/08/19/64_bit_microsoft_vba_bug/ https://news.ycombinator.com/item?id=28188251
更新4:
我今天(2021-11-15)检查了一下Office 365,缺陷已经消失了!看起来有人注意到了。但我还不知道我今年收到的无数累积更新中哪些修复了该问题,也不知道其他版本的Office是否也已经被修复。