Kompatibilität zwischen der 32-Bit-Version und der 64-Bit-Version von Office 2010

Zusammenfassung: Für Kunden, die mit großen Datenmengen arbeiten, ist Microsoft Office 2010 jetzt als 64-Bit-Version verfügbar. In diesem Artikel werden Probleme rund um die Kompatibilität der 32-Bit-Version mit der neuen 64-Bit-Version sowie mit älteren 32-Bit-Office-Anwendungen beschrieben und Lösungen vorgestellt. (7 gedruckte Seiten)

Letzte Änderung: Freitag, 24. April 2015

Gilt für: Excel 2010 | Office 2007 | Office 2010 | Open XML | PowerPoint 2010 | SharePoint Server 2010 | VBA | Visual Basic for Applications 7.0 (VBA 7.0) | Word 2010

Inhalt dieses Artikels
Einführung in die 32-Bit- und 64-Bit-Version von Microsoft Office 2010
32-Bit-Systeme und 64-Bit-Systeme im Vergleich
Einführung in die VBA 7-Codebasis
Kompatibilität mit ActiveX-Steuerelementen und COM-Add-Ins
API-Kompatibilität
Verwenden von bedingten Kompilierungsattributen
Häufig gestellte Fragen
Fazit
Zusätzliche Ressourcen

Applies to:   Microsoft Office 2010

Veröffentlicht: März 2010

Bereitgestellt von: Microsoft Corporation

Inhalt

  • Einführung in die 32-Bit- und 64-Bit-Version von Microsoft Office 2010

  • 32-Bit-Systeme und 64-Bit-Systeme im Vergleich

  • Einführung in die VBA 7-Codebasis

  • Kompatibilität mit ActiveX-Steuerelementen und COM-Add-Ins

  • API-Kompatibilität

  • Verwenden von bedingten Kompilierungsattributen

  • Häufig gestellte Fragen

  • Fazit

  • Zusätzliche Ressourcen

Einführung in die 32-Bit- und 64-Bit-Version von Microsoft Office 2010

Microsoft Office 2010 ist sowohl als 32-Bit- als auch als 64-Bit-Version verfügbar. Mit der 64-Bit-Version können deutlich größere Datensätze bearbeitet werden. Dies ist insbesondere bei der Arbeit mit hohen Zahlen in Microsoft Excel 2010 erforderlich.

Mit der Einführung der neuen 64-Bit-Version von Microsoft Office 2010 wird auch eine neue Version von Microsoft Visual Basic für Applikationen (VBA) veröffentlicht: Microsoft Visual Basic für Applikationen 7.0 (VBA 7). Diese Version unterstützt sowohl 32-Bit- als auch 64-Bit-Anwendungen. Die Änderungen, auf die in diesem Artikel eingegangen wird, gelten nur für die 64-Bit-Version von Microsoft Office 2010. Mit der 32-Bit-Version von Office 2010 können Lösungen, die in früheren Versionen von Microsoft Office erstellt wurden, unverändert verwendet werden.

Hinweis

Bei der Standardinstallation von Office 2010 wird stets die 32-Bit-Version installiert, selbst auf 64-Bit-Systemen. Sie müssen die 64-Bit-Installationsoption für Office 2010explizit auswählen.

In VBA 7 müssen Sie die vorhandenen Windows-API-Anweisungen (Declare-Anweisungen) aktualisieren, damit die 64-Bit-Version unterstützt wird. Außerdem müssen Sie Adresszeiger und Anzeigefensterhandles in benutzerdefinierten Typen aktualisieren, die von diesen Anweisungen verwendet werden. Hierauf wird in diesem Artikel noch ausführlicher eingegangen, Außerdem werden Kompatibilitätsprobleme zwischen der 32-Bit-Version und der 64-Bit-Version von Office 2010 besprochen und Lösungen vorgeschlagen.

32-Bit-Systeme und 64-Bit-Systeme im Vergleich

