Beispiel Zwischenresultate ◦ Zusammenfassung ◦ ?

Die Arbeitsmappe LZwischenresultate.xls illustriert das Arbeiten mit Auflistungen. Das Bild unten zeigt die Benutzerschnittstelle. Die Aufgabe lautet:

> a) Schreiben Sie ein Programm, ...

> - das ein neues Tabellenblatt "Zwischenresultate" in die aktuelle Arbeitsmappe einfügt, falls dieses Tabellenblatt noch nicht existiert bzw.

> - es aus der Arbeitsmappe entfernt, falls es bereits existiert.

> b) Schreiben Sie ein Programm, das die Position des Tabellenblatts "Zwischenresultate"

> - nach links bzw.

> - nach rechts verschiebt.

In Aufgabe a) muss zuerst getestet werden, ob das Tabellenblatt Zwischenresultate bereits existiert oder nicht. Man durchläuft dazu alle Elemente der Worksheets-Auflistung und vergleicht deren Namen mit dem vorgegebenen. Als Schleife eignet sich die For ... Next-Schleife. Sie bricht ab, wenn die Zählvariable den Wert der Eigenschaft Count erreicht.

    Dim i As Integer               'Laufvariable
    Dim BlattGefunden As Boolean   'mit False initialisiert

    For i = 1 To Worksheets.Count
      If Worksheets.Item(i).Name = "Zwischenresultate" Then
        BlattGefunden = True
      End If
    Next i

Worksheets.Item(i) gibt das i-te Objekt der Auflistung zurück. Möglich ist auch der Zugriff über den Objektnamen, zum Beispiel Worksheets.Item("XY"). Die uns bereits begegneten Anweisungen Worksheets(i) bzw. Worksheets("XY") sind Kurzformen für den Aufruf der Item-Methode.

Für das Durchlaufen von Auflistungen stellt Visual Basic einen speziellen Schleifentyp zur Verfügung, die For Each ... Next-Schleife (vgl. Objektterminologie und VBA). Die Laufvariable enthält bei diesem Schleifentyp direkt das Objekt und nicht eine Nummer oder einen Namen. Mit der For Each ... Next-Schleife kann der obere Programmteil wie folgt geschrieben werden. Laufvariable ist die Variable Tabellenblatt vom Datentyp Worksheet.

    Dim Tabellenblatt As Worksheet        'Laufvariable
    Dim BlattGefunden As Boolean          'mit False initialisiert

    For Each Tabellenblatt In Worksheets  'DURCHLAUFE ALLE Objekte IN der Auflistung
      If Tabellenblatt.Name = "Zwischenresultate" Then
        BlattGefunden = True
      End If
    Next Tabellenblatt

Das Resultat der beiden Programmvarianten ist dasselbe. Die Variable BlattGefunden enthält True, falls das Tabellenblatt Zwischenresultate existiert und sonst False. Bei False soll nun gemäss Aufgabe a) das Blatt erstellt und hinzugefügt und bei True aus der Auflistung entfernt werden.

    If BlattGefunden = False Then
      Worksheets.Add.Name = "Zwischenresultate"
    Else
      Worksheets.Item("Zwischenresultate").Delete
    End If

Die Anweisung Worksheets.Add erstellt ein neues Objekt und gibt es zurück. Noch in derselben Zeile wird anschliessend die Name-Eigenschaft des neuen Objekts auf Zwischenresultate gesetzt. Die Lösch-Anweisung verläuft ähnlich. Worksheets.Item("Zwischenresultate") gibt das Objekt zurück, das gelöscht werden soll, und die Delete-Methode führt die Löschoperation aus. Beachten Sie, dass nicht die Lösch-Methode der Auflistung (Worksheets.Delete) zur Anwendung kommt, da diese die Auflistung selbst löschen würde.

Um ein Tabellenblatt in einer Tabellenblatt-Auflistung neu zu positionieren (Aufgabe b), bieten die Worksheet-Objekte die Move-Methode an. Als Argument nimmt die Methode das Objekt entgegen, hinter bzw. vor dem das Objekt liegen soll. Die Anweisungen

    Worksheets("XY").Move After:=Worksheets(3) bzw.
    Worksheets("XY").Move Before:=Worksheets(3)

positionieren zum Beispiel das Tabellenblatt XY neu hinter bzw. vor dem Blatt, das zur Zeit an dritter Position ist. After und Before sind benannte Argumente. Da es keine Lücken in den Indizes geben darf, müssen gewisse Tabellenblätter bei einer solchen Operation zwangsweise neu nummeriert werden.

Um ein Objekt in einer Auflistung mit der Move-Methode um eine Position zu verschieben, muss seine aktuelle Position bekannt sein. Die Objekte einer Auflistung merken sich ihre Positionen in ihren Index-Eigenschaften. Die Anweisung

    MeinePosition = Worksheets("XY").Index

schreibt zum Beispiel die Position (etwa 3) des Tabellenblatts XY in die Variable MeinePosition. Existiert das Objekt XY nicht, so wird ein Laufzeitfehler ausgegeben!

In Aufgabe b) muss der Verschiebe-Algorithmus wieder die Elemente der Auflistung durchlaufen, um sicherzustellen, dass das Arbeitsblatt "Zwischenresultate" existiert. Existiert das Objekt und befindet es sich nicht bereits ganz rechts bzw. ganz links, so lässt sich seine neue Position leicht aus seiner alten berechnen. Das Programm zum Verschieben nach rechts sieht damit folgendermassen aus.

    Dim Blatt As Worksheet        'Laufvariable

    For Each Blatt In Worksheets
      If Blatt.Name = "Zwischenresultate" Then
        If Blatt.Index < Worksheets.Count Then
          Blatt.Move After:=Worksheets(Blatt.Index + 1)
          Exit For
        End If
      End If
    Next Tabellenblatt

Move-Methode
For Each ... Next-Schleife
Übungsaufgabe "kleine Helfer"

©abo