Bindungen in VBA (Bindungen in VBA), Lektion, Seite 723840
https://www.purl.org/stefan_ram/pub/bindungen_vba (Permalink) ist die kanonische URI dieser Seite.
Stefan Ram
VBA-Kurs

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.Number

End 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.Err

Let O.Number = 7
Debug.Print VBA.Err.Number

Let O.Number = 2
Debug.Print VBA.Err.Number

End 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.Err

Debug.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.Err

Let O.Number = 7
Debug.Print VBA.Err.Number

Let O = 2
Debug.Print VBA.Err.Number

Let O.Number = 7
Debug.Print VBA.Err

Let O = 2
Debug.Print VBA.Err

End 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:

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.Print

Set V = VBA.Err
Debug.Print VBA.Information.VarType( V )
Debug.Print VBA.VbVarType.vbLong
Debug.Print

Debug.Print VBA.Information.VarType( V.Number )
Debug.Print VBA.VbVarType.vbLong

End 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.Err

Let O = 7
Debug.Print VBA.Err.Number

Let O = 2
Debug.Print VBA.Err.Number

End 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.Err

Let O = 7
Debug.Print VBA.Err.Number

Let O = 2
Debug.Print VBA.Err.Number

End 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.Err

Let VBA.Err.Number = 7
Debug.Print O

Let VBA.Err.Number = 2
Debug.Print O

End 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.

 

Seiteninformationen und Impressum   |   Mitteilungsformular  |   "ram@zedat.fu-berlin.de" (ohne die Anführungszeichen) ist die Netzpostadresse von Stefan Ram.   |   Eine Verbindung zur Stefan-Ram-Startseite befindet sich oben auf dieser Seite hinter dem Text "Stefan Ram".)  |   Der Urheber dieses Textes ist Stefan Ram. Alle Rechte sind vorbehalten. Diese Seite ist eine Veröffentlichung von Stefan Ram. Schlüsselwörter zu dieser Seite/relevant keywords describing this page: Stefan Ram Berlin slrprd slrprd stefanramberlin spellched stefanram723840 stefan_ram:723840 Bindungen in VBA Stefan Ram, Berlin, and, or, near, uni, online, slrprd, slrprdqxx, slrprddoc, slrprd723840, slrprddef723840, PbclevtugFgrsnaEnz Erklärung, Beschreibung, Info, Information, Hinweis,

Der Urheber dieses Textes ist Stefan Ram. Alle Rechte sind vorbehalten. Diese Seite ist eine Veröffentlichung von Stefan Ram.
https://www.purl.org/stefan_ram/pub/bindungen_vba