Regel / Hinweis
Wenn ein Select-Case-Statement verwendet wird, sollte man immer auch einen Case-Else-Zweig einfügen. Ansonsten kann es unbemerkt zu ungewollten Ergebnissen kommen.
Erläuterung
Der nachfolgende Code wandelt einen String abhängig von dessen Länge in einen Datumswert um:
Function fncDatumLesen(strWert As String) As Date '7 Stellig - 1090602 = 02.06.2009 '6 Stellig - 980225 = 25.02.1998 Dim lngDay As Long Dim lngMonth As Long Dim lngYear As Long
lngDay = CLng(Right(strWert, 2)) Select Case Len(strWert) Case 6 lngMonth = CLng(Mid(strWert, 3, 2)) lngYear = CLng("19" & Left(strWert, 2)) Case 7 lngMonth = CLng(Mid(strWert, 4, 2)) lngYear = CLng("20" & Mid(strWert, 2, 2)) End Select
fncDatumLesen = DateSerial(lngYear, lngMonth, lngDay)
End Function
Wenn man einen String an diese Funktion übergibt, der nicht 6 oder 7 Zeichen lang ist, kommt es zu einem unerwarteten Ergebnis. Bei der Eingabe "11111" erhält man als Ergebnis das Datum "11.12.1999". Die kann so nicht gewollt sein.
Wenn man einen Case-Else-Zweig einfügt und dort einen Fehler wirft, kann es nicht mehr zu diesem ungewollten Ergebnis kommen:
Function fncDatumLesen(strWert As String) As Date '7 Stellig - 1090602 = 02.06.2009 '6 Stellig - 980225 = 25.02.1998 Dim lngDay As Long Dim lngMonth As Long Dim lngYear As Long
lngDay = CLng(Right(strWert, 2)) Select Case Len(strWert) Case 6 lngMonth = CLng(Mid(strWert, 3, 2)) lngYear = CLng("19" & Left(strWert, 2)) Case 7 lngMonth = CLng(Mid(strWert, 4, 2)) lngYear = CLng("20" & Mid(strWert, 2, 2))
Case Else
Err.Raise vbObjectError, "fncDatumLesen", "Länge der Zeichenfolge " & _
"wird nicht unterstützt."
End Select
fncDatumLesen = DateSerial(lngYear, lngMonth, lngDay)
End Function
Bei diesem Code führt die Übergabe einer 5-stelligen Zeichenfolge zu einem Fehler. Es kann also nicht mehr passieren, dass versehentlich mit einem ungewollten Wert weitergearbeitet wird.
Die Regel, kein Select-Case-Statement ohne Case-Else-Zweig einzufügen, sollte man auch anwenden, wenn im Case-Else-Zweig kein Code zur Ausführung kommt:
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
Select Case KeyCode Case vbKeyCancel KeyCode = 0 Case Else 'Do Nothing End Select
End Sub
Auf diese Weise macht der Code deutlich, dass der Case-Else-Zweig nicht einfach vergessen wurde sondern das es dort nichts zu tun gibt.
Ergänzende Informationen
- - -