Objektvariablen ◦ Zusammenfassung ◦ ?

Gegeben sei eine Auflistung, nämlich eine Arbeitsmappe mit vier Tabellenblättern und eine passende Testprozedur.

    Sub Test()
      Dim Tab1 As Worksheet
      Dim Tab2 As Worksheet

      For Each Tab1 In Worksheets                 '(a)
        If Tab1.Name = "Zwischenresultate" Then
          Exit For
        End If
      Next Tab1

      For Each Tab2 In Worksheets                 '(b)
        If Tab2.Name = "Zwischenresultate" Then
          Exit For
        End If
      Next Tab2

    End Sub                                       '(c)

Tab1 und Tab2 sind die Laufvariablen zweier For Each ... Next-Schleifen, die beide die Worksheets-Auflistung durchlaufen. Die Schleifen brechen ab, sobald die Laufvariable das Objekt Zwischenresultate enthält. Am Ende des Programms sollten also beide Variablen das Objekt Zwischenresultate enthalten. Es gibt jedoch nur ein einziges solches Objekt. In welcher Variablen befindet es sich also am Ende der Prozedur? Zur Beantwortung dieser Frage vertiefen wir den Begriff der Objektvariablen.

Eine Objektvariable ist eine Variable, die einen Verweis (oder Zeiger) auf ein Objekt speichern kann. Ein Verweis entspricht im wesentlichen der Anfangsadresse eines Speicherbereiches, in dem sich ein Objekt befindet. Anders als Objekte belegen Verweise nur sehr wenig Arbeitsspeicher und sind deshalb leichter zu handhaben. Beispiele von Objektvariablen sind die Variablen Tab1 und Tab2.

Objektvariablen werden wie normale Variablen auf Prozedurebene mit Dim, auf Modulebene mit Private und auf Projektebene mit Public vereinbart. Als Datentyp gibt man eine Objektklasse (Objekttyp) an. Worksheet ist ein Beispiel eines Objekttyps. Unmittelbar nach der Vereinbarung verweist eine Objektvariable zunächst auf Nothing, also auf kein Objekt.

Durch Angabe einer spezifischen Objektklasse als Objekttyp kann eine Objektvariable nur auf Objekte der vereinbarten Objektklasse oder auf Nothing verweisen. Tab1 und Tab2 können also in unserem Beispielprogramm nur auf Worksheet-Objekte verweisen, nicht aber auf Chart-Objekte und auch nicht auf Worksheets-Objekte.

Neben spezifischen Objekttypen wie Worksheet existiert der allgemeine Objekttyp Object. Eine Variable dieses Typs kann auf ein beliebiges Objekt verweisen. Der Zugriff auf dessen Eigenschaften und Methoden ist aber weniger effizient und weniger sicher. Das Thema Polymorphismus betrachtet den allgemeinen Objekttyp genauer. Ansonsten werden wir immer spezifische Objekttypen verwenden.

Im obigen Beispiel schreiben die For Each ... Next-Schleifen solange Verweise auf die Worksheet-Objekte der Worksheets-Auflistung in ihre Laufvariablen Tab1 und Tab2, bis sie auf das Objekt mit dem Namen Zwischenresultate zeigen. Nach Abbruch der ersten Schleife zeigt Tab1 auf das gesuchte Objekt, während Tab2noch auf Nothing verweist. Nach Verlassen der zweiten Schleife zeigt auch Tab2 auf das gesuchte Objekt. Tab1 hat seinen Inhalt dabei nicht geändert. Beide Variablen zeigen also auf dasselbe Objekt. Tatsächlich spricht nichts dagegen, dass mehrere Objektvariablen auf dasselbe Objekt verweisen. (Problematisch ist hingegen der Fall, dass keine Variable mehr auf ein Objekt verweist; vgl. Abschnitte Objekte zuweisen und Objekte vergleichen.)

Die Frage, welche Variable das Objekt enthält, war offensichtlich unkorrekt formuliert. Am Ende der Prozedur verweisen beide Variablen auf das Objekt Zwischenresultate, aber keine "enthält" es.

Das folgende Bild illustriert den Unterschied zwischen Objekten und Objektvariablen. Bild a) zeigt den Zustand des Beispiels unmittelbar nach der Variablenvereinbarung, Bild b) kurz vor Verlassen der Prozedur. Man beachte, dass auch die Worksheets-Auflistung nicht die Tabellenblätter-Objekte "enthält", sondern darauf verweist.

Objektvariablen vereinbaren

©abo