Verwendung von API Bibliotheken in Office 2010/2013 32bit und 64bit Versionen

Per VBA können API-Bibliotheken relativ einfach eingebunden werden. Bei einer API (Application Programming Interface) handelt es sich um DLL- oder EXE-Dateien die eine Schnittstelle zum Betriebssystem oder zu anderen Anwendungen darstellt. Per VBA können Daten über die API-Schnittstellen ausgetauscht werden um das Betriebssystem oder andere Anwendungen entsprechend zu steuern.

Mit Hilfe des folgenden VBA-Codes kann beispielsweise die aktuelle Bildschirmauflösung aus dem Betriebssystem ausgelesen werden.

 

Public Const SM_CXSCREEN = 0
Public Const SM_CYSCREEN = 1
Declare Function GetSystemMetrics Lib "user32" (ByVal nIndex As Long) As Long

Sub Bildschirmauflösung()
'** Bildschirmauflösung auslesen
gWidth = GetSystemMetrics(SM_CXSCREEN)
gHeight = GetSystemMetrics(SM_CYSCREEN)

'** Ausgabe
MsgBox "Bildschirmbreite: " & gWidth & vbLf & _
  "Bildschirmhöhe: " & gHeight
End Sub

Dieser Code funktioniert grundsätzlich in einer 32bit Office-Installationen.

Sobald dieser Code mit einer 64bit Office-Version aufgerufen wird kommt es zu folgender Fehlermeldung:

(Fehler beim Kompilieren: Der Code in diesem Projekt muss für die Verwendung auf 64-Bit-Systemen aktualisiert werden. Überarbeiten und aktualisieren Sie Declare-Anweisungen, und markieren  Sie sie mit dem PtrSafe-Attribut.)

Wenn der oben aufgeführte Code in einer 64bit Office-Version verwendet werden soll, ist nur eine kleine Anpassung erforderlich. Die Declare Funktion Anweisung wird einfach um das Attribut PtrSafe erweitert. Die dritte Codezeile sieht nach der Anpassung für ein 64bit System wie folgt aus:

Declare PtrSafe Function GetSystemMetrics Lib "user32" (ByVal nIndex As Long) As Long

Mit dieser Anpassung läuft der Code sowohl unter einer 32bit als auch unter einer 64bit Office-Version.

Der gesamte Code für die 64bit Office-Installation sieht demnach folgendermaßen aus:

Public Const SM_CXSCREEN = 0
Public Const SM_CYSCREEN = 1
Declare PtrSafe Function GetSystemMetrics Lib "user32" (ByVal nIndex As Long) As Long

Sub Bildschirmauflösung()
'** Bildschirmauflösung auslesen
gWidth = GetSystemMetrics(SM_CXSCREEN)
gHeight = GetSystemMetrics(SM_CYSCREEN)

'** Ausgabe
MsgBox "Bildschirmbreite: " & gWidth & vbLf & _
  "Bildschirmhöhe: " & gHeight
End Sub

Hinweis:

Die Anpassung ist nur für 64bit Office-Versionen notwendig. Die Version des Betriebssystems ist dabei irrelevant. Wenn beispielsweise unter Windows 8 eine 32bit Office-Version installiert ist, kann der Zusatz PtrSafe entfallen.