PDA

Vollständige Version anzeigen : Select Case und IF THEN ELSE Anweisung


Frozen_Heaven
30.06.2014, 13:08
Hallo Leute,

ich bin noch VBA Anfänger und habe gerade ein mir unerklärliches Phänomän vor mir :-)

Ich habe versucht den selben Code einmal mit der Methode select case und einmal mit einer if then else Anweisung zu schreiben.

Jedoch bekomme ich unterschiedliche Ergebnisse.

Hier die select case Lösung:



If (strFrom <= strTime) And (strTime < strTo) Then
Select Case strStatus
Case "eingeschränkt verfügbar", "Leerlauf
dblMin = Cells(Row, ColumnStatus + 5)
dblMax = Cells(Row, ColumnStatus + 6)
Case "nicht verfügbar"
dblMin = 0
dblMax = 0
Case "in Planung"
dblMin = 1
dblMax = 1
End Select
End if


Und hier die Lösung mit If then else:


If (strFrom <= strTime) And (strTime < strTo) And Status = "eingeschränkt verfügbar" Then
dblMin = Cells(Row, ColumnStatus + 5)
dblMax = Cells(Row, ColumnStatus + 6)
ElseIf (strFrom <= strTime) And (strTime < strTo) And Status = "Leerlauf" Then
dblMin = Cells(Row, ColumnStatus + 5)
dblMax = Cells(Row, ColumnStatus + 6)
ElseIf (strFrom <= strTime) And (strTime < strTo) And Status = "nicht verfügbar" Then
dblMin = 0
dblMax = 0
ElseIf (strFrom <= strTime) And (strTime < strTo) And Status = "in Planung" Then
dblMin = 1
dblMax = 1
End If



Der Code mit der Select Case Lösung liefert das richtige Ergebniss.

Habe ich da irgendetwas falsch gemacht?

LG Frank

Mc Santa
30.06.2014, 13:22
Hallo,

ich würde bei Select bleiben, das ist besser zu lesen.

Bei IF hast du die Variable falsch angesprochen:
If (strFrom <= strTime) And (strTime < strTo) And strStatus = "eingeschränkt verfügbar" Then
dblMin = Cells(Row, ColumnStatus + 5)
dblMax = Cells(Row, ColumnStatus + 6)
ElseIf (strFrom <= strTime) And (strTime < strTo) And strStatus = "Leerlauf" Then
dblMin = Cells(Row, ColumnStatus + 5)
dblMax = Cells(Row, ColumnStatus + 6)
ElseIf (strFrom <= strTime) And (strTime < strTo) And strStatus = "nicht verfügbar" Then
dblMin = 0
dblMax = 0
ElseIf (strFrom <= strTime) And (strTime < strTo) And strStatus = "in Planung" Then
dblMin = 1
dblMax = 1
End If


Um das zu verhindern, benutze
Option Explicit
ganz oben in deinem Code. So kannst du nicht mehr Varibalen benutzen, die du vorher nicht deklariert hast und solche Fehler fallen eher auf.

Hilft dir das?
Vg

Frozen_Heaven
30.06.2014, 13:33
Hallo,

du hast recht, danke! Ich hab den code angepasst aber leider liefert er mir immer noch nicht das selbe Ergebniss.

Ich möchte den Code nachher noch gerne erweitern indem ich mehrere IF THEN Else Blöcke inneinander schachtle. In der Select Case Lösung kann ich ja bei den einzelnen Cases keine IF THEN ELSE Anweisungen mehr einbauen oder?
Zumindest bekomme ich dann immer eine Fehlermeldung

Mc Santa
30.06.2014, 13:39
Hallo,

spontan finde ich keinen weitren Fehler, kannst du eine Datei hochladen, an der man die unterschiedlichen Ergebnisse sieht?

Außerdem:
Du kannst in einen einzelen Case fast alles schreiben, auch weitere IF-ELSE und sogar weitere Select Case. Falls du dabei Probleme hast, dann poste hier deine Codeversuche :)

VG

Frozen_Heaven
30.06.2014, 13:54
Da hab ich wohl vorhin was falsch gemacht. :-)
Fehlermeldung bekomme ich jetzt keine mehr wenn ich die IF Anweisung in den Select Case Block einbaue.
Irgendwie stimmt aber da noch was nicht ganz.

Hier mal mein Code:


