Seite 1 von 1

Warum kompiliert das überhaupt? LO 7.3.7.2

Verfasst: Sa 15. Jun 2024, 20:46
von Basilisk
Das sollte eine recht überschaubare Funktion sein, die textuell zurückgibt, in welchem Bereich eine Zahl liegt.

Code: Alles auswählen

Sub Main
MsgBox CC(0)
End Sub

Function CC(l As Long) As String
Dim s1 As String
If l <= 0 Then
    s1 = "l <= 0"
Else If l > 1 Then
    s1 = "l > 1"
Else
    s1 = "Else"
End If
MsgBox s1
CC = s1
End If
End Function
Ja, da sind zwei Zeilen mit "End If". Kommentiere ich eines davon aus, kompiliert es nicht mehr, sonder beschwert sich, dass End Function ein unerwartetes Symbol ist. Startet man den Testlauf mit Main, verhält es sich, als wäre das erste "End If" gar nicht vorhanden. Macht man den Test mit 1 statt 0, so scheint alles zu funktionieren. Ich habe das ganze aus einem größeren Programm, dass sich erratisch verhielt, auf das hier eingedampft. Hier scheint der Fehler zu liegen, aber welcher? Wo?

Ich starre jetzt schon über eine Stunde mal hierauf und mal hierauf. Ich komme nicht dahinter.

Kann jemand das Phänomen nachvollziehen?

Re: Warum kompiliert das überhaupt? LO 7.3.7.2

Verfasst: Sa 15. Jun 2024, 22:23
von karolus
Hallo
Einbuchstabige Symbole sind meistens schlecht, ein l als Symbol ist aber beschissen schlecht, weil es leicht mit I (GROSSES i) oder gar mit der 1 (eins ) verwechselt werden kann

In deiner Funktion gibts zwei if…then ergo müssen da auch zwei end ifs sein!

Code: Alles auswählen

Function CC( number As Long) As String
    If  number <= 0 Then
        CC = "number<= 0"
    exit function
    end if
    If  number >  1 Then
 	CC = "number > 1"
    exit function
    end if	
    CC = "Else"
End Function
Du solltest aber sowas gleich mit select case ……end select erschlagen:

Code: Alles auswählen

Function CC( number As Long) As String
    select case number
        case <=0
            CC = "number <= 0"
         case <= 1 
            CC = "Else"
         case Else
             CC = "number > 1"
    end select
End Function

Re: Warum kompiliert das überhaupt? LO 7.3.7.2

Verfasst: Sa 15. Jun 2024, 23:10
von Basilisk
karolus hat geschrieben:
Sa 15. Jun 2024, 22:23
Einbuchstabige Symbole sind meistens schlecht, ein l als Symbol ist aber beschissen schlecht, weil es leicht mit I (GROSSES i) oder gar mit der 1 (eins ) verwechselt werden kann
Ok, aber das scheint hier nicht das Problem zu sein.

Code: Alles auswählen

Sub Main
MsgBox CC(1)
End Sub

Function CC(x As Long) As String
Dim s1 As String
If x <= 0 Then
    s1 = "x <= 0"
Else If x > 1 Then
    s1 = "x > 1"
Else
    s1 = "Else"
End If
MsgBox s1
CC = s1
End If
End Function
karolus hat geschrieben:
Sa 15. Jun 2024, 22:23
In deiner Funktion gibts zwei if…then ergo müssen da auch zwei end ifs sein!
Das "If x > 1 Then" ist aber Teil eines "Else If x > 1 Then" und dieses Konstrukt hat doch laut Hilfe

Code: Alles auswählen

If condition Then
    statements
[{ElseIf|Else If} expression Then
    statements]
[Else
    statements]
{EndIf|End If}
nur ein End If. Es ist kein weiterer If ... Then Block innerhalb eines statements eines äußeren If ... Then Blocks und es sind auch keine hintereinandergeschalteten If ... Then Blocks, oder überseh ich da was?

Außerdem habe ich inzwischen entdeckt, dass alles wie erwartet geht, wenn man das Leerzeichen zwischen Else und IF im Else If ... Then löscht.

Code: Alles auswählen

Function CC(x As Long) As String
Dim s1 As String
If x <= 0 Then
    s1 = "x <= 0"
ElseIf x > 1 Then
    s1 = "x > 1"
Else
    s1 = "Else"
End If
MsgBox s1
CC = s1
End Function
Es scheint, als wäre die Behauptung aus der Hilfe "Instead of Else If you can write ElseIf, ..." falsch.
karolus hat geschrieben:
Sa 15. Jun 2024, 22:23
Du solltest aber sowas gleich mit select case ……end select erschlagen:
Danke. Das hab ich im Produktivcode gemacht, weil hier keiner Zeit hat, bis ich meine akademischen Rätsel löse. Trotzdem verunsichert mich das.

Re: Warum kompiliert das überhaupt? LO 7.3.7.2

Verfasst: So 16. Jun 2024, 09:37
von karolus
Hallo
nur ein End If. Es ist kein weiterer If ... Then Block innerhalb eines statements eines äußeren If ... Then Blocks und es sind auch keine hintereinandergeschalteten If ... Then Blocks, oder überseh ich da was?
Du übersiehst daß für den inneren [else if|if] … then Block die gleichen Regeln gelten wie für den if … then Block aussenrum!

der Unterschied zwischen else if und elseif besteht darin daß du bei letzterem nicht seperat mit end if abschliessen darfst|musst!

Re: Warum kompiliert das überhaupt? LO 7.3.7.2

Verfasst: Mi 3. Jul 2024, 16:54
von Basilisk
karolus hat geschrieben:
So 16. Jun 2024, 09:37
der Unterschied zwischen else if und elseif besteht darin daß du bei letzterem nicht seperat mit end if abschliessen darfst|musst!
So scheint es, aber es ist trotzdem unbefriedigend, dass in der Dokumentation Quatsch steht.