Zeigerfunktionen

Zeigerfunktionen sind ausschließlich im Zusammenhang mit API-Prozeduren sinnvoll. Selbst dort werden sie nur in wenigen Spezialfällen benötigt, nämlich dann, wenn eine API eine Variable „vor−“ oder „nachbereiten“ muss. Mit den Werten, die eine Zeigerfunktion zurückgibt, kann man ansonsten nicht wirklich etwas anfangen, und daher sind diese Funktionen nicht nur in der Hilfe undokumentiert, sondern sie sind sogar im Objektkatalog ausgeblendet und schwer zu finden.

Bekanntlich legt ein Programm den Wert von Variablen irgendwo im Arbeitsspeicher ab. Wo und wie das passiert, kann einem VBA-Entwickler normalerweise vollkommen egal sein, denn das System regelt das automatisch. Nur einigen APIs muss dieser Speicherort mitgeteilt werden, denn APIs sind in Programmiersprachen geschrieben, in denen die Speicherverwaltung anders abläuft.

Deklariert man eine Variable beispielsweise vom Typ Long, weist das System der Variable eine Startadresse im Speicher zu, und von dort aus vier Bytes, denn für eine Variable vom Typ Long werden eben vier Bytes benötigt. Das passiert, selbst wenn der Variable noch kein Wert zugewiesen wurde, es genügt die Deklaration. In diesen vier Bytes wird noch gar nichts geschrieben und alle Bits darin stehen noch auf „0“. Es wird nur irgendwo vermerkt: „Ab der Speicheradresse X wird der Wert der Variable gespeichert". Dieser Vermerk wird „Zeiger“ genannt.

Gleiches gilt natürlich auch für Strings, allerdings haben Strings keine feste Länge. Deswegen muss man einer API in aller Regel sagen, wie viele Zeichen der String haben wird. Mit dieser Angabe stellt die API dann ausreichend Speicher zur Verfügung. VBA regelt die Speicherverwaltung für Strings dagegen intern anders: Der eigentliche String wird an irgendeiner Speicheradresse abgelegt, und an einer anderen Stelle gibt es einen Zeiger, der darauf verweist.

AddressOf

AddressOf Prozedurname As LongPtr

Liefert die Adresse der Prozedur zurück. Es muss sich um eine Prozedur in einem Standardmodul handeln.

Streng genommen ist AddressOf keine Funktion, sondern ein Operator. Daher wird der Prozedurname auch nicht in Klammern gesetzt.

VarPtr

VarPtr(Variablenname) As LongPtr

Liefert die Startadresse des Speicherbereichs, in dem eine Variable gespeichert wird.

StrPtr

StrPtr(Variablenname) As LongPtr

Liefert die Startadresse des Speicherbereichs, in dem der eigentliche String gespeichert wird.

ObjPtr

ObjPtr(Variablenname) As LongPtr

Liefert einen Zeiger auf ein Objekt.