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.