Leider manchmal, wenn die if-Anweisungen komplexer sind, Verhalten ziemlich seltsam ist, hier eine Kopie der Linie ist, die nicht funktioniert, als wenn wie diesescatvba, falsch-positive if-Anweisung
If someFunction(arg1, arg2, CreatedFromClass(arg3, arg4, arg5)) Then GoTo err1
somefunction verwendet erwartet (...) selbst hat einen langen Rückgabetyp, wird aber in diesem Fall absolut immer als positiv gewertet, obwohl someFunction vor Rückgabe 0 als Rückgabewert enthält.
so kann es als eine der verpackenden folgende und Ergebnis wird immer wahr
If someFunction() = True Then
If someFunction() = False Then
If someFunction() = 0 Then
If someFunction() = 1 Then
If someFunction() <> 0 Then
If someFunction() <> 1 Then
If Not someFunction() = 0 Then
If Not someFunction() = 1 Then
If (someFunction() = 0) = False Then
If (someFunction() = 0) = True Then
If CBool(someFunction() = 0) = True Then
If CBool(someFunction() = 1) = True Then
aber wenn in Segmente aufgeteilt wird, und manuell die Variablen zugewiesen, dann wie erwartet funktioniert
Dim rVal As Long
rVal = someFunction(arg1, arg2, CreatedFromClass(arg3, arg4, arg5))
If rVal Then GoTo err1
Frage ist natürlich, warum das Verhalten nicht das gleiche ist? Hat jemand Ähnliches erlebt?
Zusätzlich, nach paar Stunden, konnte ich problematische Stück Code isolieren!
Klasse: cls.cls
Option Explicit
Private mCol As Collection
Private Sub Class_Initialize()
Set mCol = New Collection
End Sub
Private Sub Class_Terminate()
Set mCol = Nothing
End Sub
Public Sub Add(iItem)
mCol.Add iItem
End Sub
Public Function DoCopy() As cls
Set DoCopy = New cls
Dim i As Long
For i = 1 To mCol.Count
DoCopy.Add mCol(i)
Next
End Function
und Testmodul
Option Explicit
Public Function CreateCls(ParamArray params()) As cls
Set CreateCls = New cls
If UBound(params) < 0 Then Exit Function
Dim i As Long
For i = LBound(params) To UBound(params)
CreateCls.Add params(i)
Next
End Function
Private Function doTest(iCls As cls) As Long
doTest = 0
End Function
Private Sub CATStart()
Dim x As cls
Set x = CreateCls("param1", "param2", "param3", "param4")
If doTest(x.DoCopy) = 0 Then Debug.Print "long_0"
If doTest(x.DoCopy) = 1 Then Debug.Print "long_1"
If CBool(doTest(x.DoCopy)) = True Then Debug.Print "bool_True"
If CBool(doTest(x.DoCopy)) = False Then Debug.Print "bool_False"
Set x = Nothing
End Sub
Und natürlich alle von ihnen werden als wahre gültig und Ergebnis ausgedruckt ausgewertet werden!
Das Verhalten gut definiert ist. Ich würde sagen, dass in Ihrem Fall einigeFunktion einen Fehler auslöst und dass Sie vorher einen OnError Resume Next haben. Ohne ein reproduzierbares Beispiel ist dies das einzige, was für das Verhalten, das Sie beschreiben, sinnvoll ist. –
Folgen Sie Florent B und vermeiden Sie 'On Error Resume Next' um jeden Preis. Wenn Sie es verwenden müssen, legen Sie es in eine sehr spezielle Funktion mit umfassenden Kommentare, warum es wirklich wirklich benötigt wird. Ansonsten nehmen Sie die Einstellung an, dass es nie einen guten Grund für "On Error Resume Next" gibt. Es führt zu seltsamen Dingen wie diesem. – rskar
Ich stimme völlig zu, und ich hasse und nicht On Error Resume Next verwenden, wenn nicht unmöglich zu vermeiden (3rd Party Stuff) und selbst dann ist sehr gut strukturierten Code um es .. auch diese goto err1 ist nicht Fehler Handler, seine nur Handler für verschiedene Rückgabewerte, reine Longs (c-Stil gibt zurück) – tsolina