Kein Select Case ohne Case Else

Kein Select Case ohne Case Else

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

- - -