Spezielle Objektvariablen in VBA
Wir nennen einen Typ einen Objekttyp, wenn der Aufruf »VBA.Information.IsObject( v )« den Wert »"Object"« hat, falls die Variable »v« mit jenem Typ deklariert wurde.
Eine allgemeine Objektvariable wird mit dem Typ »Object« angelegt, eine spezielle Objektvariable wird mit einem anderen Objekttyp angelegt.
Wir nennen Objekttypen außer »Nothing« und »Object« Klassen.
Ein Objekt, dessen Typ eine Klasse ist, nennt man auch ein Exemplar jener Klasse.
Der Typ eines Objekts ist der Regel eine Klasse. Die Klasse eines Objekts legt die Fähigkeiten eines Objektes fest, also welche Einträge (Eigenschaften und Prozeduren) es hat und wie diese verwendet werden können. »Nothing« hat den Typ »Nothing« und damit keine Einträge.
Beispielsweise ist »VBA.ErrObject« die Klasse (der Typ) von »VBA.Err« (laut »VBA.Information.TypeName«).
Prozeduren in Klassen werden auch Methoden genannt.
In dem folgenden Programmbeispiel wird eine spezielle Objektvariable mit dem Typ »VBA.ErrObject« angelegt. Eine solche Variable kann nur an »Nothing« oder an ein Objekt vom Typ »VBA.ErrObject« gebunden werden.
Modul1
Option Explicit
Sub Main()
Dim E As VBA.ErrObject
Debug.Print VBA.Information.VarType( E )
Debug.Print VBA.VbVarType.vbObject
Debug.PrintDebug.Print VBA.Information.TypeName( E )
Debug.Print VBA.Information.IsObject( E )End Sub
transcript
9
9
Nothing
Wahr
Im folgenden Programm werden beide Variablen »E« und »O« an das Objekt gebunden, an das auch schon »VBA.Err« gebunden ist. Man sieht keinen Unterschied zwischen den beiden Variablen. Allerdings ist es bei der Variablen »E« bereits von Anfang klar, daß sie für ein Objekt des Typs »VBA.ErrObject« gedacht ist, und so ist sie etwas besser verständlich; außerdem kann die VBA -Implementation es auch als Fehler erkennen, wenn diese Variable dann versehentlich an ein Objekt eines anderen Typs gebunden wird.
Modul1
Option Explicit
Sub Main()
Dim E As VBA.ErrObject
Dim O As ObjectSet E = VBA.Err
Debug.Print E is VBA.ErrSet O = VBA.Err
Debug.Print O is VBA.Err
Debug.Print O is ELet E = 7
Debug.Print OEnd Sub
Protokoll
Wahr
Wahr
Wahr
7
Das voranstehende Programm zeigt, daß eine Variable manchmal sowohl allgemein mit »Object« als auch speziell mit einer bestimmten Klasse, wie »VBA.ErrObject« deklariert werden kann. Man sollte eine Variable möglichst immer mit einer speziellen Klasse deklarieren, wenn man schon weiß, daß sie nur entweder an »Nothing« oder an ein Exemplar jener Klasse gebunden werden soll. Der allgemeine Typ »Object« ist für Variablen gedacht, die im Laufe ihrer Existenz an Objekte unterschiedlicher Klassen gebunden werden sollen, oder für die es beim Schreiben nicht bekannt ist, welche Klasse das Objekt hat, an das sie gebunden wird.
IDE-Unterstützung
Eine spezielle Objektvariable enthält selber bereits Informationen über den Inhalt eines Objekts ihres Typs, selbst wenn sie noch gar keine Objekt enthält. Die VBA-IDE kann diese Informationen nutzen, um den Benutzer zu helfen.
Modul1
Option Explicit
Sub Main()
Dim E As VBA.ErrObject
End Sub
Wenn man in der VBA-IDE vor das Ende des obigen Subs »Main« noch eine Zeile einfügt (vor der Zeile mit »End Sub«) und am Anfang der eingefügten Zeile »E.« tippt, so erscheint normalerweise eine Auswahlliste, welche den Inhalt des Namens »E« anzeigt. Es handelt sich bei diesem Inhalt um den Inhalt, den ein Objekt der Klasse des Namens »E« hätte, es handelt sich also um den Inhalt eines VBA.ErrObject-Objektes.
Diese Auswahlliste kann dem Programmierer dabei helfen, einen der möglichen Einträge eines Objekts auszuwählen. So kann man beispielsweise das folgende Programm schreiben.
Modul1
Option Explicit
Sub Main()
Dim E As VBA.ErrObject
Debug.Print E.NumberEnd Sub
Obwohl der Ausdruck »E.Number« im voranstehenden Programm mit Hilfe der IDE eingegeben wurde, ist er aber nicht korrekt. Startet man das Programm, so erhält man eine Fehlermeldung. Dies liegt daran, daß der Name »E« nur eine Beschreibung der Einträge des Objektes enthält, aber nicht die vollständigen Einträge. Diese finden sich erst in einem Objekt. Wenn wir den Namen »E« an ein Objekt binden, verschwindet die Fehlermeldung.
Modul1
Option Explicit
Sub Main()
Dim E As VBA.ErrObject
Set E = VBA.Err
Debug.Print E.NumberEnd Sub
transcript
0
Verwendet man statt einer speziellen Objektvariable, die mit »Dim E As VBA.ErrObject« deklariert wird, eine allgemeine Objektvariable, die mit »Dim O As Object« deklariert wird, so läuft das Programm ebenfalls, aber die IDE kann den Programmierer bei einer allgemeinen Objektvariablen nicht mit einer Auswahlliste unterstützen, da keine Klasse für die allgemeine Objektvariable kennt.
Modul1
Option Explicit
Sub Main()
Dim O As Object
Set O = VBA.Err
Debug.Print O.NumberEnd Sub
transcript
0
Allgemeine Objektvariablen sind flexibler, da sie an Objekte verschiedener Klassen gebunden werden können, aber sie bieten weniger Unterstützung in der IDE, weswegen sie nur verwendet werden sollten, wenn ihre Flexibilität wirklich benötigt wird.
Übungsaufgaben
/ Übungsaufgabe
(Diese Übungsaufgabe setzt eine Bearbeitung in Excel voraus.)
Legen Sie eine allgemeine Objektvariable mit dem Typ »Object« an und binden Sie diese an das Objekt »Excel.Application«.
Geben Sie nun den Wert der Variablen »Caption« jenes Objektes aus, indem Sie die im vorigen Schritt angelegte Objektvariable (und nicht die Schreibweise »Excel.Application«) verwenden und rufen Sie auch die Funktion »CentimetersToPoints« unter Verwendung der Objektvariablen auf.
(Damit auf Excel zugegriffen werden kann, muß die Excel -Bibliothek in VBA eingebunden sein. Dies ist normalweise der Fall, wenn der VBE von Excel aus geöffnet wird.)
/ Übungsaufgabe
(Diese Übungsaufgabe setzt eine Bearbeitung in Excel voraus.)
Ermitteln Sie den Typ (also die Klasse) des Objekts »Excel.Application«.
Legen Sie nun eine spezielle Objektvariable mit dem von Ihnen ermittelten Typ an und binden Sie diese an das Objekt »Excel.Application«.
Geben Sie nun den Wert der Variablen »Caption« jenes Objektes aus, indem Sie die im vorigen Schritt angelegte Objektvariable (und nicht die Schreibweise »Excel.Application«) verwenden und rufen Sie auch die Funktion »CentimetersToPoints« unter Verwendung der Objektvariablen auf.
(Damit auf Excel zugegriffen werden kann, muß die Excel -Bibliothek in VBA eingebunden sein. Dies ist normalweise der Fall, wenn der VBE von Excel aus geöffnet wird.)