(0) exportieren Drucken
Alle erweitern
Erweitern Minimieren
Dieser Artikel wurde maschinell übersetzt. Bewegen Sie den Mauszeiger über die Sätze im Artikel, um den Originaltext anzuzeigen.
Übersetzung
Original

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

Office 2013

Letzte Änderung: Dienstag, 6. Dezember 2011

Gilt für: Office 2013 | VBA

In diesem Artikel
Schreiben von Code, der in 32-Bit- und 64-Bit-Office-Versionen funktioniert
Schreiben von Code, der in beiden Microsoft Office 2010-Versionen (32-Bit oder 64-Bit) und in früheren Office-Versionen funktioniert
Zusammenfassung der VBA7-Sprachenaktualisierungen

Microsoft Visual Basic for Applications (VBA) ist die Visual Basic-Version, die im Lieferumfang von Microsoft Office enthalten ist. In Microsoft Office 2010 umfasst VBA Sprachenfeatures, mit denen VBA-Code sowohl in 32-Bit- als auch in 64-Bit-Umgebungen korrekt ausgeführt werden kann.

Hinweis Hinweis

Standardmäßig wird mit Office 2010 die 32-Bit-Version installiert. Die Installation der 64-Bit-Version muss während der Einrichtung explizit ausgewählt werden.

Das Ausführen von VBA-Code, der vor der Office 2010-Version auf einer 64-Bit-Plattform geschrieben wurde (VBA-Version 6 und älter), kann zu Fehlern führen, wenn der Code nicht so geändert wurde, dass er auch in 64-Bit-Office-Versionen ausgeführt werden kann. 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, ein 32-Bit- bzw. 4-Byte-Datentyp. Zeiger und Handles in 64-Bit-Umgebungen sind jedoch 8-Byte- bzw. 64-Bit-Größen, und diese 64-Bit-Größen sind mit 32-Bit-Datentypen nicht kompatibel.

Hinweis Hinweis

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

Das Problem mit dem Ausführen von VBA-Code aus Vorversionen in einer 64-Bit-Office-Version besteht darin, dass beim Laden von 64-Bit in einen 32-Bit-Datentyp die 64-Bit-Größe gekürzt wird. Dies kann zu Speicherüberläufen, unerwarteten Ergebnissen in Ihrem Code und Anwendungsfehlern führen.

Damit dieses Problem behoben wird und VBA-Code sowohl in 32-Bit- als auch in 64-Bit-Umgebungen ordnungsgemäß funktioniert, wurden VBA mehrere Sprachenfeatures hinzugefügt. In der Tabelle unten in diesem Dokument sind die neuen VBA-Sprachenfeatures zusammengefasst. Drei wichtige Ergänzungen sind der LongPtr-Typalias, der LongLong-Datentyp und das PtrSafe-Schlüsselwort.

  • 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 LongLong-Datentyp ist eine signierte ganze Zahl mit 64-Bit, die nur in 64-Bit-Office-Versionen verfügbar ist. Verwenden Sie für 64-Bit-Integrale LongLong. Konvertierungsfunktionen müssen verwendet werden, um LongLong (einschließlich LongPtr auf 64-Bit-Plattformen) kleineren Integraltypen explizit zuzuweisen. Implizite Konvertierungen von LongLong 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.

Alle Declare-Anweisungen müssen ab sofort das PtrSafe-Schlüsselwort enthalten, wenn sie in 64-Bit-Office-Versionen ausgeführt werden. Es muss beachtet werden, dass das einfache Hinzufügen des PtrSafe-Schlüsselworts zu einer Declare-Anweisung nur bedeutet, dass die Declare-Anweisung 64-Bits anvisiert; alle Datentypen innerhalb der Anweisung, die 64 Bit speichern müssen (einschließlich Rückgabewerten und Parameter), müssen dennoch bearbeitet werden, um 64-Bit-Größen zu verarbeiten.

Hinweis Hinweis

Für die Syntax werden Declare-Anweisungen mit dem PtrSafe-Schlüsselwort empfohlen. Declare-Anweisungen mit PtrSafe funktionieren ordnungsgemäß auf 32-Bit- und 64-Bit-Plattformen der VBA7-Entwicklungsumgebung. Verwenden Sie zur Gewährleistung von Abwärtskompatibilität in VBA7 und älteren Versionen das folgende Konstrukt:

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

