Übersicht über 64-Bit-Visual Basic for Applications

Microsoft Visual Basic for Applications (VBA) ist die Version von Visual Basic, die in Microsoft Office enthalten ist. In Microsoft Office 2010 enthält VBA Sprachfeatures, mit denen VBA-Code sowohl in 32-Bit- als auch in 64-Bit-Umgebung ordnungsgemäß ausführt werden kann.

Hinweis

Standardmäßig wird mit Office 2010, 2013 und 2016 die 32-Bit-Version installiert. Die Installation der 64-Bit-Version muss während der Einrichtung explizit ausgewählt werden. Ab Office 2019 und Microsoft 365 ist wird standardmäßig die 64-Bit-Version installiert.

Das Ausführen von VBA-Code, der vor der Veröffentlichung von Office 2010 auf einer 64-Bit-Plattform geschrieben wurde (VBA-Version 6 und älter), kann zu Fehler führen, wenn der Code nicht für die Ausführung in den 64-Bit-Versionen von Office geändert wurde. Die Ursache für die Fehler liegt darin, dass die VBA-Version 6 und ältere Versionen implizit 32-Bit-Plattformen anvisieren und normalerweise Declare-Anweisungen enthalten, die Aufrufe in die Windows-API mit 32-Bit-Datentypen für Zeiger und Handles durchführen. Da die VBA-Version 6 und ältere Versionen keinen speziellen Datentyp für Zeiger und Handles aufweisen, verwenden sie zum Verweisen auf Zeiger und Handles den Long-Datentyp, einen 32-Bit- bzw. 4-Byte-Datentyp. Zeiger und Handles in 64-Bit-Umgebungen sind jedoch 8-Byte- bzw. 64-Bit-Größen. Diese 64-Bit-Größen sind mit 32-Bit-Datentypen nicht kompatibel.

Hinweis

Sie müssen VBA-Code nur bearbeiten, wenn er in der 64-Bit-Version von Microsoft Office ausgeführt wird.

Das Problem bei der Ausführung von veraltetem VBA-Code in 64-Bit-Versionen von Office besteht darin, dass beim Versuch, die 64 Bit in einen 32-Bit-Datentyp zu laden, die 64-Bit-Menge abgeschnitten wird. Dies kann dazu führen, dass der Arbeitsspeicher überläuft, der Code unerwartete Ergebnisse auswirft und Anwendungsfehler auftreten.

Um dieses Problem zu beheben und dafür zu sorgen, dass VBA-Code sowohl in 32-Bit- als auch in 64-Bit-Umgebung ordnungsgemäß funktioniert, wurden mehrere Sprachfeatures zu VBA hinzugefügt. In der Tabelle am Ende dieses Dokuments finden Sie eine Zusammenfassung der neuen VBA-Sprachfeatures. Drei wichtige Ergänzungen sind der Typalias LongPtr, der Datentyp LongLong und das Schlüsselwort PtrSafe.

  • LongPtr. VBA enthält ab sofort einen Typalias für Variablen: LongPtr. Der tatsächliche Datentyp, in den LongPtr aufgelöst wird, hängt von der Office-Version ab, in der der Typalias ausgeführt wird; in 32-Bit-Office-Versionen wird LongPtr in Long aufgelöst, und in 64-Bit-Office-Versionen wird LongPtr in LongLong aufgelöst. Verwenden Sie für Zeiger und Handles LongPtr.

  • LongLong. Der Datentyp LongLong ist eine vorzeichenbehaftete 64-Bit-Ganzzahl, die nur in 64-Bit-Versionen von Office verfügbar ist. Verwenden Sie LongLong für 64-Bit-Integrale. Konvertierungsfunktionen müssen verwendet werden, um LongLong (einschließlich LongPtr auf 64-Bit-Plattformen) kleineren ganzzahligen Typen zuzuweisen. Implizite Umwandlungen von LongLong-Ausdrücken in kleinere Integrale sind nicht zulässig.

  • PtrSafe. Mit dem Schlüsselwort PtrSafe wird bestätigt, dass eine Declare-Anweisung sicher in einer 64-Bit-Office-Version ausgeführt werden kann.

Wichtig

