Die Programmiersprachen, in denen API-Prozeduren geschrieben sind, nutzen andere Bezeichnungen für Datentypen als VBA, und zum Teil sogar Datentypen, die in VBA gar nicht existieren. Um zu verstehen, wie man mit Hilfe von Microsofts API-Referenz eine API-Prozedur in VBA einbindet, muss man natürlich die API-Datentypen verstehen, um sie korrekt zu „übersetzen“. Und während man in VBA problemlos z. B. den Wert einer Bytevariablen in eine Variable vom Typ Long schreiben kann, muss bei einer DLL zwingend die Variablengröße der geforderten Größe entsprechen. Da VBA einer DLL vorübergehend die Ausführung übergibt, kann währenddessen in VBA keine Fehlerbehandlung greifen und es daher bei einer fehlerhaften Programmierung zu einem nicht abfangbaren Absturz der Applikation kommen!
Microsoft stellt eine Referenz der Datentypen in Windows zu Verfügung. Die folgende Tabelle stellt Datentypen für Zahlen von Windows und VBA gegenüber:
Datentypen | |||
---|---|---|---|
Windows | Wertebereich | Größe | VBA |
Bool, Boolean | True oder False | 1 Byte | Boolean |
Byte | Ganzzahlen 0 bis 255 | 1 Byte | Byte |
Word, UShort | Ganzzahlen 0 bis 65535 | 2 Byte | Integer |
Short, Int | Ganzzahlen -32768 bis 32767 | 2 Byte | Integer |
DWord, ULong | Ganzzahlen 0 bis 4294967295 | 4 Byte | Long |
Long, Int32, Long32 | Ganzzahlen -2.147.483.648 bis 2.147.483.647 | 4 Byte | Long |
DWordLong, DWord64, QWord, ULongLong, UInt64, ULong64 | Ganzzahlen 0 bis ca. 18,4 Trillionen | 8 Byte | LongLong ¹ |
LongLong, Int64, Long64 | Ganzzahlen ca. ± 9,2 Trillionen | 8 Byte | LongLong ¹ |
Float | Fließkommazahl | 4 Byte | Single |
¹ Die folgenden Hinweise zu LongPtr beachten
Wie man sieht, kennt Windows einige Datentypen für vorzeichenlose Ganzzahlen.
Dafür gibt es in VBA eigentlich keine Entsprechung. In VBA benötigt man dann einen
Datentyp gleicher Größe. Das bedeutet, dass beispielsweise ein Wert größer als
32.767 in einer Variablen vom Datentyp Word
einem negativen Wert einer
Integervariablen entspricht. Wenn der Wert der Variablen nur einen Identifier speichert,
kann man das ignorieren, soll aber mit der Zahl gerechnet werden, muss vorher
umgerechnet werden.
Problematisch sind die Unterschiede zwischen 32- und 64-Bit Office: Aus Sicht
eines Programmierers ist bekanntlich der einzig nennenswerte Unterschied eines
64-Bit Office der neue Datentyp LongLong
sowie die zugehörige
Typkonvertierungsfunktion
CLngLng
. Wenn nun aber ein 32-Bit Office einer API-Prozedur einen
64-Bit Wert übergeben muss, ist das eigentlich gar nicht möglich. Notfalls ginge
das zwar mit dem Currency-Datentyp, der ebenfalls 64 Bit hat (und in Einzelfällen
kann das auch sinnvoll sein), aber damit wäre ein 32-Bit Office unter einem 64-Bit
Windows nicht mehr ohne weiteres kompatibel zu einem 32-Bit Windows.
Daher muss nun zum einen das Schlüsselwort PtrSafe
in der Declare
-Anweisung eingefügt werden,
damit die Anweisung in einer 64-Bit Umgebung sicher ausgeführt wird. Da das ältere
VBA6 (bis Office 2007) allerdings PtrSafe
nicht kennt, muss mit #If VBA7
entsprechend verzweigt werden, wenn der Code auch auf einem älteren Office lauffähig
sein soll.
Zum anderen wurde, speziell für die API-Programmierung, der Datentyp
LongPtr
(und die Typkonvertierungsfunktion CLngPtr
)
eingeführt. Dabei handelt es sich eigentlich um keinen „richtigen“ Datentyp.
Stattdessen wird LongPtr
unter einem 32-Bit Office als Long
interpretiert und unter 64-Bit als LongLong
.
Auch für diejenigen Datentypen in Windows, bei denen es sich laut Referenz um
„Handle“ oder „Pointer“ handelt, muss in VBA der Typ LongPtr
verwendet
werden.