Bindungen in VBA
Eine Objektvariable kann an ein Objekt gebunden werden, und sie steht dann für dieses Objekt. Durch Bindung wird eine Objektvariable also zum Namen eines Objektes.
Um eine Objektvariable an ein Objekt zu binden, kann das sonst übliche »Let« nicht verwendet werden. Wir haben nämlich schon gesehen, daß damit ein Wert in die Fehlvariable des Objekts geschrieben werden würde.
Modul1
Option Explicit
Sub Main()
Let VBA.Err = 7
Debug.Print VBA.Err.NumberEnd Sub
transcript
7
Um eine Objektvariable an ein Objekt zu binden, muß vielmehr »Set« verwendet werden. Wir können damit beispielsweise die Bindung an das Objekt »Nothing« ausdrücklich verlangen.
Modul1
Option Explicit
Sub Main()
Dim O As Object
Set O = Nothing
Debug.Print VBA.Information.TypeName( O )End Sub
transcript
Nothing
Im folgenden Programm wird die Variable »O« an das Objekt von »VBA.Err« gebunden.
Modul1
Option Explicit
Sub Main()
Dim O As Object
Set O = VBA.Err
Debug.Print VBA.Information.TypeName( O )End Sub
transcript
ErrObject
Es gibt nach dem Binden des Objektes aus »VBA.Err« an die Variable »O« weiterhin nur ein einziges Objekt in unserer kleinen Prozedur! Dieses eine Objekt ist nun aber an zwei Variablen gebunden. Schreiben wir aber unter Verwendung der Referenzvariable »O« in das Objekt, so können wir diesen Wert unter Verwendung des Ausdruck »VBA.Err« wieder auslesen!
Modul1
Option Explicit
Sub Main()
Dim O As Object
Set O = VBA.ErrLet O.Number = 7
Debug.Print VBA.Err.NumberLet O.Number = 2
Debug.Print VBA.Err.NumberEnd Sub
- Protokoll
7
2
Der Ausdruck »O.Number« steht für die Eigenschaft mit dem Namen »Number« in dem Objekt, das an »O« gebunden ist. Dies ist dieselbe Eigenschaft, die später auch wieder mit »VBA.Err.Number« ausgelesen wird. Es gibt nur ein VBA.Err-Objekt und dieses ist an zwei verschiedene Variablen gebunden.
- Abbildung
Variable Objekt Variable
.----.
VBA.Err ----------> | | <---------- O
'----'
Eine spezielle „versteckte“ Funktion zeigt uns, daß beide Namen für dasselbe Objekt stehen, weil ihre Speicheradressen (»1442174«) einander gleich sind.
Modul1
Option Explicit
Sub Main()
Dim O As Object
Set O = VBA.ErrDebug.Print VBA.[_HiddenModule].ObjPtr( VBA.Err )
Debug.Print VBA.[_HiddenModule].ObjPtr( O )Debug.Print ObjPtr( VBA.Err )
Debug.Print ObjPtr( O )End Sub
- Protokoll
1442174
1442174
1442174
1442174
Da »Number« die Fehlvariable des Objekts »VBA.Err« ist, können wir es auch weglassen.
Modul1
Option Explicit
Sub Main()
Dim O As Object
Set O = VBA.ErrLet O.Number = 7
Debug.Print VBA.Err.NumberLet O = 2
Debug.Print VBA.Err.NumberLet O.Number = 7
Debug.Print VBA.ErrLet O = 2
Debug.Print VBA.ErrEnd Sub
- Protokoll
7
2
7
2
Man beachte den Unterschied zwischen »Set O« am Anfang (ändert die Bedeutung des Namens »O«) und »Let O« am Ende (ändert die Bedeutung des Fehlwertes des Objekts ›O‹, ohne die Bedeutung des Namens »O« zu verändern).
Das voranstehende Programm zeigt den Unterschied zwischen »Set« und »Let« deutlich:
Mit »Set O = VBA.Err« wird das Objekt, das an »VBA.Err« gebunden ist, auch noch an »O« gebunden. Allgemein wird mit »Set O =« eine Bindung der Objektvariablen »O« an ein Objekt hergestellt.
Mit »Let O = 7« wird die Zahl »7« in den Eintrag »Number« des Objektes geschrieben, das an »O« gebunden ist. Allgemein wird mit »Let O =« bei einer Objektvariablen »O« in die Fehlvariable des Objektes geschrieben, das an »O« gebunden ist.
Wenn »O« eine Objektvariable ist, dann bewirkt »Set O =« die Bindung der Variablen an ein neues Objekt, während »Let O =« die Bindung nicht verändert und statt dessen in die Fehlvariable des Objektes schreibt, falls das Objekt eine Fehlvariable hat. Mit »Let O.f =« kann in des Feld »f« des Objektes geschrieben werden.
Der Name einer Objektvariablen kann in VBA verwirrenderweise für verschiedene Dinge stehen:
- Für die Fehlvariable des Objekts, an welches die Objektvariable gebunden ist.
- Für das Objekt, an welches die Objektvariable gebunden ist (wenn der Name allein hinter dem Gleichheitszeichen einer Set-Anweisung steht oder als Argument von »VBA.Information.IsObject« oder »VBA.Information.TypeName« verwendet wird)
- Für die Objektvariable selber (wenn der Name vor dem Gleichheitszeichen einer Set-Anweisung steht)
Auch die Informationsfunktionen beziehen sich bei Objektvariablen mal auf die Variable selber und mal auf ihren Inhalt.
- Variablenfunktionen
VBA.Information.VarType
gibt die Typkennzahl einer Objekt-Variablen selber an (diese ist bei einer Objektvariablen immer 9). Falls das Argument eine Objektvariable ist, die an ein Objekt gebunden ist, das eine Fehlvariable enthält, so gilt die Typkennzahl aber für jene Fehlvariable.- Inhaltsfunktionen
VBA.Information.TypeName
gibt den Typnamen des Inhaltes einer Objekt-Variablen an. Diese Funktion kann gut verwendet werden, um die Klasse eines Objekts zu erhalten. (Falls das Argument noch einmal zusätzlich eingeklammert ist, ergibt sich aber gegebenenfalls der Typname der Fehleigenschaft des Objekts.)VBA.Information.IsObject
gibt an, ob der Inhalt einer Objekt-Variablen als ein Objekt gilt (ist bei einer Objektvariablen immer wahr). (Falls das Argument noch einmal zusätzlich eingeklammert ist, ergibt sich aber gegebenenfalls, ob die Fehleigenschaft des Objekts ein Objekt ist.)
Das folgende Programm könnte den Eindruck erwecken, daß der Typ der Variablen »V« sich verändert habe.
Modul1
Sub Main()
Dim V As Object
Debug.Print VBA.Information.VarType( V )
Debug.Print VBA.VbVarType.vbObject
Debug.PrintSet V = VBA.Err
Debug.Print VBA.Information.VarType( V )
Debug.Print VBA.VbVarType.vbLong
Debug.PrintDebug.Print VBA.Information.VarType( V.Number )
Debug.Print VBA.VbVarType.vbLongEnd Sub
transcript
9
9
3
3
3
3
Tatsächlich ist der Typ der Variable »V« aber weiterhin »9« (Objekt), aber nach der Bindung an »VBA.Err« gilt das Ergebnis von »VBA.Information.VarType« nun für die Fehlvariable von »VBA.Err«, also für »VBA.Err.Number«.
Bei einer leeren Objektvariablen ist der Typ des Objekts »Nothing«, aber »isObject« gilt als Wahr. Der Zugriff auf die Fehlvariable mit doppelten Klammern ist nicht gestattet.
Modul1
Sub Main()
Dim V As Object
Debug.Print VBA.Information.Typename( V )
Debug.Print VBA.Information.isObject( V )' Debug.Print VBA.Information.Typename( ( V ))
' Debug.Print VBA.Information.isObject( ( V ))End Sub
Protokoll
Nothing
Wahr
Die Zuweisung mit »Let O =« an die Fehleigenschaft von »O« ist nur möglich, wenn die Variable »O« als Objekt dimensioniert wurde. Wurde »O« als »Variant« deklariert, so schreibt die Zuweisung den Wert der rechten Seite in die Variable »O«.
Wir zeigen zunächst noch einmal ein schon weiter oben vorgestelltes Programm.
Modul1
Option Explicit
Sub Main()
Dim O As Object
Set O = VBA.ErrLet O = 7
Debug.Print VBA.Err.NumberLet O = 2
Debug.Print VBA.Err.NumberEnd Sub
transcript
7
2
Das folgende Programm zeigt das andere Verhalten bei Dimensionierung als »Variant«.
Modul1
Option Explicit
Sub Main()
Dim O As Variant
Set O = VBA.ErrLet O = 7
Debug.Print VBA.Err.NumberLet O = 2
Debug.Print VBA.Err.NumberEnd Sub
Protokoll
0
0
Bei Dimensionierung als »Variant« kann die Fehlvariable aber durchaus noch über »O« gelesen werden.
Modul1
Option Explicit
Sub Main()
Dim O As Variant
Set O = VBA.ErrLet VBA.Err.Number = 7
Debug.Print OLet VBA.Err.Number = 2
Debug.Print OEnd Sub
Protokoll
7
2
Im Direktbereich kann eine Variable nicht deklariert werden, und hat – wenn sie erstmals dort verwendet wird – den Typ »Variant«, so daß dort auch dieser Effekt sichtbar wird.
Mit Objekten läßt sich besser im Code-Fenster und mit sinnvoll dimensionierten Variablen arbeiten.
- Objekte lassen sich vom Lokal-Fenster oder vom Überwachungsfenster aus analysieren.
- In einer Funktion wird das Ergebnis mit »Set 〈Funktionsname 〉 =« festgelegt, falls es ein Objekt ist.