Switch- und Choose Funktion

Stand: Dezember 2004, überarbeitet November 2007

Fotos von der letzten Familienfeier und man fragt sich: Wer der/die/das Verwandte wieder war!?

Tante Choose und Onkel Switch gehts eigentlich ähnlich. Keiner kennt sie richtig und sprechen tut auch keiner mit ihnen.

Beide gehören zu der Familie der einzeiligen Kontrollstrukturen. Das folgende Beispiel zeigt eine Möglichkeit, wie beide eingesetzt werden könnten.

Die Choose-Funktion wählt anhand eines vorgegebenen Index einen Wert aus einer Liste von Wahlmöglichkeiten aus und gibt diesen zurück.

Syntax:Choose(Index, Auswahl-1[, Auswahl-2, ... [, Auswahl-n]])

Die Switch-Funktion wertet eine Liste von Ausdrücken aus und gibt aus einer Liste von möglichen Werten den Wert zurück, der True ergibt.

Syntax:Switch(Ausdr-1, Wert-1[, Ausdr-2, Wert-2 ... [, Ausdr-n,Wert-n]])


   Option Explicit
   Private Const CMDLNAME As String = "Einzeilige Kontrollstruktur, Switch- und Choose-Funktion"

   Private Sub Sequence()
      'Array fester Größe deklarieren
      Dim arr(1 To 3) As String
          arr(1) = "Element 1"
          arr(2) = "Element 2"
          arr(3) = "Element 3"
          'arr(n) = "Element n"
      'mit i als Index auf die Elemente zugreifen, i kann 1,2,3 sein
      Dim i As Long
          i = 2
      'Sicherstellen, daß i nur 1,2,3 ist
      MySwitch i, arr(): Debug.Print i ->2
      'ausgewählten Elementinhalt anzeigen
      Debug.Print MyChoose(i, arr()) ->Element 2
   End Sub
   
   Public Sub MySwitch(ByRef i As Long, ByRef arr() As String)
      i = switch(i >= LBound(arr) And i <= UBound(arr), i, i < LBound(arr), 1, i > UBound(arr), 3)
   End Sub
   
   Public Function MyChoose(ByVal i As Long, ByRef arr() As String) As String
      MyChoose = Choose(1, arr(i))
   End Function

Kategorie: VB(A)

Seitenanfang

In MyChoose wird mit Hilfe des übergebenen Arrays, die Funktionalität von Choose umgekehrt. Der Index ist 1 also fix und die Auswahlliste bildet das Array auf dessen Elemente über die Indexnummer zugegriffen wird. Der Vorteil dieser Vorgehensweise ist, daß zur Laufzeit die Auswahlliste flexibel vorgeben werden kann. Unabhängig davon, von welcher Prozedur der Aufruf von MyChoose erfolgt.

Außerdem kann so ein »merkwürdiger« Seiteneffekt der Choose-Funktion umgangen werden. Choose wertet nämlich jeden möglichen Ausdruck der Auswahlliste aus, egal an welcher Stelle die Übereinstimmung von Index und Auswahl-n gefunden wird.

In Private Sub YetAnotherChoose() ist dieses Verhalten dargestellt. Der Rückgabewert ist Auswahl1, trotzdem wird die Messagebox geöffnet und Auswahl2 angezeigt.

MySwitch dient dazu den Gültigkeitsbereich der Indizes des Arrays zu überprüfen (hier 1-3). Um bei Vorgabe eines zu kleinen oder zu großen Wertes die daraus resultierende Fehlermeldung der Indexverletzung zu vermeiden.

Wenn i < LBound(arr) wird 1 zurückgebenen, bei i > UBound(arr) erfolgt der Rückgabewert 3. Genauso könnte hier Null zurückgegeben werden (Was dem Standardverhalten der Choose-Funktion entspricht) und die Prozedur mit einer Meldung an den Benutzer beendet werden.


   Private Sub YetAnotherChoose()
      Dim i As Long
          i = 1
      Debug.Print Choose(i, "Auswahl1", MsgBox("Auswahl2"), "Auswahl3") ->Auswahl1
   End Sub

Kategorie: VB(A)

Seitenanfang