Übersicht über 64-Bit-Visual Basic for Applications64-bit Visual Basic for Applications overview

Microsoft Visual Basic for Applications (VBA) ist die Version von Visual Basic, die in Microsoft Office enthalten ist.Microsoft Visual Basic for Applications (VBA) is the version of Visual Basic that ships with Microsoft Office. 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.In Microsoft Office 2010, VBA includes language features that enable VBA code to run correctly in both 32-bit and 64-bit environments.

Hinweis

Standardmäßig wird mit Office 2010, 2013 und 2016 die 32-Bit-Version installiert.By default, Office 2010, 2013 and 2016 install the 32-bit version. Die Installation der 64-Bit-Version muss während der Einrichtung explizit ausgewählt werden.You must explicitly choose to install the 64-bit version during setup. Ab Office 2019 und Microsoft 365 ist wird standardmäßig die 64-Bit-Version installiert.Starting with Office 2019 and Microsoft 365, the default is the 64-bit version.

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.Running VBA code that was written before the Office 2010 release (VBA version 6 and earlier) on a 64-bit platform can result in errors if the code is not modified to run in 64-bit versions of Office. 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.Errors will result because VBA version 6 and earlier implicitly targets 32-bit platforms, and typically contains Declare statements that call into the Windows API by using 32-bit data types for pointers and handles. 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.Because VBA version 6 and earlier does not have a specific data type for pointers or handles, it uses the Long data type, which is a 32-bit 4-byte data type, to reference pointers and handles. Zeiger und Handles in 64-Bit-Umgebungen sind jedoch 8-Byte- bzw. 64-Bit-Größen.Pointers and handles in 64-bit environments are 8-byte 64-bit quantities. Diese 64-Bit-Größen sind mit 32-Bit-Datentypen nicht kompatibel.These 64-bit quantities cannot be held in 32-bit data types.

Hinweis

Sie müssen VBA-Code nur bearbeiten, wenn er in der 64-Bit-Version von Microsoft Office ausgeführt wird.You only need to modify VBA code if it runs in the 64-bit version of Microsoft Office.

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.The problem with running legacy VBA code in 64-bit Office is that trying to load 64-bits into a 32-bit data type truncates the 64-bit quantity. Dies kann dazu führen, dass der Arbeitsspeicher überläuft, der Code unerwartete Ergebnisse auswirft und Anwendungsfehler auftreten.This can result in memory overruns, unexpected results in your code, and possible application failure.

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.To address this problem and enable VBA code to work correctly in both 32-bit and 64-bit environments, several language features have been added to VBA. In der Tabelle am Ende dieses Dokuments finden Sie eine Zusammenfassung der neuen VBA-Sprachfeatures.The table at the bottom of this document summarizes the new VBA language features. Drei wichtige Ergänzungen sind der Typalias LongPtr, der Datentyp LongLong und das Schlüsselwort PtrSafe.Three important additions are the LongPtr type alias, the LongLong data type, and the PtrSafe keyword.

  • LongPtr.LongPtr. VBA enthält ab sofort einen Typalias für Variablen: LongPtr.VBA now includes the variable type alias 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.The actual data type that LongPtr resolves to depends on the version of Office that it is running in; LongPtr resolves to Long in 32-bit versions of Office, and LongPtr resolves to LongLong in 64-bit versions of Office. Verwenden Sie für Zeiger und Handles LongPtr.Use LongPtr for pointers and handles.

  • LongLong.LongLong. Der Datentyp LongLong ist eine vorzeichenbehaftete 64-Bit-Ganzzahl, die nur in 64-Bit-Versionen von Office verfügbar ist.The LongLong data type is a signed 64-bit integer that is only available on 64-bit versions of Office. Verwenden Sie LongLong für 64-Bit-Integrale.Use LongLong for 64-bit integrals. Konvertierungsfunktionen müssen verwendet werden, um LongLong (einschließlich LongPtr auf 64-Bit-Plattformen) kleineren ganzzahligen Typen zuzuweisen.Conversion functions must be used to explicitly assign LongLong (including LongPtr on 64-bit platforms) to smaller integral types. Implizite Umwandlungen von LongLong-Ausdrücken in kleinere Integrale sind nicht zulässig.Implicit conversions of LongLong to smaller integrals are not allowed.

  • PtrSafe.PtrSafe. Mit dem Schlüsselwort PtrSafe wird bestätigt, dass eine Declare-Anweisung sicher in einer 64-Bit-Office-Version ausgeführt werden kann.The PtrSafe keyword asserts that a Declare statement is safe to run in 64-bit versions of Office.