Beachten Sie die folgenden Beispiele für Declare-Anweisungen. Das Ausführen einer unveränderten Declare-Anweisung in 64-Bit-Office-Versionen führt zu einem Fehler, nach dem die Declare-Anweisung nicht den PtrSafe-Qualifizierer enthält. Das geänderte VBA-Beispiel enthält zwar den PtrSafe-Qualifizierer, beachten Sie jedoch, dass der Rückgabewert (ein Zeiger zum aktiven Fenster) einen Long-Datentyp zurückgibt. Bei 64-Bit-Office-Versionen ist dies nicht korrekt, da der Zeiger 64-Bit groß sein muss. Der PtrSafe-Qualifizierer übermittelt dem Compiler, dass die Declare-Anweisung 64-Bit anvisiert, sodass die Anweisung ohne Fehler ausgeführt wird. Da jedoch der Rückgabewert nicht auf einen 64-Bit-Datentyp aktualisiert wurde, wird der Rückgabewert abgeschnitten, was dazu führt, dass ein falscher Wert zurückgegeben wird.

Beispiel für eine unveränderte VBA-Declare-Anweisung der Vorversion:

Declare Function GetActiveWindow Lib "user32" () As Long

Beispiel für eine geänderte VBA-Declare-Anweisung mit eingebundenem PtrSafe-Qualifizierer. Jedoch wird noch ein 32-Bit-Rückgabewert verwendet:

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

Für eine Wiederholung müssen Sie die Declare-Anweisung so ändern, dass der PtrSafe-Qualifizierer 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.

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

Zusammenfassend lässt sich festhalten, dass Sie alle vorhandenen Declare-Anweisungen lokalisieren und so ändern müssen, dass sie den PtrSafe-Qualifizierer verwenden, damit Code in 64-Bit-Office-Versionen funktioniert. Außerdem müssen Sie alle Datentypen innerhalb dieser Declare-Anweisungen, die auf Handles und Zeiger verweisen, lokalisieren und so ändern, dass sie den neuen 64-Bit-kompatiblen LongPtrTypalias verwenden. Dies gilt auch für Typen, die 64-Bit-Integrale mit dem neuen LongLong-Datentyp verarbeiten müssen. Weiterhin müssen Sie alle benutzerdefinierten Typen (UDTs) aktualisieren, die Zeiger oder Handles enthalten, sowie 64-Bit-Integrale, damit sie 64-Bit-Datentypen verwenden. Überprüfen Sie auch, ob alle Variablenzuweisungen korrekt sind, um Fehler aufgrund fehlender Typenübereinstimmungen zu verhindern.

Um Code zu schreiben, der Übertragungen zwischen 32-Bit- und 64-Bit-Office-Versionen ermöglicht, müssen Sie für alle Zeiger- und Handlewerte nur den neuen LongPtr-Typalias anstelle von Long oder LongLong verwenden. Der LongPtr-Typalias wird abhängig von der ausgeführten Office-Version in den richtigen Long- oder LongLong-Datentyp aufgelöst. Beachten Sie, dass Sie, wie im folgenden Abschnitt gezeigt, die bedingte Kompilierungskonstante Win64 verwenden können, wenn Sie zum Ausführen eine andere Logik benötigen, zum Beispiel wenn Sie 64-Bit-Werte in großen Microsoft Excel-Projekten ändern müssen.

Um Code zu schreiben, der in neuen und älteren Office-Versionen funktioniert, können Sie eine Kombination der neuen bedingten VBA7- und Win64-Kompilierungskonstanten verwenden. Die bedingte VBA7-Kompilierungskonstante wird verwendet, um zu ermitteln, ob Code in Version 7 des VB-Editors (VBA-Version im Lieferumfang von Office 2010) ausgeführt wird. Die bedingte Win64-Kompilierungskonstante wird verwendet, um zu ermitteln, welche Office-Version (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 

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 bei 64-Bit-Versionen.

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 auf 64-Bit-Plattform ein gültiger deklarierter Typ. Außerdem kann LongLong möglicherweise nicht implizit in einen kleineren Typ konvertiert werden (zum Beispiel können Sie einen LongLong-Datentyp keinem Long-Datentyp zuweisen). So soll eine unbeabsichtigte Zeigerverkürzung verhindert werden. Explizite Koersionen sind wie im Beispiel oben zulässig; Sie könnten CLng bei einem LongLong-Datentyp anwenden und das Ergebenis 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

VarType-Konstante.

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.

Microsoft führt eine Onlineumfrage durch, um Ihre Meinung zur MSDN-Website zu erfahren. Wenn Sie sich zur Teilnahme entscheiden, wird Ihnen die Onlineumfrage angezeigt, sobald Sie die MSDN-Website verlassen.

Möchten Sie an der Umfrage teilnehmen?
Anzeigen:
© 2014 Microsoft