Arbeiten mit Kontrollstrukturen

Verschachtelte Kontrollstrukturen

Sie können Kontrollstrukturen innerhalb von anderen Kontrollstrukturen verwenden (beispielsweise einen If...Then-Block innerhalb einer For...Next-Schleife). Kontroll­strukturen innerhalb einer anderen Kontrollstruktur werden als verschachtelt bezeichnet.

Kontrollstrukturen können in Visual Basic über beliebig viele Ebenen verschachtelt werden. Im allgemeinen lassen sich verschachtelte Entscheidungs- und Schleifenstrukturen besser lesen, wenn der Rumpf der Entscheidungs- bzw. Schleifenstruktur eingerückt wird.

Die folgende Prozedur gibt beispielsweise die Namen aller Schriftarten aus, die sowohl für den Drucker als auch für den Bildschirm verwendet werden:

Private Sub Form_Click()

   Dim SFont, PFont

   For Each SFont In Screen.Fonts()

      For Each PFont In Printer.Fonts()

        If SFont = PFont Then

           Print SFont

        End If

      Next PFont

   Next SFont

End Sub

Das erste Next-Anweisung schließt die innere For-Schleife und die letzte Next-Anweisung die äußere For-Schleife. Entsprechend beziehen sich die End If-Anweisungen in verschachtelten If-Anweisungen automatisch auf die letzte vorhergehende If-Anweisung. Verschachtelte Do...Loop-Strukturen funktionieren ähnlich, wobei sich die innerste Loop-Anweisung auf die innerste Do-Anweisung bezieht.

Beenden einer Kontrollstruktur

Mit der Exit-Anweisung können Sie eine For-Schleife, Do-Schleife, Sub-Prozedur oder Function-Prozedur direkt beenden. Die Syntax der Exit-Anweisung ist einfach: Exit For kann beliebig oft innerhalb einer For-Schleife erscheinen, und Exit Do kann beliebig oft innerhalb einer Do-Schleife verwendet werden:

For Zähler = Startwert To Endwert [Step Schrittweite]

     [Anweisungsblock]

     [Exit For]

     [Anweisungsblock]

Next [Zähler[, Zähler] [,...]]

 

Do [{While | Until} Bedingung]

     [Anweisungsblock]

     [Exit Do]

     [Anweisungsblock]

Loop

Die Exit Do-Anweisung funktioniert mit allen Syntaxvarianten der Do-Schleife.

Exit For und Exit Do sind hilfreich, da eine Schleife häufig unmittelbar abgebrochen werden muß, ohne daß weitere Durchläufe oder Anweisungen innerhalb der Schleife ausgeführt werden. Im obigen Beispiel, in dem die Namen von Schriftarten aus­gegeben werden, die sowohl für den Bildschirm als auch für den Drucker verwendet werden können, führt der Code den Vergleich von Druckerschriftarten und Bild­schirmschriftarten auch dann fort, wenn bereits eine Übereinstimmung gefunden wurde. Eine effizientere Version der Funktion würde die Schleife sofort verlassen, nachdem eine Übereinstimmung gefunden wurde:

Private Sub Form_Click()

   Dim SFont, PFont

   For Each SFont In Screen.Fonts()

      For Each PFont In Printer.Fonts()

        If SFont = PFont Then

           Print Sfont

           Exit For        ' Innere Schleife beenden.

        End If

      Next PFont

   Next SFont

End Sub

Wie dieses Beispiel zeigt, erscheint eine Exit-Anweisung fast immer innerhalb einer If-Anweisung oder einer Select Case-Anweisung, die in der Schleife verschachtelt ist.

Wenn Sie eine Schleife mit der Exit-Anweisung verlassen, enthält die Zählervariable verschiedene Werte, abhängig davon, wie Sie die Schleife verlassen haben:

·     Wenn Sie eine Schleife abschließen, enthält die Zählervariable den Wert der oberen Grenze zuzüglich der Schrittweite.

·     Wenn Sie eine Schleife vorzeitig beenden, behält die Zählervariable ihren Wert entsprechend den Regeln zum Gültigkeitsbereich.

·     Wenn Sie eine Schleife über das Ende einer Auflistung hinaus durchlaufen, enthält die Zählervariable Nothing, falls sie vom Datentyp Object ist, oder Empty, falls sie vom Datentyp Variant ist.

Beenden einer Sub- oder Function-Prozedur

Sie können eine Prozedur auch aus einer Kontrollstruktur heraus beenden. Die Syntax von Exit Sub und Exit Function ist der von Exit For und Exit Do im vorhergehenden Abschnitt, "Beenden einer Kontrollstruktur", ähnlich. Exit Sub kann beliebig oft an beliebigen Stellen innerhalb des Rumpfs einer Sub-Prozedur erscheinen. Exit Function kann beliebig oft an beliebigen Stellen innerhalb des Rumpfs einer Function-Prozedur erscheinen.

Exit Sub und Exit Function sind hilfreich, wenn die Prozedur alle erforderlichen Operationen abgeschlossen hat und nun sofort beendet werden kann. Wenn Sie das vorhergehende Beispiel so ändern möchten, dass nur die erste gefundene Drucker- bzw. Bildschirmschriftart ausgegeben wird, können Sie Exit Sub verwenden:

Private Sub Form_Click()

   Dim SFont, PFont

   For Each SFont In Screen.Fonts()

      For Each PFont In Printer.Fonts()

        If SFont = PFont Then

           Print Sfont

           Exit Sub        ' Prozedur beenden.

        End If

      Next PFont

   Next SFont

End Sub