Wichtig

Alle Declare-Anweisungen müssen jetzt das Schlüsselwort PtrSafe enthalten, wenn Sie in 64-Bit-Versionen von Office ausgeführt werden.All Declare statements must now include the PtrSafe keyword when running in 64-bit versions of Office. Es ist wichtig zu wissen, dass durch das einfache Hinzufügen des Schlüsselworts PtrSafe zu einer Declare-Anweisung nur angegeben wird, dass die Declare-Anweisung explizit auf 64-Bit abzielt.It is important to understand that simply adding the PtrSafe keyword to a Declare statement only signifies that the Declare statement explicitly targets 64-bits. 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.All data types within the statement that need to store 64-bits (including return values and parameters) must still be modified to hold 64-bit quantities.

Hinweis

Als Syntax werden Declare-Anweisungen mit dem Schlüsselwort PtrSafe empfohlen.Declare statements with the PtrSafe keyword is the recommended syntax. Declare-Anweisungen, die PtrSafe enthalten, werden ordnungsgemäß in VBA 7-Entwicklungsumgebungen auf 32-Bit- und 64-Bit-Plattformen ausgeführt.Declare statements that include PtrSafe work correctly in the VBA7 development environment on both 32-bit and 64-bit platforms.

Um die Abwärtskompatibilität mit VBA Version 7 und früher sicherzustellen, verwenden Sie das folgende Konstrukt:To ensure backwards compatibility in VBA7 and earlier use the following construct:

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

Sehen Sie sich die folgenden Beispiele für die Declare-Anweisung an.Consider the following Declare statement examples. 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.Running the unmodified Declare statement in 64-bit versions of Office will result in an error indicating that the Declare statement does not include the PtrSafe qualifier. 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.The modified VBA example contains the PtrSafe qualifier, but notice that the return value (a pointer to the active window) returns a Long data type. In 64-Bit-Office ist dies falsch, da der Zeiger 64-Bit sein muss.On 64-bit Office, this is incorrect because the pointer needs to be 64-bits. Der Bezeichner PtrSafe teilt dem Compiler mit, dass die Declare-Anweisung 64-Bit anvisiert, daher wird die Anweisung ohne Fehler ausgeführt.The PtrSafe qualifier tells the compiler that the Declare statement is targeting 64-bits, so the statement executes without error. 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.But because the return value has not been updated to a 64-bit data type, the return value is truncated, resulting in an incorrect value returned.

Nachfolgend finden Sie ein Beispiel für eine unveränderte veraltete VBA-Declare-Anweisung:Following is an unmodified legacy VBA Declare statement example:

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:The following VBA Declare statement example is modified to include the PtrSafe qualifier but still use a 32-bit return value:

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.To reiterate, you must modify the Declare statement to include the PtrSafe qualifier, and you must update any variables within the statement that need to hold 64-bit quantities so that the variables use 64-bit data types.

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):Following is a VBA Declare statement example that is modified to include the PtrSafe keyword and is updated to use the proper 64-bit (LongPtr) data type:

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.In summary, for code to work in 64-bit versions of Office, you need to locate and modify all existing Declare statements to use the PtrSafe qualifier. 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.You also need to locate and modify all data types within these Declare statements that reference handles or pointers to use the new 64-bit compatible LongPtr type alias, and types that need to hold 64-bit integrals with the new LongLong data type. 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.Additionally, you must update any user defined types (UDTs) that contain pointers or handles and 64-bit integrals to use 64-bit data types, and verify that all variable assignments are correct to prevent type mismatch errors.

Schreiben von Code, der in 32-Bit- und 64-Bit-Office-Versionen funktioniertWriting code that works on both 32-bit and 64-bit Office

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.To write code that can port between both 32-bit and 64-bit versions of Office, you only need to use the new LongPtr type alias instead of Long or LongLong for all pointers and handle values. Der Typalias LongPtr löst sich in den richtigen Long- oder LongLong-Datentyp auf, je nachdem, welche Version von Office ausgeführt wird.The LongPtr type alias will resolve to the correct Long or LongLong data type depending on which version of Office is running.

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.Note that if you require different logic to execute, for example, you need to manipulate 64-bit values in large Excel projects, you can use the Win64 conditional compilation constant as shown in the following section.