Alle Declare-Anweisungen müssen jetzt das Schlüsselwort PtrSafe enthalten, wenn Sie in 64-Bit-Versionen von Office ausgeführt werden. Es ist wichtig zu verstehen, dass nur durch das Hinzufügen des Schlüsselworts PtrSafe zu einer Declare-Anweisung damit lediglich angegeben wird, dass die Declare-Anweisung explizit auf 64-Bit abzielt. Alle Datentypen in der Anweisung, die 64-Bit speichern müssen (einschließlich Rückgabewerte und Parameter), müssen immer noch geändert werden, um 64-Bit-Größen enthalten zu können.

Hinweis

Als Syntax werden Declare-Anweisungen mit dem Schlüsselwort PtrSafe empfohlen. Declare-Anweisungen, die PtrSafe enthalten, werden ordnungsgemäß in VBA 7-Entwicklungsumgebungen auf 32-Bit- und 64-Bit-Plattformen ausgeführt.

Um die Abwärtskompatibilität mit VBA Version 7 und früher sicherzustellen, verwenden Sie das folgende Konstrukt:

 #If VBA7 Then 
 Declare PtrSafe Sub... 
 #Else 
 Declare Sub... 
 #EndIf

Sehen Sie sich die folgenden Beispiele für die Declare-Anweisung an. Das Ausführen der unveränderten Declare-Anweisung in 64-Bit-Versionen von Office führt zu einem Fehler, der angibt, dass die Declare-Anweisung nicht den Bezeichner PtrSafe enthält. Das geänderte VBA-Beispiel enthält den Bezeichner PtrSafe, aber beachten Sie, dass der Rückgabewert (ein Zeiger auf das aktive Fenster) einen Long-Datentyp zurückgibt. In 64-Bit-Office ist dies falsch, da der Zeiger 64-Bit sein muss. Der Bezeichner PtrSafe teilt dem Compiler mit, dass die Declare-Anweisung 64-Bit anvisiert, daher wird die Anweisung ohne Fehler ausgeführt. Da der Rückgabewert nicht in einen 64-Bit-Datentyp aktualisiert wurde, wird der zurückgegebene Wert abgeschnitten, sodass ein falscher Wert zurückgegeben wird.

Nachfolgend finden Sie ein Beispiel für eine unveränderte veraltete VBA-Declare-Anweisung:

Declare Function GetActiveWindow Lib "user32" () As Long

Das folgende Beispiel für eine geänderte VBA-Declare-Anweisung enthält einen PtrSafe-Bezeichner, verwendet jedoch weiterhin einen 32-Bit-Rückgabewert:

Declare PtrSafe Function GetActiveWindow Lib "user32" () As Long

Für eine Wiederholung müssen Sie die Declare-Anweisung so ändern, dass der PtrSafe-Bezeichner enthalten ist. Außerdem müssen Sie innerhalb der Anweisung alle Variablen aktualisieren, die 64-Bit-Größen verarbeiten müssen, sodass diese 64-Bit-Datentypen verwenden.

Nachfolgend finden Sie ein Beispiel für eine geänderte VBA-Declare-Anweisung mit eingebundenem PtrSafe-Schlüsselwort und aktualisierten Variablen zur Verwendung des richtigen 64-Bit-Datentyps (LongPtr):

Declare PtrSafe Function GetActiveWindow Lib "user32" () As LongPtr

Zusammenfassung: Damit Code in 64-Bit-Versionen von Office ordnungsgemäß funktioniert, müssen Sie alle vorhandenen Declare-Anweisungen suchen und den PtrSafe-Bezeichner einbinden. Sie müssen auch alle Datentypen in diesen Declare-Anweisungen suchen, die auf Handles oder Zeiger verweisen, und diese dahingehend ändern, dass sie den neuen 64-Bit-kompatiblen Typalias LongPtr verwenden. Ermitteln Sie zudem Datentypen, die 64-Bit-Ganzzahlen mit dem neuen Datentyp LongLong enthalten müssen. Darüber hinaus müssen Sie alle benutzerdefinierten Typen, die Zeiger oder Handles und 64-Bit-Ganzzahlen enthalten, dahingehend aktualisieren, dass sie 64-Bit-Datentypen verwenden, und stellen Sie sicher, dass alle Variablenzuweisungen korrekt sind, um Typenkonflikte zu vermeiden.

Schreiben von Code, der in 32-Bit- und 64-Bit-Office-Versionen funktioniert

