This bug is not present on 32-bit, but it seems to be present in 64-bit VBA-capable applications (I’ve tried Excel, Word, and AutoCAD).
Since the question already covers what happens if the Object does not get terminated or if there is no Class_Terminate
event, the following examples all use an Object that will surely go out of scope and we also assume there is a Class_Terminate
that gets called:
Option Explicit
#If Win64 Then
Sub Bug()
' We don't really need a Clone method to reproduce the bug
If Falsee(New cClass) Then
Debug.Print "This does print, although it shouldn't!"
End If
' If we add a logical operator and a second method call then the bug disappears:
If Falsee(New cClass) Or Falsee(New cClass) Then
Debug.Print "This doesn't print, as it shouldn't."
End If
' It could be any other method. The order of the methods also doesn't matter
If Falsee(New cClass) Or Sin(0) Then
Debug.Print "This doesn't print, as it shouldn't."
End If
' The above workaround does not work if we simply use a boolean value after the method call
If Falsee(New cClass) Or False Then
Debug.Print "This does print, although it shouldn't!"
End If
' But it does work if we add the boolean before the method call:
If False Or Falsee(New cClass) Then
Debug.Print "This doesn't print, as it shouldn't."
End If
If True And Falsee(New cClass) Then
Debug.Print "This doesn't print, as it shouldn't."
End If
End Sub
Function Falsee(oClass As cClass) As Boolean
Falsee = False
End Function
#End If