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의 사용자 제안 상자 등):
좋아요, 그럼 버그 보고서를 제출해요.
다른 사용자와 테스트한 후 코드가 실패하고 실제로 실패해서는 안 되는 경우 Excel의 스마일 버튼을 사용하여 문제를 Microsoft에 직접 보고할 수 있습니다.
뭐라고?
- 엑셀 열기 > 파일 > 피드백 > 찡그린 얼굴 보내기
- 사용자 목소리를 통해 - 다른 사용자의 피드백을 확인하고 피드백을 제공하려면 다음 링크를 클릭하십시오. - https://excel.uservoice.com/
이것은 새 아이콘 색상표에 대한 제안이 아닙니다.이 버그는 8년 전의 버그로, 매크로가 있는 Access 앱과 Excel 시트가 오답을 계산하게 합니다(또한 여기서는 코드를 꺼낼 수 없기 때문에 Office 64로의 마이그레이션을 차단합니다).
이제 제 질문은 이렇습니다.
- 이 버그를 어떻게 고칠 수 있습니까?
- SLA가 상당히 인상적이거나 더 나은 관계를 가진 사람이 제 요청을 지원할 수 있습니까?
- VBA 버그를 직접 보고할 수 있는 방법이 있습니까?(이는 현재 64비트 VBA에 더 많은 버그가 있는 것으로 의심되기 때문입니다.)
- 사용자 음성으로 새 보고서를 만들었습니다.당신은 그것이 투표에 부쳐질 수 있다고 생각합니까?https://access.uservoice.com/forums/319956-access-desktop-application/suggestions/43660329-fix-this-64-bit-vba-compiler-bug-temporary-object
업데이트: x-게시 대상
업데이트 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
'programing' 카테고리의 다른 글
Windows에서 Git Bash의 기본 위치를 변경하려면 어떻게 해야 합니까? (0) | 2023.05.25 |
---|---|
Git 콘솔을 어떻게 색칠합니까? (0) | 2023.05.25 |
Postgres의 기존 열에 'serial' 추가 (0) | 2023.05.25 |
특정 커밋 제거 (0) | 2023.05.25 |
두 리포지토리 간의 차이 파악 (0) | 2023.05.25 |