Startseite > Tipps & Tricks > Regeln und Hinweise für gutes VBA > Kein Select Case ohne Case Else
Team-Moeller.de - Datenbankentwicklung und mehr ...

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

- - -

Microsoft MVP - Thomas Möller


02.10.2020:
TM-AbhängigeObjekte
Version 4.03 bereitgestellt.


06.11.2019:
TM VBA-Inspector:
Lösung für Installationsproblem dokumentiert.


06.05.2017:
TM-VBALineNumbers
Version 1.29.01 bereitgestellt.


27.03.2016:
TM VBA-Inspector:
Installationsroutine überarbeitet.


23.05.2014:
TM-RebuildDatabase
Version 1.75 bereitgestellt.


Powered by CMSimple - Template by CMSimple-Styles.com - Autor:Thomas Möller