Anwendungen, die mit der 64-Bit-Version von Office 2010 erstellt wurden, können auf größere Adressräume verweisen und bieten damit die Möglichkeit, mehr physikalischen Arbeitsspeicher als je zuvor zu nutzen. Dadurch lässt sich der Mehraufwand für das Verschieben von Daten in den und aus dem physikalischen Arbeitsspeicher potenziell reduzieren.

Sie können mithilfe von Adressen nicht nur auf bestimmte Positionen im physikalischen Arbeitsspeicher (so genannte Zeiger) verweisen, an denen eine Anwendung Daten oder Programmieranweisungen speichert, sondern auch auf Anzeigefensterbezeichner (so genannte Handles). Die Größe des Zeigers oder Handles in Bytes hängt davon ab, ob Sie ein 32-Bit-System oder ein 64-Bit-System verwenden.

Beim Ausführen vorhandener Lösungen mit der 64-Bit-Version von Office 2010 gibt es im Wesentlichen zwei Schwierigkeiten:

  • Von systemeigenen 64-Bit-Prozessen in Office 2010 können keine 32-Bit-Binärdateien geladen werden. Dieses Problem tritt häufig auf, wenn bereits Microsoft ActiveX-Steuerelemente und Add-Ins vorhanden sind.

  • In früheren Versionen von VBA gab es keinen Zeigerdatentyp. Infolgedessen verwendeten Entwickler 32-Bit-Variablen, um Zeiger und Handles zu speichern. Durch diese Variablen werden 64-Bit-Werte, die von API-Aufrufen zurückgegeben werden, bei Verwendung von Declare-Anweisungen jetzt abgeschnitten.

Einführung in die VBA 7-Codebasis

VBA 7 ist eine neue Codebasis, die die frühere Version von VBA ersetzt. VBA 7 gibt es sowohl für die 32-Bit-Version als auch für die 64-Bit-Version von Office 2010. Die Codebasis bietet zwei bedingte Kompilierungskonstanten: VBA7 und Win64. Die VBA7-Konstante stellt die Abwärtskompatibilität des Codes sicher. Hierzu wird überprüft, ob die Anwendung VBA 7 oder die frühere Version von VBA verwendet. Die Win64-Konstante dient zum Testen, ob Code als 32-Bit- oder 64-Bit-Code ausgeführt wird. Beide Kompilierungskonstanten werden weiter hinten in diesem Artikel vorgestellt.

Abgesehen von bestimmten Ausnahmen an anderer Stelle in diesem Artikel funktionieren die Makros in einem Dokument (dazu gehören auch Arbeitsmappen und Präsentationen), die bei der 32-Bit-Version dieser Anwendung funktioniert haben, auch, wenn das Dokument in der 64-Bit-Version der gleichen Anwendung geladen wird.

Kompatibilität mit ActiveX-Steuerelementen und COM-Add-Ins

Vorhandene 32-Bit-ActiveX-Steuerelemente sind, unabhängig davon, ob sie von Drittanbietern oder von Microsoft stammen, nicht mit der 64-Bit-Version von Office 2010 kompatibel. Für ActiveX-Steuerelemente und COM-Objekte gibt es drei mögliche Lösungen:

  • Wenn der Quellcode verfügbar ist, können Sie selbst eine 64-Bit-Version generieren.

  • Sie können sich an den Hersteller wenden und eine aktualisierte Version anfordern.

  • Sie können eine alternative Lösung suchen.

Systemeigene 64-Bit-Prozesse in Office 2010 32-Bit-Binärdateien kann nicht geladen werden. Dies umfasst die allgemeinen Steuerelemente von MSComCtl (TabStrip, Symbolleiste, Statusleiste, Statusanzeige, TreeView, ListViews, Abbildungsliste, Schieberegler, ImageCombo) und die Steuerelemente des MSComCt2 (Animation, UpDown, Monatsansicht, DateTimePicker, FlatScrollBar). Diese Steuerelemente installiert wurden, in früheren Versionen von Microsoft Office und von 32-Bit- Office 2010. Eine Alternative für vorhandene gefunden werden muss, Microsoft Office VBA-Lösungen, die diese Steuerelemente verwenden, wenn der Code auf 64-Bit-migriert wird Office 2010. 64-Bit-Office 2010 bietet keine 64-Bit-Versionen der allgemeinen Steuerelemente.

