下面是一个bug:在64位 VBA主机(例如Access 365 64位或Excel2016 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主机,并在立即窗口中运行“测试”,则会显示预期的结果:
False
False但是,如果您使用的是64位 VBA主机,则如下所示:
False
True但是,当您移除或重命名Class_Terminate()子时,则会出现正确的输出。
我跟踪了这个bug,直到这个最小的例子。显然,问题似乎是,使用一个临时对象(这里的new SomeClass)以某种方式破坏了IF条件的计算,使得条件的值似乎是True,而不管什么。
好的,这是一个严重的错误,因为64位编译器是疯狂的,所有的IF都有麻烦。
全是IF?那WHILE呢
While ReturnFalse(New SomeClass)
Debug.Print "Oh no!"
Wend是的,WHILE也有麻烦,因为这个打印“哦,不!”在一个循环中。
这是一个很大的麻烦,我可以到处复制:
64-Bit
当然,..And也在Excel中。
摘要:我可以在我所有版本的Office中找到这个bug,从2013年开始,它可能至少有8年历史了。
好吧,这个虫子以前影响过其他人吗?是:
去年的这篇文章:
VBA takes wrong branch at If-statement - severe compiler bug?
这篇文章发表于2018年10月的excel.uservoice.com (这显然是微软的用户建议框)。
好吧,那么让我们提交一份错误报告。
如果在与其他人进行测试之后,代码失败了,而且它真的不应该,您可以使用
中的微笑按钮直接向微软报告这个问题。
什么?
打开Excel >文件>反馈>发送一个Frown
这不是一个新的图标配色方案的建议。这是一个有8年历史的bug,它让带有宏的Access应用程序和Excel工作表计算错误的答案(而且它还阻止迁移到Office 64,因为我们无法取出代码)。
下面是我的问题:
更新:X-张贴到
更新2
我有机会尝试了用于Mac安装的Office365(其中Win64被定义为true)上的代码,但是错误并没有出现。所以现在是电脑的事了。
更新3
邮寄到HN和登记册:
https://www.theregister.com/2021/08/19/64_bit_microsoft_vba_bug/ https://news.ycombinator.com/item?id=28188251
更新4
刚刚检查了今天(2021-11-15)与Office365和错误列表现在!看来有人注意到了。然而,我还是搞不清楚,我今年收到的大量累积更新中,哪一个起到了作用,目前还不知道其他Office版本是否也被修复了。
发布于 2021-08-03 14:47:33
Sub Test()
Debug.Print ReturnFalse(New SomeClass)
If ReturnFalse(New SomeClass) Then
Debug.Print True
Else
Debug.Print False
End If
If True = ReturnFalse(New SomeClass) Then
Debug.Print True
Else
Debug.Print False
End If
End Sub返回
False
True
False所以If True = ReturnFalse(New SomeClass) Then修复了它
对于循环,它也修复了它。
Do While True = ReturnFalse(New SomeClass)
Debug.Print "Oh no!"
Exit Do
Loop强烈建议对上述解决方案的每一个使用进行评论,以便以后没有人删除该True = (例如。因为他在32位发展,甚至没有遇到这个问题)。
' Don't remove `True =` due to a compiler bug in x64 the condition would always be true.
' See https://stackoverflow.com/questions/68034271/how-can-i-get-this-8-year-old-vba-64-bit-compiler-bug-fixed
If True = ReturnFalse(New SomeClass) Then即使是If ReturnFalse(New SomeClass) And False = True Then,也会是带有此bug的True。
发布于 2021-08-05 02:34:35
你不能做比你已经做的更多的事情,除非你想直接或单独接触技术开发人员,并冒着被列入烦人名单的风险,这并不一定会帮助你真正解决问题的机会。
Uservoice正在走向废料堆,但它仍然得到产品开发团队的注意和使用,包括现在的2021年。
VBA不是当前可编程性开发的重点,所以我不太相信这会使它成为优先级队列。
https://stackoverflow.com/questions/68034271
复制相似问题