Nor*_*ame 58 excel 64-bit ms-access vba class-terminate
所以这是错误:在64 位VBA 主机(例如 Access 365 64 位或 Excel 2016 64 位)中创建一个类模块SomeClass
:
' this needs to be here to trigger the bug:
Private Sub Class_Terminate()
End Sub
Run Code Online (Sandbox Code Playgroud)
然后是一些模块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
Run Code Online (Sandbox Code Playgroud)
现在,如果您使用的是32 位VBA 主机并在即时窗口中运行“测试” ,则会显示预期结果:
False
False
Run Code Online (Sandbox Code Playgroud)
但是,如果您使用的是64 位VBA 主机,则会出现:
False
True
Run Code Online (Sandbox Code Playgroud)
除了,当您删除或重命名Class_Terminate()
sub 时,在这种情况下会出现正确的输出。
我已经将错误追踪到这个最小的例子。显然,问题似乎是,使用临时对象(new SomeClass
此处)IF
以某种方式破坏了条件的评估,使条件的值看起来True
无关紧要。
好吧,这是一个严重的错误,因为 64 位编译器很疯狂,而且都IF
遇到了麻烦。
所有IF
?怎么样WHILE
?
While ReturnFalse(New SomeClass)
Debug.Print "Oh no!"
Wend
Run Code Online (Sandbox Code Playgroud)
是的,WHILE
也有麻烦,因为这会打印“哦不!” 在一个循环中。
这很麻烦,我可以在任何地方重现它:
..当然还有Excel。
摘要:从 2013 年开始,我可以在我拥有的所有版本的 Office 中找到此错误,并且它可能至少已有 8 年的历史。
好的,这个错误以前影响过其他人吗?是的:
去年的这个帖子:
VBA 在 If 语句中采用错误的分支 - 严重的编译器错误?
2018 年 10 月在 excel.uservoice.com(显然是 Microsoft 的用户意见箱或其他内容)中的这篇文章:
好的,让我们提交错误报告。
如果在与其他人一起测试后,代码失败并且确实不应该,您可以使用 Excel 中的“微笑”按钮直接向 Microsoft 报告问题。
什么?
- 打开 Excel > 文件 > 反馈 > 发送一个皱眉
- 通过 Uservoice - 点击以下链接查看其他人的反馈并提供反馈 - https://excel.uservoice.com/
这不是对新图标配色方案的建议。这是一个 8 年前的错误,它使 Access 应用程序和带有宏的 Excel 工作表计算出错误的答案(并且它还阻止迁移到此处的 Office 64,因为我们无法获取我们的代码)。
现在这是我的问题:
更新:x 发布到
更新 2:
我有机会在 Office 365 for Mac 安装(其中 Win64 定义为true
)上尝试代码,但错误没有出现在那里。所以它现在是 PC 的事情。
更新 3:
Post 已发送至 HN 和 The Register:
https://www.theregister.com/2021/08/19/64_bit_microsoft_vba_bug/ https://news.ycombinator.com/item?id=28188251
Pᴇʜ*_*Pᴇʜ 30
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
Run Code Online (Sandbox Code Playgroud)
退货
False
True
False
Run Code Online (Sandbox Code Playgroud)
所以If True = ReturnFalse(New SomeClass) Then
修复它
对于循环,这也修复了它
Do While True = ReturnFalse(New SomeClass)
Debug.Print "Oh no!"
Exit Do
Loop
Run Code Online (Sandbox Code Playgroud)
强烈建议对上述解决方法的每一种用法进行评论,以便True =
将来没有人删除它(例如,因为他是在 32 位开发的,甚至没有遇到问题)。
' Don't remove `True =` due to a compiler bug in x64 the condition would always be true.
' See /sf/ask/4762399001/
If True = ReturnFalse(New SomeClass) Then
Run Code Online (Sandbox Code Playgroud)
甚至If ReturnFalse(New SomeClass) And False = True Then
会出现True
这个错误。
归档时间: |
|
查看次数: |
13224 次 |
最近记录: |