2016-03-23 6 views
0

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!

+1

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. –

+0

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

+0

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

Antwort

0

Und ja, ich fand eine Antwort auf meine Frage, in Catia, habe ich VBA Version 7.1.1033, die nicht wie erwartet funktioniert, während das gleiche Stück Code in Excel funktioniert, die neuere VBA-Version verwendet , 1049.01.07 ...

So Antwort ist, hat VBA Fehler in dieser Veröffentlichung ..