首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何修复这个8岁的VBA 64位编译器错误?

如何修复这个8岁的VBA 64位编译器错误?
EN

Stack Overflow用户
提问于 2021-06-18 11:22:03
回答 2查看 13.9K关注 0票数 58

下面是一个bug:在64位 VBA主机(例如Access 365 64位或Excel2016 64位)中创建类模块SomeClass

代码语言:javascript
运行
复制
' this needs to be here to trigger the bug: 
Private Sub Class_Terminate()
End Sub

然后是一些模块Test

代码语言:javascript
运行
复制
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主机,并在立即窗口中运行“测试”,则会显示预期的结果:

代码语言:javascript
运行
复制
False
False

但是,如果您使用的是64位 VBA主机,则如下所示:

代码语言:javascript
运行
复制
False
True

但是,当您移除或重命名Class_Terminate()子时,则会出现正确的输出。

我跟踪了这个bug,直到这个最小的例子。显然,问题似乎是,使用一个临时对象(这里的new SomeClass)以某种方式破坏了IF条件的计算,使得条件的值似乎是True,而不管什么。

好的,这是一个严重的错误,因为64位编译器是疯狂的,所有的IF都有麻烦。

全是IF?那WHILE

代码语言:javascript
运行
复制
While ReturnFalse(New SomeClass)
 Debug.Print "Oh no!"
Wend

是的,WHILE也有麻烦,因为这个打印“哦,不!”在一个循环中。

这是一个很大的麻烦,我可以到处复制:

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位

当然,..And也在Excel中。

摘要:我可以在我所有版本的Office中找到这个bug,从2013年开始,它可能至少有8年历史了。

好吧,这个虫子以前影响过其他人吗?是:

去年的这篇文章:

VBA takes wrong branch at If-statement - severe compiler bug?

这篇文章发表于2018年10月的excel.uservoice.com (这显然是微软的用户建议框)。

https://excel.uservoice.com/forums/304921-excel-for-windows-desktop-application/suggestions/35735881-fix-inlined-member-calls-on-user-objects-on-64-bi

好吧,那么让我们提交一份错误报告。

https://answers.microsoft.com/en-us/msoffice/forum/msoffice_excel-mso_mac-mso_mac2016/how-do-i-report-vba-bugs/bb4e5dea-9996-4232-9b5b-7dd57f76736c

如果在与其他人进行测试之后,代码失败了,而且它真的不应该,您可以使用

中的微笑按钮直接向微软报告这个问题。

什么?

https://answers.microsoft.com/en-us/msoffice/forum/msoffice_excel-mso_win10-mso_2016/excel-2016-vba-bug/b799dfc2-7cef-417d-8a41-96661a360c43

打开Excel >文件>反馈>发送一个Frown

这不是一个新的图标配色方案的建议。这是一个有8年历史的bug,它让带有宏的Access应用程序和Excel工作表计算错误的答案(而且它还阻止迁移到Office 64,因为我们无法取出代码)。

下面是我的问题:

更新:X-张贴到

https://answers.microsoft.com/en-us/msoffice/forum/msoffice_excel-msoffice_custom-mso_2019/invalid-code-by-vba-64-bit-compiler/b91f984a-194c-4453-b8c5-02881afaf83b

更新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版本是否也被修复了。

EN

回答 2

Stack Overflow用户

发布于 2021-08-03 14:47:33

代码语言:javascript
运行
复制
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

返回

代码语言:javascript
运行
复制
False
True
False

所以If True = ReturnFalse(New SomeClass) Then修复了它

对于循环,它也修复了它。

代码语言:javascript
运行
复制
Do While True = ReturnFalse(New SomeClass)
    Debug.Print "Oh no!"
    Exit Do
Loop

强烈建议对上述解决方案的每一个使用进行评论,以便以后没有人删除该True = (例如。因为他在32位发展,甚至没有遇到这个问题)。

代码语言:javascript
运行
复制
' 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

票数 30
EN

Stack Overflow用户

发布于 2021-08-05 02:34:35

你不能做比你已经做的更多的事情,除非你想直接或单独接触技术开发人员,并冒着被列入烦人名单的风险,这并不一定会帮助你真正解决问题的机会。

Uservoice正在走向废料堆,但它仍然得到产品开发团队的注意和使用,包括现在的2021年。

VBA不是当前可编程性开发的重点,所以我不太相信这会使它成为优先级队列。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68034271

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档