API-Kompatibilität

Durch die Kombination von VBA und Typbibliotheken verfügen Sie über umfangreiche Funktionalitäten zum Erstellen von Microsoft Office-Anwendungen. Manchmal ist jedoch eine direkte Kommunikation mit dem Betriebssystem und anderen Komponenten des Computers erforderlich, beispielsweise zur Verwaltung von Arbeitsspeicher oder Prozessen, bei der Arbeit mit der Benutzeroberfläche, beispielsweise mit Fenstern und Steuerelementen, oder beim Ändern der Windows-Registrierung. In diesen Szenarien verwenden Sie am besten eine der externen Funktionen, die in DLL-Dateien (Dynamic Link Library) eingebettet sind. In VBA erstellen Sie dazu API-Aufrufe unter Verwendung von Declare-Anweisungen.

Hinweis

Microsoft stellt die Datei "Win32API.txt" zur Verfügung, die 1.500 Declare-Anweisungen und ein Tool zum Ausschneiden der gewünschten Declare-Anweisung und Einfügen in den Code enthält. Diese Anweisungen sind jedoch für 32-Bit-Systeme vorgesehen und müssen gemäß den Anweisungen weiter hinten in diesem Artikel in das 64-Bit-System konvertiert werden. Vorhandene Declare-Anweisungen werden erst in 64-Bit-VBA kompiliert, nachdem sie mithilfe des PtrSafe-Attributs als sicher für 64-Bit markiert wurden. Beispiele für derartige Konvertierungen finden Sie auf der Website von Jan Karel Pieterse (Excel-MVP) unter: http://www.jkp-ads.com/articles/apideclarations.asp.

Das Benutzerhandbuch für Microsoft Office Code Compatibility Inspector ist ein hilfreiches Tool, um bei Bedarf die Syntax von API-Declare-Anweisungen für das PtrSafe-Attribut und den geeigneten Rückgabetyp zu überprüfen.

Declare-Anweisungen ähneln folgendem Code, je nachdem, ob Sie eine Unterroutine (kein Rückgabewert) oder eine Funktion (mit Rückgabewert) aufrufen.

  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 die FunctionName-Funktion wird in der DLL-Datei durch den tatsächlichen Namen der Prozedur ersetzt und steht für den Namen, der beim Aufruf der Prozedur aus dem VBA-Code verwendet wird. Sie können auch ein AliasName-Argument für den Prozedurnamen angeben, wenn Sie dies möchten. Der Name der DLL-Datei mit der aufgerufenen Prozedur folgt auf das Lib-Schlüsselwort. Und schließlich enthält die Argumentliste die Parameter und Datentypen, die an die Prozedur übergeben werden müssen.

Mit der folgenden Declare-Anweisung wird ein Unterschlüssel in der Windows-Registrierung geöffnet und der Wert ersetzt.

  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:

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

In Microsoft Visual C und Microsoft Visual C++ wird das vorherige Beispiel sowohl in der 32-Bit-Version als auch in der 64-Bit-Version richtig kompiliert. Der Grund ist, dass HKEY als Zeiger definiert ist, dessen Größe der Größe des Arbeitsspeichers auf der Plattform entspricht, auf der der Code kompiliert wird.

In früheren Versionen von VBA gab es keinen bestimmten Zeigerdatentyp. Deshalb wurde der Long-Datentyp verwendet. Und da der Long-Datentyp immer 32 Bits lang ist, wird die Funktion auf einem System mit 64-Bit-Arbeitsspeicher beschädigt, weil die oberen 32 Bits u. U. abgeschnitten werden oder andere Arbeitsspeicheradressen überschreiben. Beide Situationen können unvorhersehbares Verhalten oder Systemabstürze zur Folge haben.

