Kompatibilität zwischen der 32-Bit- und der 64-Bit-Version von OfficeCompatibility between the 32-bit and 64-bit versions of Office

Hier finden Sie Informationen zur Kompatibilität zwischen der 32-Bit- und der 64-Bit-Version von Office.Find out how the 32-bit version of Office is compatible with the 64-bit version of Office.

Office-Anwendungen stehen als 32-Bit- und 64-Bit-Version zur Verfügung.Office applications are available in 32-bit and 64-bit versions.

Mit der 64-Bit-Version von Office können Sie mehr Daten für erweiterte Funktionen verschieben, zum Beispiel beim Arbeiten mit großen Zahlen in Microsoft Excel 2010.The 64-bit versions of Office enable you to move more data around for increased capability, for example when you work with large numbers in Microsoft Excel 2010. Wenn Sie 32-Bit-Code schreiben, können Sie die 64-Bit-Version von Office verwenden, ohne daran Änderungen vorzunehmen.When writing 32-bit code, you can use the 64-bit version of Office without any changes. Wenn Sie 64-Bit-Code schreiben, sollten Sie jedoch sicherstellen, dass der Code bestimmte Schlüsselwörter und Konstanten für bedingte Kompilierung enthält, um sicherzustellen, dass der Code mit früheren Versionen von Office abwärtskompatibel ist, und, dass der richtige Code ausgeführt wird, wenn Sie 32-Bit- und 64-Bit-Code kombinieren.However, when you write 64-bit code, you should ensure that your code contains specific keywords and conditional compilation constants to ensure that the code is backward compatible with earlier version of Office, and that the correct code is being executed if you mix 32-bit and 64-bit code.

Visual Basic for Applications 7.0 (VBA-7) ist in 64-Bit-Versionen für Office veröffentlicht und kann sowohl mit 32-Bit- als auch 64-Bit-Anwendungen verwendet werden.Visual Basic for Applications 7.0 (VBA 7) is released in the 64-bit versions for Office, and it works with both 32-bit and 64-bit applications. Die in diesem Artikel beschriebenen Änderungen gelten nur für 64-Bit-Versionen von Office.The changes described in this article apply only to the 64-bit versions of Office. Mit 32-Bit-Versionen von Microsoft Office können Sie die in früheren Versionen von Office integrierten Lösungen verwenden, ohne weitere Änderungen vorzunehmen.Using the 32-bit versions of Microsoft Office enable you to use solutions built in previous versions of Office without further modifications.

Hinweis

Standardmäßig installieren Sie bei der Installation einer 64-Bit-Version von Office auch die 32-Bit-Version, wenn das 64-Bit-System verwendet wird.By default, when you install a 64-bit version of Office, you also install the 32-bit version is installed along with the 64-bit system. Sie müssen explizit die Installationsoption für die 64-Bit-Version von Microsoft Office auswählen.You must explicitly select the Microsoft Office 64-bit version installation option.

In VBA 7 müssen Sie die vorhandenen Windows-API-Anweisungen (Declare-Anweisungen) aktualisieren, damit Sie mit der 64-Bit-Version verwendet werden können.In VBA 7, you must update existing Windows API statements (Declare statements) to work with the 64-bit version. Darüber hinaus müssen Sie die Adresszeiger und Anzeigefensterhandles in benutzerdefinierten Typen aktualisieren, die von diesen Anweisungen verwendet werden.Additionally, you must update address pointers and display window handles in user-defined types that are used by these statements. Dies sowie Kompatibilitätsprobleme zwischen den 32-Bit- und 64-Bit-Versionen und die zugehörigen Lösungen werden genau in diesem Artikel erläutert.This is discussed in more detail in this article as well as compatibility issues between the 32-bit and 64-bit versions and suggested solutions.

Vergleich von 32-Bit- und 64-Bit-SystemenComparing 32-bit and 64-bit systems

Anwendungen, die mit 64-Bit-Versionen von Office erstellt wurden, können auf größere Adressräume als 32-Bit-Versionen verweisen.Applications built with the 64-bit versions of Office can reference larger address spaces than 32-bit versions. Dies bedeutet, dass Sie mehr physischen Speicher für Daten als vorher verwenden können und so den potenziellen Mehraufwand für das Verschieben von Daten in und aus dem physischen Speicher reduzieren können.This means you can use more physical memory for data than before, potentially reducing the overhead spent moving data in and out of physical memory

Zusätzlich zu Verweisen auf bestimmte Stellen (als Zeiger bezeichnet) im physischen Speicher können Sie auch Adressen verwenden, um auf Anzeigefensterbezeichner (als Handles bezeichnet) zu verweisen.In addition to referring specific locations (known as pointers) in physical memory, you can also use addresses to reference display window identifiers (known as handles). Die Größe (in Byte) des Zeigers oder Handles hängt davon ab, ob Sie ein 32-Bit- oder 64-Bit-System verwenden.The size (in bytes) of the pointer or handle depends on whether you're using a 32-bit or 64-bit system.

Wenn Sie Ihre vorhandenen Lösungen mit 64-Bit-Versionen von Office ausführen möchten, beachten Sie die folgenden Punkte:If you want to run your existing solutions with the 64-bit versions of Office, be aware of the following:

  • Von systemeigenen 64-Bit-Prozessen in Office können keine 32-Bit-Binärdateien geladen werden.Native 64-bit processes in Office cannot load 32-bit binaries. Dieses Problem tritt häufig auf, wenn bereits Microsoft ActiveX-Steuerelemente und Add-Ins vorhanden sind.This is expected to be a common issue when you have existing Microsoft ActiveX controls and existing add-ins.

  • VBA hatte zuvor keinen pointer-Datentyp, sodass Sie 32-Bit-Variablen zum Speichern von Zeigern und Handles verwenden mussten.VBA previously didn't have a pointer data type, so you had to use 32-bit variables to store pointers and handles. Mit diesen Variablen werden nun die von API-Aufrufen zurückgegebenen 64-Bit-Werte abgeschnitten, wenn Sie Declare-Anweisungen verwenden.These variables now truncate 64-bit values returned by API calls when using Declare statements.

VBA 7-CodebasisVBA 7 code base

Die VBA-Codebasis in Office 2007 und früheren Versionen wird durch VBA 7 ersetzt.VBA 7 replaces the VBA code base in Office 2007 and earlier versions. VBA 7 ist sowohl in 32-Bit- als auch in 64-Bit-Versionen von Office verfügbar.VBA 7 is available in both the 32-bit and 64-bit versions of Office. Dies bietet zwei Konstanten für die bedingte Kompilierung:It provides two conditional compilation constants:

  • VBA7 – Stellt Abwärtskompatibilität des Codes sicher, indem getestet wird, ob die Anwendung VBA 7 oder die ältere Version von VBA verwendet.VBA7 - Helps ensure the backward compatibility of your code by testing whether your application is using VBA 7 or the previous version of VBA.

  • Win64 – Überprüft, ob der Code als 32-Bit- oder 64-Bit-Version ausgeführt wird.Win64 Tests whether code is running as 32-bit or 64-bit.

Die Markos in einem Dokument, die in der 32-Bit-Version der Anwendung funktionieren, funktionieren, mit einigen Ausnahmen, auch in der 64-Bit-Version.With certain exceptions, the macros in a document that work in the 32-bit version of the application also work in the 64-bit version.

Kompatibilität mit ActiveX-Steuerelementen und COM-Add-InsActiveX control and COM add-in compatibility

Vorhandene 32-Bit-ActiveX-Steuerelemente sind nicht mit 64-Bit-Versionen von Office kompatibel.Existing 32-bit ActiveX controls, are not compatible with the 64-bit versions of Office. Für ActiveX-Steuerelemente und COM-Objekte:For ActiveX controls and COM objects:

  • Wenn der Quellcode verfügbar ist, generieren Sie selbst eine 64-Bit-Version.If you have the source code, generate a 64-bit version yourself.
  • Wenn Sie nicht über den Quellcode verfügen, wenden Sie sich an den Anbieter, um eine aktualisierte Version zu erhalten.If you don't have the source code, contact the vendor for an updated version.

Von systemeigenen 64-Bit-Prozessen in Office können keine 32-Bit-Binärdateien geladen werden.Native 64-bit processes in Office cannot load 32-bit binaries. Dies umfasst die allgemeinen Steuerelemente von MSComCtl (TabStrip, Toolbar, StatusBar, ProgressBar, TreeView, ListViews, ImageList, Slider, ImageComboBox) und die Steuerelemente von MSComCt2 (Animation, UpDown, MonthView, DateTimePicker, FlatScrollBar).This includes the common controls of MSComCtl (TabStrip, Toolbar, StatusBar, ProgressBar, TreeView, ListViews, ImageList, Slider, ImageComboBox) and the controls of MSComCt2 (Animation, UpDown, MonthView, DateTimePicker, FlatScrollBar). Diese Steuerelemente wurden von 32-Bit-Office-Versionen von älteren Office-Versionen als Office 2010 installiert.These controls were installed by 32-bit versions of Office earlier than Office 2010. Sie müssen eine Alternative für Ihre vorhandenen VBA-Lösungen finden, die diese Steuerelemente verwenden, wenn Sie den Code zu 64-Bit-Versionen von Office migrieren.You'll need to find an alternative for your existing VBA solutions that use these controls when you migrate the code to the 64-bit versions of Office.

API-KompatibilitätAPI compatibility

Die Kombination von VBA und Typbibliotheken bietet viele Funktionen zum Erstellen von Office-Anwendungen.The combination of VBA and type libraries gives you lots of functionality to create Office applications. Manchmal müssen Sie allerdings direkt mit dem Betriebssystem des Computers und andere Komponenten kommunizieren, zum Beispiel wenn Sie Arbeitsspeicher oder Prozesse verwalten, bei der Arbeit mit Benutzeroberflächenelementen wie Fenster und Steuerelemente oder beim Ändern der Windows-Registrierung.However, sometimes you must communicate directly with the computer's operating system and other components, such as when you manage memory or processes, when working with UI elements linke windows and controls, or when modifying the Windows registry. In den folgenden Szenarien wird empfohlen, eine der in DLL-Dateien eingebetteten externen Funktionen zu verwenden.In these scenarios, your best option is to use one of the external functions that are embedded in DLL files. Dies können Sie in VBA erledigen, indem Sie API-Aufrufe mithilfe von Declare-Anweisungen ausführen.You do this in VBA by making API calls using Declare statements.

Hinweis

Microsoft bietet eine Datei „Win32API.txt“ mit 1.500 Declare-Anweisungen und ein Tool zum Kopieren von Declare-Anweisungen in Code.Microsoft provides a Win32API.txt file that contains 1,500 Declare statements and a tool to copy the Declare statement that you want into your code. Diese Anweisungen sind jedoch für 32-Bit-Systeme vorgesehen und müssen anhand der später in diesem Artikel erläuterten Informationen in 64 Bit konvertiert werden.However, these statements are for 32-bit systems and must be converted to 64-bit by using the information discussed later in this article. Vorhandene Declare-Anweisungen werden erst in der 64-Bit-Version von VBA kompiliert, wenn Sie mit dem PtrSafe-Attribut als sicher für die 64-Bit-Version gekennzeichnet sind.Existing Declare statements won't compile in 64-bit VBA until they've been marked as safe for 64-bit by using the PtrSafe attribute. Beispiele für diesen Typ der Konvertierung finden Sie auf der Website des Excel-MVPs Jan Karel Pieterse unter https://www.jkp-ads.com/articles/apideclarations.asp.You can find examples of this type of conversion at Excel MVP Jan Karel Pieterse's website at https://www.jkp-ads.com/articles/apideclarations.asp. Das Benutzerhandbuch zum Office Code Compatibility Inspector ist hilfreich, wenn es darum geht, die Syntax der Declare-Anweisungen der API für das PtrSafe-Attribut und die entsprechenden Rückgabetypen zu prüfen.The Office Code Compatibility Inspector user's guide is a useful tool to inspect the syntax of API Declare statements for the PtrSafe attribute, if needed, and the appropriate return type.

Declare-Anweisungen ähneln folgendem Code, je nachdem, ob Sie eine Unterroutine (kein Rückgabewert) oder eine Funktion (mit Rückgabewert) aufrufen.Declare statements resemble one of the following, depending on whether you are calling a subroutine (which has no return value) or a function (which does have a return value).

Public/Private Declare Sub SubName Lib "LibName" Alias "AliasName" (argument list)
Public/Private Declare Function FunctionName Lib "Libname" alias "aliasname" (argument list) As Type

Die SubName-Funktion oder FunctionName-Funktion wird durch den tatsächlichen Namen der Prozedur in der DLL-Datei ersetzt und steht für den Namen, der verwendet wird, wenn die Prozedur über VBA-Code aufgerufen wird.The SubName function or FunctionName function is replaced by the actual name of the procedure in the DLL file and represents the name that is used when the procedure is called from VBA code. Sie können auch ein AliasName-Argument für den Namen der Prozedur angeben.You can also specify an AliasName argument for the name of the procedure. Der Name der DLL-Datei, die die aufgerufene Prozedur enthält, folgt dem Lib-Schlüsselwort.The name of the DLL file that contains the procedure being called follows the Lib keyword. Die Argumentlist enthält schließlich die Parameter und die Datentypen, die an die Prozedur übergeben werden müssen.And finally, the argument list contains the parameters and the data types that must be passed to the procedure.

Mit der folgenden Declare-Anweisung wird ein Unterschlüssel in der Windows-Registrierung geöffnet und der Wert ersetzt.The following Declare statement opens a subkey in the Windows registry and replaces its value.

Declare Function RegOpenKeyA Lib "advapi32.dll" (ByVal Key As Long, ByVal SubKey As String, NewKey As Long) As Long

Der Eintrag „Windows.h (Fensterhandle)“ für die RegOpenKeyA-Funktion lautet wie folgt:The Windows.h (window handle) entry for the RegOpenKeyA function is as follows:

LONG RegOpenKeyA ( HKEY hKey, LPCSTR lpSubKey, HKEY *phkResult );

In Visual C und Microsoft Visual C++ wird das vorherige Beispiel korrekt für 32-Bit- und 64-Bit-Versionen kompiliert.In Visual C and Microsoft Visual C++, the previous example compiles correctly for both 32-bit and 64-bit. Dies liegt daran, dass HKEY als Zeiger definiert ist, dessen Größe der Speichergröße der Plattform entspricht, in der der Code kompiliert wird.This is because HKEY is defined as a pointer, whose size reflects the memory size of the platform that the code is compiled in.

In älteren Versionen von VBA gab es keinen bestimmten pointer-Datentyp, sodass der Datentyp Long verwendet wurde.In previous versions of VBA, there was no specific pointer data type so the Long data type was used. Da der Long-Datentyp immer 32 Bit aufweist, wird dieser bei Verwendung auf einem System mit 64-Bit-Arbeitsspeicher gebrochen, weil die oberen 32 Bit möglicherweise abgeschnitten oder andere Arbeitsspeicheradressen überschrieben werden.And because the Long data type is always 32-bits, this breaks when used on a system with 64-bit memory because the upper 32-bits might be truncated or might overwrite other memory addresses. Eine dieser Situationen können zum unvorhersehbaren Verhalten oder zu Systemabstürzen führen.Either of these situations can result in unpredictable behavior or system crashes.

Um dieses Problem zu beheben, enthält VBA einen wahren pointer-Datentyp: LongPtr.To resolve this, VBA includes a true pointer data type: LongPtr. Mit diesem neuen Datentyp können Sie die ursprüngliche Declare-Anweisung korrekt schreiben als:This new data type enables you to write the original Declare statement correctly as:

Declare PtrSafe Function RegOpenKeyA Lib "advapire32.dll" (ByVal hKey as LongPtr, ByVal lpSubKey As String, phkResult As LongPtr) As Long

Mit diesem Datentyp und dem neuen PtrSafe-Attribut können Sie diese Declare-Anweisung sowohl auf 32-Bit- oder 64-Bit-Systemen verwenden.This data type and the new PtrSafe attribute enable you to use this Declare statement on either 32-bit or 64-bit systems. Das PtrSafe-Attribut gibt dem VBA-Compiler an, die die Declare-Anweisung auf die 64-Bit-Version von Office abzielt.The PtrSafe attribute indicates to the VBA compiler that the Declare statement is targeted for the 64-bit version of Office. Ohne dieses Attribut tritt beim Verwenden der Declare-Anweisung in einem 64-Bit-System ein Kompilierungszeitfehler auf.Without this attribute, using the Declare statement in a 64-bit system will result in a compile-time error. Das PtrSafe-Attribut ist bei der 32-Bit-Version von Office optional.The PtrSafe attribute is optional on the 32-bit version of Office. Dadurch funktionieren vorhandene Declare-Anweisungen wie gewohnt.This enables existing Declare statements to work as they always have.

Die folgende Tabelle enthält weitere Informationen zum neuen Qualifizierer und Datentyp sowie zu einem weiteren Datentyp, zwei Konvertierungsoperatoren und drei Funktionen.The following table provides more information about the new qualifier and data typeas well as another data type, two conversion operators, and three functions.

TypType ElementItem BeschreibungDescription
QualifiziererQualifier
PtrSafePtrSafe
Gibt an, dass die Declare-Anweisung mit der 64-Bit-Version kompatibel ist. Dieses Attribut ist auf 64-Bit-Systemen erforderlich. Indicates that the Declare statement is compatible with 64-bits. This attribute is mandatory on 64-bit systems.
DatentypData Type
LongPtrLongPtr
Ein Datentyp der Variablen, bei dem es sich um einen 4-Byte-Datentyp auf 32-Bit-Versionen und um einen 8-Byte-Datentyp auf 64-Bit-Versionen von Microsoft Office handelt.A variable data type which is a 4-bytes data type on 32-bit versions and an 8-byte data type on 64-bit versions of Microsoft Office. Dies ist die empfohlene Methode zum Deklarieren eines Zeigers oder eines Handles für neuen Code sowie für älteren Code, wenn er in der 64-Bit-Version von Office ausgeführt werden muss.This is the recommended way of declaring a pointer or a handle for new code but also for legacy code if it has to run in the 64-bit version of Office. Er wird nur in der VBA 7-Laufzeit bei 32-Bit- und 64-Bit-Versionen unterstützt.It is only supported in the VBA 7 runtime on 32-bit and 64-bit. Beachten Sie, dass Sie diesem Datentyp numerische Werte, jedoch keine numerischen Typen zuweisen können.Note that you can assign numeric values to it but not numeric types.
DatentypData Type
LongLongLongLong
Dies ist ein 8-Byte-Datentyp, der nur in 64-Bit-Versionen von Microsoft Office verfügbar ist.This is an 8-byte data type which is available only in 64-bit versions of Microsoft Office. Sie können numerische Werte, jedoch keine numerischen Typen zuweisen (um Kürzungen zu vermeiden).You can assign numeric values but not numeric types (to avoid truncation).
Operator für die KonvertierungConversion Operator
CLngPtrCLngPtr
Konvertiert einen einfachen Ausdruck in einen LongPtr-Datentyp.Converts a simple expression to a LongPtr data type.
Operator für die KonvertierungConversion Operator
CLngLngCLngLng
Konvertiert einen einfachen Ausdruck in einen LongLong-Datentyp.Converts a simple expression to a LongLong data type.
FunktionFunction
VarPtrVarPtr
Variantkonverter. Gibt einen LongPtr-Datentyp auf 64-Bit-Versionen zurück und einen Long-Datentyp auf 32-Bit-Versionen (4 Byte) zurück. Variant converter. Returns a LongPtr on 64-bit versions, and a Long on 32-bit versions (4 bytes).
FunktionFunction
ObjPtrObjPtr
Objektkonverter. Gibt einen LongPtr-Datentyp auf 64-Bit-Versionen zurück und einen Long-Datentyp auf 32-Bit-Versionen (4 Byte) zurück. Object converter. Returns a LongPtr on 64-bit versions, and a Long on 32-bit versions (4 bytes).
FunktionFunction
StrPtrStrPtr
Zeichenfolgenkonverter. Gibt einen LongPtr-Datentyp auf 64-Bit-Versionen zurück und einen Long-Datentyp auf 32-Bit-Versionen (4 Byte) zurück. String converter. Returns a LongPtr on 64-bit versions, and a Long on 32-bit versions (4 bytes).

Im folgenden Beispiel wird gezeigt, wie Sie einige dieser Elemente in einer Declare-Anweisung verwenden können.The follow example shows how to use some of these items in a Declare statement.

Declare PtrSafe Function RegOpenKeyA Lib "advapi32.dll" (ByVal Key As LongPtr, ByVal SubKey As String, NewKey As LongPtr) As Long

Beachten Sie, dass Declare-Anweisungen ohne das PtrSafe-Attribut im Allgemeinen nicht mit der 64-Bit-Version von Office kompatibel sind.Note that Declare statements without the PtrSafe attribute are assumed not to be compatible with the 64-bit version of Office.

Es gibt zwei Konstanten für die bedingte Kompilierung: VBA7 und Win64.There are two conditional compilation constants: VBA7 and Win64. Um Abwärtskompatibilität mit älteren Versionen von Microsoft Office sicherzustellen, verwenden Sie die VBA7-Konstante (Dies ist der häufigere Fall), damit 64-Bit-Code nicht in älteren Versionen von Office verwendet wird.To ensure backward compatibility with previous versions of Microsoft Office, you use the VBA7 constant (this is the more typical case) to prevent 64-bit code from being used in the earlier version of Office. Bei Code, der zwischen der 32-Bit- und der 64-Bit-Version variiert, zum Beispiel beim Aufrufen einer Mathematik-API, die einen LongLong-Datentyp für die 64-Bit-Version und einen Long-Datentyp für die 32-Bit-Version verwendet, müssen Sie die Win64-Konstante verwenden.For code that is different between the 32-bit version and the 64-bit version, such as calling a math API that uses LongLong for its 64-bit version and Long for its 32-bit version, you use the Win64 constant. Der folgende Code zeigt die Verwendung dieser beiden Konstanten.The following code shows the use of these two constants.

#if Win64 then
   Declare PtrSafe Function MyMathFunc Lib "User32" (ByVal N As LongLong) As LongLong
#else
   Declare Function MyMathFunc Lib "User32" (ByVal N As Long) As Long
#end if
#if VBA7 then
   Declare PtrSafe Sub MessageBeep Lib "User32" (ByVal N AS Long)
#else
   Declare Sub MessageBeep Lib "User32" (ByVal N AS Long)
#end if

Zusammenfassung: Wenn Sie 64-Bit-Code schreiben und dieser in älteren Versionen von Office verwendet werden soll, sollten Sie die VBA7-Konstante für die bedingte Kompilierung verwenden.To summarize, if you write 64-bit code and intend to use it in previous versions of Office, you will want to use the VBA7 conditional compilation constant. Wenn Sie jedoch 32-Bit-Code in Office schreiben, kann dieser Code in älteren Versionen von Office verwendet werden, ohne dass Sie Änderungen vornehmen und ohne dass die Konstante für bedingte Kompilierung erforderlich ist.However, if you write 32-bit code in Office, that code works as is in previous versions of Office without the need for the compilation constant. Wenn Sie sicherstellen möchten, dass Sie 32-Bit-Anweisungen für 32-Bit-Versionen und 64-Bit-Anweisungen für 64-Bit-Versionen verwenden, wird empfohlen, die Win64-Konstante für die bedingte Kompilierung zu verwenden.If you want to ensure that you are using 32-bit statements for 32-bit versions and 64-bit statements for 64-bit versions, your best option is to use the Win64 conditional compilation constant.

Verwenden von bedingten KompilierungsattributenUsing conditional compilation attributes

Das folgende Beispiel zeigt für 32-Bit-Versionen geschriebenen VBA-Code, der aktualisiert werden muss.The following example shows VBA code written for 32-bit that needs to be updated. Beachten Sie die Datentypen im älteren Code, die für die Verwendung von LongPtr aktualisiert werden, da sie auf Handles oder Zeiger verweisen.Notice the data types in the legacy code that are updated to use LongPtr because they refer to handles or pointers.

Für 32-Bit-Versionen geschriebener VBA-CodeVBA code written for 32-bit versions

Declare Function SHBrowseForFolder Lib "shell32.dll" _
  Alias "SHBrowseForFolderA" (lpBrowseInfo As BROWSEINFO) As Long
  
Public Type BROWSEINFO
  hOwner As Long
  pidlRoot As Long
  pszDisplayName As String
  lpszTitle As String
  ulFlags As Long
  lpfn As Long
  lParam As Long
  iImage As Long
End Type

Für 64-Bit-Versionen neu geschriebener VBA-CodeVBA code rewritten for 64-bit versions

#if VBA7 then    ' VBA7 
Declare PtrSafe Function SHBrowseForFolder Lib "shell32.dll" _
  Alias "SHBrowseForFolderA" (lpBrowseInfo As BROWSEINFO) As Long
Public Type BROWSEINFO
  hOwner As LongPtr
  pidlRoot As Long
  pszDisplayName As String
  lpszTitle As String
  ulFlags As Long
  lpfn As LongPtr
  lParam As LongPtr
  iImage As Long
End Type
 
#else    ' Downlevel when using previous version of VBA7
Declare Function SHBrowseForFolder Lib "shell32.dll" _
  Alias "SHBrowseForFolderA" (lpBrowseInfo As BROWSEINFO) As Long
Public Type BROWSEINFO
  hOwner As Long
  pidlRoot As Long
  pszDisplayName As String
  lpszTitle As String
  ulFlags As Long
  lpfn As Long
  lParam As Long
  iImage As Long
End Type
 
#end if
Sub TestSHBrowseForFolder ()
    Dim bInfo As BROWSEINFO
    Dim pidList As Long
    bInfo.pidlRoot = 0&
    bInfo.ulFlags = &H1
    pidList = SHBrowseForFolder(bInfo)
End Sub

Häufig gestellte FragenFrequently asked questions

Wann sollte ich die 64-Bit-Version von Office verwenden?When should I use the 64-bit version of Office?

Dies ist eher eine Frage der Hostanwendung (Excel, Word usw.), die Sie verwenden.This is more a matter of which host application (Excel, Word, and so forth) you are using. Excel kann zum Beispiel viel größere Arbeitsblätter in der 64-Bit-Version von Microsoft Office verarbeiten.For example, Excel is able to handle much larger worksheets with the 64-bit version of Microsoft Office.

Kann ich sowohl die 64-Bit- als auch die 32-Bit-Version von Office gleichzeitig installieren?Can I install 64-bit and 32-bit versions of Office side-by-side?

Nein.No.

Wann sollte ich Long-Parameter in LongPtr-Parameter konvertieren?When should I convert Long parameters to LongPtr?

Lesen Sie hierzu die entsprechenden Informationen zu der Funktion, die Sie aufrufen möchten, in der Windows-API-Dokumentation im MSDN.You need to check the Windows API documentation on the Microsoft Developers Network for the function you want to call. Handles und Zeiger müssen in LongPtr-Datentypen konvertiert werden.Handles and pointers need to be converted to LongPtr. Die Dokumentation für RegOpenKeyA bietet zum Beispiel die folgende Signatur:As an example, the documentation for RegOpenKeyA provides the following signature:

LONG WINAPI RegOpenKeyEx(
  __in        HKEY hKey,
  __in_opt    LPCTSTR lpSubKey,
  __reserved  DWORD ulOptions,
  __in        REGSAM samDesired,
  __out       PHKEY phkResult
);

Die Parameter sind wie folgt definiert:The parameters are defined as:

ParameterParameter BeschreibungDescription
hKey [in]hKey [in]
Ein Handle zu einem geöffneten Registrierungsschlüssel.A handle to an open registry key.
lpSubKey [in, optional]lpSubKey [in, optional]
Der Name des Registrierungsunterschlüssels, der geöffnet werden soll.The name of the registry subkey to be opened.
ulOptionsulOptions
Dieser Parameter ist reserviert und muss 0 lauten.This parameter is reserved and must be zero.
samDesired [in]samDesired [in]
Eine Maske, die die gewünschten Zugriffsrechte für den Schlüssel angibt.A mask that specifies the desired access rights to the key.
phkResult [out]phkResult [out]
Ein Zeiger auf eine Variable, die ein Handle zum geöffneten Schlüssel erhält.A pointer to a variable that receives a handle to the opened key.

In der Datei Win32API_PtrSafe.txt wird die Declare-Anweisung wie folgt definiert:In Win32API_PtrSafe.txt, the Declare statement is defined as:

Declare PtrSafe Function RegOpenKeyEx Lib "advapi32.dll" Alias "RegOpenKeyExA" (ByVal hKey As LongPtr , ByVal lpSubKey As String, ByVal ulOptions As Long, ByVal samDesired As Long, phkResult As LongPtr ) As Long

Muss ich Zeiger und Handles in Strukturen konvertieren?Should I convert pointers and handles in structures?

Ja.Yes. Informationen dazu finden Sie in der Datei „Win32API_PtrSafe.txt“ unter MSG-Typ:See the MSG type in Win32API_PtrSafe.txt:

Type MSG
    hwnd As LongPtr 
    message As Long
    wParam As LongPtr 
    lParam As LongPtr 
    time As Long
    pt As POINTAPI
End TypeF

Wann sollte ich strptr, varpt und objptr verwenden?When should I use strptr, varpt, and objptr?

Sie sollten diese Funktionen verwenden, um Zeiger auf Zeichenfolgen, Variablen und Objekte abzurufen.You should use these functions to retrieve pointers to strings, variables and objects, respectively. In der 64-Bit-Version von Office geben diese Funktionen den 64-Bit-Datentyp LongPtr, der an die Declare-Anweisungen übergeben werden kann.On the 64-bit version of Office, these functions will return a 64-bit LongPtr, which can be passed to Declare statements. Die Verwendung dieser Funktionen hat sich seit den älteren Versionen von VBA nicht geändert.The use of these functions has not changed from previous versions of VBA. Der einzige Unterschied besteht darin, dass sie jetzt einen LongPtr-Datentyp zurückgeben.The only difference is that they now return a LongPtr.

Siehe auchSee also