Wenn Sie Code schreiben, der sowohl mit 32-Bit- als auch mit 64-Bit-Versionen von Office verwendet werden kann, brauchen Sie nur den neuen Typalias LongPtr anstelle von Long oder LongLong für alle Zeiger- und Handlewerte zu verwenden. Der Typalias LongPtr löst sich in den richtigen Long- oder LongLong-Datentyp auf, je nachdem, welche Version von Office ausgeführt wird.

Beachten Sie, dass zum Ausführen eine andere Logik erforderlich ist, z. B. müssen Sie 64-Bit-Werte in großen Excel-Projekten bearbeiten. Sie können die bedingte Compilerkonstante Win64 wie im folgenden Abschnitt gezeigt verwenden.

Schreiben von Code, der in beiden Office 2010-Versionen (32-Bit oder 64-Bit) und in früheren Office-Versionen funktioniert

Zum Schreiben von Code, der in neuen und älteren Versionen von Office funktioniert, können Sie eine Kombination der neuen bedingten VBA 7- und Win64-Compilerkonstanten verwenden. Die bedingte Compilerkonstante von Vba 7 wird verwendet, um zu bestimmen, ob Code in Version 7 des VB-Editors (die VBA-Version, die in Office 2010 enthalten ist) ausgeführt wird. Die Win64-Compilerkonstante wird verwendet, um zu bestimmen, welche Version von Office (32-Bit oder 64-Bit) ausgeführt wird.

#if Vba7 then 
'  Code is running in the new VBA7 editor 
     #if Win64 then 
     '  Code is running in 64-bit version of Microsoft Office 
     #else 
     '  Code is running in 32-bit version of Microsoft Office 
     #end if 
#else 
' Code is running in VBA version 6 or earlier 
#end if 
 
#If Vba7 Then 
Declare PtrSafe Sub... 
#Else 
Declare Sub... 
#EndIf 

Zusammenfassung der VBA 7-Sprachupdates

In der folgenden Tabelle sind die neuen VBA-Sprachenergänzungen mit Erläuterungen zusammengefasst.

Name Typ Beschreibung
PtrSafe Schlüsselwort Bestätigt, dass eine Declare-Anweisung für 64-Bit-Systeme ausgerichtet ist. Erforderlich für 64-Bit-Version.
LongPtr Datentyp Typalias, der Long auf 32-Bit-Systemen oder LongLong auf 64-Bit-Systemen zuordnet.
LongLong Datentyp 8-Byte-Datentyp, der nur auf 64-Bit-Systemen verfügbar ist. Numerischer Typ. Ganze Zahlen im Bereich von -9.223.372.036.854.775.808 bis 9.223.372.036.854.775.807.

LongLong ist nur für 64-Bit-Plattformen ein gültiger Deklarationstyp. Darüber hinaus kann LongLong möglicherweise nicht implizit in einen kleineren Typ konvertiert werden (z. B. kann LongLong nicht Long zugewiesen werden). Auf diese Weise wird verhindert, dass ein Zeiger unbeabsichtigt abgeschnitten wird.

Explizite Koersionen sind wie im vorherigen Beispiel zulässig; Sie könnten CLng bei einem LongLong-Datentyp anwenden und das Ergebnis einem Long-Datentyp zuweisen (nur auf 64-Bit-Plattformen gültig).
^ LongLong-Typdeklarationszeichen Deklariert explizit einen Literalwert als einen LongLong-Datentyp. Erforderlich zum Deklarieren eines LongLong-Literals, das größer als der maximale Long-Wert ist (andernfalls wird es implizit in einen Double-Wert konvertiert).
CLngPtr Typkonvertierungsfunktion Konvertiert einen einfachen Ausdruck in einen LongPtr-Datentyp.
CLngLng Typkonvertierungsfunktion Konvertiert einen einfachen Ausdruck in einen LongLong-Datentyp (nur auf 64-Bit-Plattformen gültig).
vbLongLong VarType-Konstante Ganzzahl LongLong (nur auf 64-Bit-Plattformen gültig).
DefLngPtr DefType-Anweisung Legt für eine Reihe an Variablen den Standarddatentyp als LongPtr fest.
DefLngLng DefType-Anweisung Legt für eine Reihe an Variablen den Standarddatentyp als LongLong fest.

Siehe auch

Support und Feedback

Haben Sie Fragen oder Feedback zu Office VBA oder zu dieser Dokumentation? Unter Office VBA-Support und Feedback finden Sie Hilfestellung zu den Möglichkeiten, wie Sie Support erhalten und Feedback abgeben können.