If (strFrom <= strTime) And (strTime < strTo) Then
Select Case strStatus
Case "eingeschränkt verfügbar", "auf PRL"
dblMin = WsERF.Cells(intErfRow, intErfColumnStatus + 5)
dblMax = WsERF.Cells(intErfRow, intErfColumnStatus + 6)
If strTime = strTo Then
Free = 1
End If
Case "unverfügbar"
dblMin = 0
dblMax = 0
If strTime = strTo Then
Free = 1
End If
Case "geplant"
dblMin = 1
dblMax = 1
If strTime = strTo Then
dblMin = 0
dblMax = 0
End If
End Select


In einer andere Stelle werden die Werte in den Variablen in ein Tabellenblatt geschrieben:


WsVOR.Cells(intVorRow, intVorColumn) = dblMax
WsVOR.Cells(intVorRow, intVorColumn + 1) = dblMin
WsVOR.Cells(intVorRow, intVorColumn + 2) = pubNullIdentifier
WsVOR.Cells(intVorRow, intVorColumn + 3) = Free


Irgend wie werden die Werte die in den IF Anweisungen in die Variablen geschrieben werden nicht im Tabellenblatt ausgegeben (z.B. 1 für Free)
Woran kann das liegen?

Mc Santa
30.06.2014, 14:08
If (strFrom <= strTime) And (strTime < strTo) Then
Select Case strStatus
Case "eingeschränkt verfügbar", "auf PRL"
dblMin = WsERF.Cells(intErfRow, intErfColumnStatus + 5)
dblMax = WsERF.Cells(intErfRow, intErfColumnStatus + 6)
If strTime = strTo Then
Free = 1
End If
Case "unverfügbar"
dblMin = 0
dblMax = 0
If strTime = strTo Then
Free = 1
End If
Case "geplant"
dblMin = 1
dblMax = 1
If strTime = strTo Then
dblMin = 0
dblMax = 0
End If
End Select



Schau mal: Zunächst prüfst du, ob strTime kleiner ist als strTo. Wenn du also jetzt innerhalb dieser Abfrage prüfst, ob strTime gleich strTo ist, dann ist das nie erfüllt.

Was mir zusätzlich aufällt: sind in deinen Variablen tatsächlich Texte enthalten? Dann macht Ein kleiner-als-Vergleich vermutlich keinen Sinn, denn
7 < 12 ergibt wahr, wenn 7 und 12 zahlen sind, aber
"12" < "7" ergibt wahr, weil die zahlen nun als text verglichen werden.

Hilft dir das?
VG

Frozen_Heaven
30.06.2014, 14:14
Ah. Das klingt logisch. Vielen Dank!

In den Variablen sind Datums- und Uhrzeitangaben im Format TTMMJJJJhhmm.

Wie könnte ich das Problem denn lösen? Hättest du da vielleicht einen Vorschlag?

VG

Frozen_Heaven
30.06.2014, 14:19
Ich habe es jetzt mal so probiert, jedoch auch ohne Erfolg:


If (strFrom <= strTime) And (strTime < strTo) Then
Select Case strStatus
Case "eingeschränkt verfügbar", "auf PRL"
dblMin = WsERF.Cells(intErfRow, intErfColumnStatus + 5)
dblMax = WsERF.Cells(intErfRow, intErfColumnStatus + 6)
Case "unverfügbar"
dblMin = 0
dblMax = 0
Case "geplant"
dblMin = 1
dblMax = 1

End Select


If strTime = strTo Then
Select Case strStatus
Case "eingeschränkt verfügbar", "auf PRL", "unverfügbar"
Free = 1
Case "geplant"
dblMin = 0
dblMax = 0
Case Else
Free = ""
End Select

Mc Santa
30.06.2014, 14:26
Hallo,

also von der Syntax her finde ich jetzt keinen Fehler, warum es nicht ganz funktioniert, ist schwierig zu sagen, da ich ja gar nicht weiß, wie es "richtig" ist.

Ich vermute, dass dein Vergleich der Variablen falsch ist. Speichere ein Datum als Typ Date ab, dann kannst du auch vergleichen, ob ein Datum vor oder nach einem anderen liegt.

Bitte erstelle mal ein vereinfachtes Beispiel deiner Datei und lade sie hier im Forum hoch.

VG

haklesoft
30.06.2014, 14:29
Hallo Frank,

in Deinen Case-Varianten stellst Du auf strStatus ab; in Deiner If-Variante ist es aber nur Status. Zwei Variablen für den selben Vergleich heranzuziehen kann durchaus zu unterschiedlichen Ergebnissen führen.