API-Datentypen

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
WindowsWertebereichGrößeVBA
Bool, BooleanTrue oder False1 ByteBoolean
ByteGanzzahlen 0 bis 2551 ByteByte
Word, UShortGanzzahlen 0 bis 655352 ByteInteger
Short, IntGanzzahlen -32768 bis 327672 ByteInteger
DWord, ULongGanzzahlen 0 bis 42949672954 ByteLong
Long, Int32, Long32Ganzzahlen -2.147.483.648 bis 2.147.483.6474 ByteLong
DWordLong, DWord64, QWord, ULongLong, UInt64, ULong64Ganzzahlen 0 bis ca. 18,4 Trillionen8 ByteLongLong ¹
LongLong, Int64, Long64Ganzzahlen ca. ± 9,2 Trillionen8 ByteLongLong ¹
FloatFließkommazahl4 ByteSingle

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