programing

8년 된 이 VBA 64비트 컴파일러 버그를 어떻게 고칠 수 있습니까?

yellowcard 2023. 5. 25. 21:40
반응형

8년 된 이 VBA 64비트 컴파일러 버그를 어떻게 고칠 수 있습니까?

여기 버그가 있습니다.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 호스트를 사용하고 있고 바로 옆 창에서 "테스트"를 실행하면 예상 결과가 표시됩니다.

False
False

그러나 64비트 VBA 호스트를 사용하는 경우 다음과 같은 결과가 나타납니다.

False
True

예외로, 다음을 제거하거나 이름을 변경할 수 없습니다.Class_Terminate()이이 나타납니다 이 경우 올바른 출력이 나타납니다.

저는 이 최소한의 예까지 그 버그를 추적했습니다.목적어를 하는 것 new SomeClass는 여의평어다니깁가의 .IF식으로든 이 어게든조, 조의값이인 것.True무슨 일이 있어도

요, bonkers이기 입니다, 64비트 컴파일러는 bonkers입니다. 64비트 컴파일러는 bonkers입니다.IF곤경에 처해 있습니다.

든모.IF?WHILE?

While ReturnFalse(New SomeClass)
 Debug.Print "Oh no!"
Wend

네.WHILE"오 안돼!"를 반복적으로 인쇄하기 때문에 문제가 있습니다.

그것은 많은 문제이고 저는 그것을 어디에서나 재현할 수 있습니다.

  • Microsoft® Access® für Microsoft 365 MSO(16.0.14026.20294) 64비트
  • Microsoft Access 2016 MSO(16.0.9029.2167) 64비트
  • Microsoft Access 2013(15.0.4420.1017) MSO(15.0.4420.1017) 64비트

..그리고 물론 엑셀에도 있습니다.

요약:.저는 2013년부터 제가 가지고 있는 모든 버전의 오피스에서 이 버그를 발견할 수 있었고 아마도 최소 8년 이상 된 것 같습니다.

좋아요, 이 벌레가 이전에 다른 사람들에게 영향을 미쳤나요?예:

작년 이 게시물:

VBA는 If-statement에서 잘못된 분기를 가져갑니다 - 심각한 컴파일러 버그?

2018년 10월부터 excel.uservoice.com 에 게시된 이 게시물(Microsoft의 사용자 제안 상자 등):

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

다른 사용자와 테스트한 후 코드가 실패하고 실제로 실패해서는 안 되는 경우 Excel의 스마일 버튼을 사용하여 문제를 Microsoft에 직접 보고할 수 있습니다.

뭐라고?

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

  1. 엑셀 열기 > 파일 > 피드백 > 찡그린 얼굴 보내기
  2. 사용자 목소리를 통해 - 다른 사용자의 피드백을 확인하고 피드백을 제공하려면 다음 링크를 클릭하십시오. - https://excel.uservoice.com/

이것은 새 아이콘 색상표에 대한 제안이 아닙니다.이 버그는 8년 전의 버그로, 매크로가 있는 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는 Office 365로 가 있었습니다.true) 그리고 벌레는 거기에 나타나지 않습니다.그래서 지금은 PC와 같은 것입니다.

업데이트 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) Office 365를 확인했는데 이제 버그리스트가 사라졌습니다!누군가가 주의를 기울인 것 같습니다.하지만 올해 받은 수많은 누적 업데이트 중 어떤 것이 속임수를 썼는지 알 수 없으며 다른 오피스 버전도 수정되었는지는 아직 모릅니다.

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되지요True이 벌레와 함께.

기술 개발자에게 직접 또는 개별적으로 연락하여 성가신 목록에 오르는 위험을 감수하지 않는 한, 이미 수행한 작업 이상의 작업을 수행할 수 없습니다. 이는 실제로 해결할 수 있는 기회에 반드시 도움이 되지는 않습니다.

사용자 음성은 스크랩 힙으로 향하지만 2021년 현재를 포함하여 제품 개발 팀에서 여전히 주목받고 사용되고 있습니다.

VBA는 현재 프로그래밍 가능성 개발에 초점을 맞추고 있지 않기 때문에 우선 순위 대기열에 도달할 수 있을지 확신할 수 없습니다.

언급URL : https://stackoverflow.com/questions/68034271/how-can-i-get-this-8-year-old-vba-64-bit-compiler-bug-fixed

반응형