Zur Behebung dieses Problems enthält VBA jetzt einen echten Zeigerdatentyp: LongPtr. Mit diesem neuen Datentyp können Sie die ursprüngliche Declare-Anweisung korrekt wie folgt schreiben:

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

Dieser Datentyp und das neue PtrSafe-Attribut ermöglichen die Verwendung dieser Declare-Anweisung sowohl auf 32-Bit-Systemen als auch auf 64-Bit-Systemen. Das PtrSafe-Attribut gibt an, dass die Declare-Anweisung für die 64-Bit-Version von Office 2010 geschrieben wurde. Ohne dieses Attribut tritt bei Verwendung der Declare-Anweisung auf einem 64-Bit-System ein Kompilierungsfehler auf. Bei der 32-Bit-Version von Office 2010 ist das PtrSafe-Attribut optional. Auf diese Weise wird die Funktion vorhandener Declare-Anweisungen nicht beeinträchtigt.

Die folgende Tabelle enthält weitere Informationen zum bereits angesprochenen neuen Qualifizierer und Datentyp sowie zu einem weiteren Datentyp, zwei Konvertierungsoperatoren und drei Funktionen.

Typ

Element

Beschreibung

Qualifizierer

PtrSafe

Gibt an, dass die Declare-Anweisung mit 64-Bit-Systemen kompatibel ist. Dieses Attribut ist auf 64-Bit-Systemen obligatorisch.

Datentyp

LongPtr

Ein variabler Datentyp, der auf 32-Bit-Versionen von Office 2010 als 4-Byte-Datentyp und auf 64-Bit-Versionen als 8-Byte-Datentyp ausgelegt ist. Seine Verwendung wird zum Deklarieren eines Zeigers oder Handles für neuen Code, aber auch für älteren Code empfohlen, wenn dieser in der 64-Bit-Version von Office 2010 ausgeführt werden soll. Der Datentyp wird auf 32-Bit- und 64-Bit-Systemen nur in der VBA 7-Laufzeit unterstützt. Sie können dem Datentyp numerische Werte, aber keine numerischen Typen zuweisen.

Datentyp

LongLong

Ein 8-Byte-Datentyp, der nur in 64-Bit-Versionen von Office 2010 zur Verfügung steht. Sie können ihm numerische Werte, aber keine numerischen Typen zuweisen (um Abschneiden zu vermeiden).

Konvertierungsoperator

CLngPtr

Konvertiert einen einfachen Ausdruck in einen LongPtr-Datentyp.

Konvertierungsoperator

CLngLng

Konvertiert einen einfachen Ausdruck in einen LongLong-Datentyp.

Funktion

VarPtr

Variantenkonverter. Gibt auf 64-Bit-Versionen LongPtr und auf 32-Bit-Versionen Long (4 Bytes) zurück.

Funktion

ObjPtr

Objektkonverter. Gibt auf 64-Bit-Versionen LongPtr und auf 32-Bit-Versionen Long (4 Bytes) zurück.

Funktion

StrPtr

Zeichenfolgenkonverter. Gibt auf 64-Bit-Versionen LongPtr und auf 32-Bit-Versionen Long (4 Bytes) zurück.

Im folgenden Beispiel ist die Verwendung einiger dieser Elemente in einer Declare-Anweisung dargestellt.

  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 2010 kompatibel sind.

Wie bereits erwähnt gibt es zwei neue bedingte Kompilierungskonstanten: VBA7 und Win64. Zur Sicherstellung der Abwärtskompatibilität mit früheren Versionen von Microsoft Office verwenden Sie typischerweise die VBA7-Konstante, um zu vermeiden, dass 64-Bit-Code in der früheren Version von Microsoft Office ausgeführt wird. Für Code, der sich in der 32-Bit-Version und der 64-Bit-Version unterscheidet, beispielsweise der Aufruf einer Mathematik-API, die in der 64-Bit-Version LongLong und in der 32-Bit-Version Long nutzt, verwenden Sie die Win64-Konstante. Im folgenden Code ist die Verwendung der beiden Konstanten dargestellt.

  #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