Schreiben von Code, der in beiden Office 2010-Versionen (32-Bit oder 64-Bit) und in früheren Office-Versionen funktioniertWriting code that works on both Office 2010 (32-bit or 64-bit) and previous versions of Office

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.To write code that can work in both new and older versions of Office, you can use a combination of the new VBA7 and Win64 conditional Compiler constants. 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.The Vba7 conditional compiler constant is used to determine if code is running in version 7 of the VB editor (the VBA version that ships in Office 2010). Die Win64-Compilerkonstante wird verwendet, um zu bestimmen, welche Version von Office (32-Bit oder 64-Bit) ausgeführt wird.The Win64 conditional compiler constant is used to determine which version (32-bit or 64-bit) of Office is running.

#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-SprachupdatesSummary of VBA7 language updates

In der folgenden Tabelle sind die neuen VBA-Sprachenergänzungen mit Erläuterungen zusammengefasst.The following table summarizes the new VBA language additions and provides an explanation of each.

NameName TypType BeschreibungDescription
PtrSafePtrSafe SchlüsselwortKeyword Bestätigt, dass eine Declare-Anweisung für 64-Bit-Systeme ausgerichtet ist.Asserts that a Declare statement is targeted for 64-bit systems. Erforderlich für 64-Bit-Version.Required on 64-bits.
LongPtrLongPtr DatentypData type Typalias, der Long auf 32-Bit-Systemen oder LongLong auf 64-Bit-Systemen zuordnet.Type alias that maps to Long on 32-bit systems, or LongLong on 64-bit systems.
LongLongLongLong DatentypData type 8-Byte-Datentyp, der nur auf 64-Bit-Systemen verfügbar ist.8-byte data type that is only available on 64-bit systems. Numerischer Typ.Numeric type. Ganze Zahlen im Bereich von -9.223.372.036.854.775.808 bis 9.223.372.036.854.775.807.Integer numbers in the range of -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807.

LongLong ist nur für 64-Bit-Plattformen ein gültiger Deklarationstyp.LongLong is a valid declared type only on 64-bit platforms. Darüber hinaus kann LongLong möglicherweise nicht implizit in einen kleineren Typ konvertiert werden (z. B. kann LongLong nicht Long zugewiesen werden).Additionally, LongLong may not be implicitly converted to a smaller type (for example, you can't assign a LongLong to a Long). Auf diese Weise wird verhindert, dass ein Zeiger unbeabsichtigt abgeschnitten wird.This is done to prevent inadvertent pointer truncation.

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).Explicit coercions are allowed, so in the previous example, you could apply CLng to a LongLong and assign the result to a Long (valid on 64-bit platforms only).
^ LongLong-TypdeklarationszeichenLongLong type-declaration character Deklariert explizit einen Literalwert als einen LongLong-Datentyp.Explicitly declares a literal value as a LongLong. Erforderlich zum Deklarieren eines LongLong-Literals, das größer als der maximale Long-Wert ist (andernfalls wird es implizit in einen Double-Wert konvertiert).Required to declare a LongLong literal that is larger than the maximum Long value (otherwise it will get implicitly converted to double).
CLngPtrCLngPtr Typkonvertierungsfunktiontype conversion function Konvertiert einen einfachen Ausdruck in einen LongPtr-Datentyp.Converts a simple expression to a LongPtr.
CLngLngCLngLng Typkonvertierungsfunktiontype conversion function Konvertiert einen einfachen Ausdruck in einen LongLong-Datentyp (nur auf 64-Bit-Plattformen gültig).Converts a simple expression to a LongLong data type (valid on 64-bit platforms only).
vbLongLongvbLongLong VarType-KonstanteVarType constant Ganzzahl LongLong (nur auf 64-Bit-Plattformen gültig).LongLong integer (valid on 64-bit platforms only).
DefLngPtrDefLngPtr DefType-AnweisungDefType statement Legt für eine Reihe an Variablen den Standarddatentyp als LongPtr fest.Sets the default data type for a range of variables as LongPtr.
DefLngLngDefLngLng DefType-AnweisungDefType statement Legt für eine Reihe an Variablen den Standarddatentyp als LongLong fest.Sets the default data type for a range of variables as LongLong.

Siehe auchSee also

Support und FeedbackSupport and feedback

Haben Sie Fragen oder Feedback zu Office VBA oder zu dieser Dokumentation?Have questions or feedback about Office VBA or this documentation? Unter Office VBA-Support und Feedback finden Sie Hilfestellung zu den Möglichkeiten, wie Sie Support erhalten und Feedback abgeben können.Please see Office VBA support and feedback for guidance about the ways you can receive support and provide feedback.