VBA-Programmierung in Microsoft Excel

Tutorial: Excel-Beispiele

VBA-Begriff: AddressOf-Operator

Ein unärer Operator, der bewirkt, daß die Adresse der Prozedur, der er vorangestellt ist, an eine API-Prozedur übergeben wird, die an dieser Stelle in der Liste der Argumente einen Funktionszeiger sucht.

Syntax

AddressOf Prozedurname

Der erforderliche Prozedurname gibt die Prozedur an, deren Adresse übergeben werden soll. Er muß für eine Prozedur in einem Standardmodul in dem Projekt stehen, in dem der Aufruf erfolgt.

Anmerkungen

Tritt ein Prozedurname in einer Argumentliste auf, wird normalerweise die Prozedur ausgewertet, und die Adresse des Rückgabewerts der Prozedur wird übergeben. AddressOf ermöglicht, daß die Adresse der Prozedur an eine Windows-API-Funktion in einer Dynamic Link Library (DLL) übergeben wird und nicht der Rückgabewert der Prozedur. Die API-Funktion kann dann die Adresse für den Aufruf der Basic-Prozedur verwenden. Dieser Vorgang wird als Rückruf bezeichnet. Der AddressOf-Operator tritt nur im Aufruf an die API-Prozedur auf.

Sie können zwar AddressOf verwenden, um Prozedurzeiger zwischen Basic-Prozeduren zu übergeben, Sie können mit Hilfe eines solchen Zeigers jedoch keine Funktion innerhalb von Basic aufrufen. Das bedeutet, daß z.B. eine in Basic geschriebene Klasse mit einem derartigen Zeiger keinen Rückruf an den zugehörigen Controller durchführen kann. Wird AddressOf für das Übergeben eines Prozedurzeigers zwischen Prozeduren innerhalb von Basic verwendet, muß der Parameter der aufgerufenen Prozedur als As Long eingegeben werden.

Achtung   Das Verwenden von AddressOf kann nicht vorhersehbare Ergebnisse liefern, wenn Sie mit dem Konzept von Funktionsrückrufen nicht vollständig vertraut sind. Zur Verwendung dieses Operators muß Ihnen bekannt sein, wie der Basic-Teil des Rückrufs und der Code der DLL funktioniert, an die Sie die Funktionsadresse übergeben. Das Debuggen solcher Interaktionen ist häufig schwierig, da das Programm im selben Prozess ausgeführt wird, wie die Entwicklungsumgebung. In manchen Fällen ist ein systematisches Debuggen unter Umständen nicht möglich.

Anmerkung   Sie können eigene Prototypen für Rückruffunktionen in DLLs erstellen, die mit Microsoft Visual C++ (oder ähnlichen Programmen) kompiliert werden. Damit AddressOf mit dem Prototyp eingesetzt werden kann, muß dieser die Aufrufkonvention __stdcall verwenden. Die Standardaufrufkonvention (__cdecl) kann mit AddressOf nicht verwendet werden.

Da sich der Aufrufer eines Rückrufs nicht innerhalb des Programms befindet, ist es wichtig, daß ein Fehler in der Rückrufprozedur nicht an den Aufrufer zurückgeleitet wird. Fügen Sie hierzu die On Error Resume Next-Anweisung am Anfang der Rückrufprozedur ein.