Wenn Sie also 64-Bit-Code schreiben, der auch in früheren Versionen von Microsoft Office verwendet werden soll, sollten Sie die bedingte Kompilierungskonstante VBA7 verwenden. Wenn Sie jedoch 32-Bit-Code in Office 2010 erstellen, funktioniert dieser in früheren Versionen von Microsoft Office ohne Anpassung und ohne die Kompilierungskonstante. 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, empfiehlt sich die Verwendung der bedingten Kompilierungskonstante Win64.

Verwenden von bedingten Kompilierungsattributen

Der folgende Code ist ein Beispiel für VBA-Code der Vorversion , der aktualisiert werden muss. Die Datentypen im Code werden aktualisiert, damit sie LongPtr verwenden, weil sie auf Handles oder Zeiger verweisen.

VBA-Code der Vorversion

  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

Neuer VBA-Code

  #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 Fragen

Nachfolgend finden Sie die häufig gestellten Fragen im Zusammenhang mit der 32-Bit-Version und der 64-Bit-Version von Microsoft Office.

  • Wann sollte ich die 64-Bit-Version von Microsoft Office verwenden?
    Die ist eine Frage der Hostanwendung (Excel, Word usw.), die Sie verwenden. Excel kann mit der 64-Bit-Version von Microsoft Office beispielsweise viel größere Arbeitsblätter verarbeiten.

  • Kann ich die 64-Bit- und die 32-Bit-Version von Microsoft Office parallel installieren?
    Nein.

  • Wann sollte ich Long-Parameter in LongPtr konvertieren?
    Sie müssen in der Windows-API-Dokumentation im Microsoft Developers Network nach der Funktion suchen, die Sie aufrufen möchten. Handles und Zeiger müssen in LongPtr konvertiert werden. Als Beispiel stellt die Dokumentation für RegOpenKeyA die folgende Signatur bereit:

    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:

    Parameter

    Beschreibung

    hKey [in]

    Ein Handle für einen geöffneten Registrierungsschlüssel.

    lpSubKey [in, optional]

    Der Name des Registrierungsunterschlüssels, der geöffnet werden soll.

    ulOptions

    Dieser Parameter ist reserviert und muss NULL sein.

    samDesired [in]

    Eine Maske, die die gewünschten Zugriffsrechte für den Schlüssel angibt.

    phkResult [out]

    Ein Zeiger auf eine Variable, die einen Handle für den n Schlüssel empfängt.

    In Win32API_PtrSafe.txt ist die Declare-Anweisung definiert als:

    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?
    Ja. Siehe MSG-Typ 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 muss ich strptr, varpt und objptr verwenden?
    Sie sollten diese Funktionen verwenden, um Verweise auf Zeichenfolgen, Variablen bzw. Objekte abzurufen. In der 64-Bit-Version von Microsoft Office geben diese Funktionen einen 64-Bit-LongPtr zurück, der an Declare-Anweisungen weitergegeben werden kann. Die Verwendung dieser Funktionen hat sich seit den früheren Versionen von VBA nicht geändert. Der einzige Unterschied besteht darin, dass diese jetzt einen LongPtr zurückgeben.

Fazit

Dank der neuen 64-Bit-Version von Office 2010 können Sie mehr Daten verarbeiten, wodurch der Funktionsspielraum wächst. Wenn Sie 32-Bit-Code schreiben, können Sie die 64-Bit-Version von Microsoft Office ohne Änderungen verwenden. Beim Schreiben von 64-Bit-Code sollten Sie allerdings sicherstellen, dass der Code bestimmte Schlüsselwörter und bedingte Kompilierungskonstanten enthält, damit der Code mit der früheren Version von Microsoft Office abwärtskompatibel ist, und dass bei einer Kombination von 32-Bit- und 64-Bit-Code der richtige Code ausgeführt wird.

Zusätzliche Ressourcen

Weitere Informationen zu Declare-Anweisungen finden Sie in den folgenden Ressourcen: