Compatibilité entre les versions 32 bits et 64 bits d’Office 2010
Résumé : Pour les clients qui travaillent avec 2 Go de données ou plus, Microsoft Office 2010 est désormais disponible en version 64 bits. Cet article traite des problèmes liés à la compatibilité de la version 32 bits avec la nouvelle version 64 bits et les applications Office 32 bits héritées, ainsi que des solutions disponibles. (7 pages imprimées)
Dernière modification : vendredi 24 avril 2015
S’applique à : 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
Dans cet article
Présentation des versions 32 bits et 64 bits de Microsoft Office 2010
Comparaison des systèmes 32 bits et 64 bits
Présentation de la base de code VBA 7
Compatibilité des contrôles ActiveX et des compléments COM
Compatibilité des interfaces de programmation d’applications
Utilisation d’attributs de compilation conditionnelle
Forum aux Questions
Conclusion
Ressources supplémentaires
Applies to: Microsoft Office 2010
Date de publication : mars 2010
Auteur : Microsoft Corporation
Sommaire
Présentation des versions 32 bits et 64 bits de Microsoft Office 2010
Comparaison des systèmes 32 bits et 64 bits
Présentation de la base de code VBA 7
Compatibilité des contrôles ActiveX et des compléments COM
Compatibilité des interfaces de programmation d’applications
Utilisation d’attributs de compilation conditionnelle
Forum aux Questions
Conclusion
Ressources supplémentaires
Présentation des versions 32 bits et 64 bits de Microsoft Office 2010
Le système Microsoft Office 2010 est disponible dans des versions 32 bits et 64 bits. La version 64 bits vous permet de travailler avec des jeux de données beaucoup plus volumineux, ce qui est utile en particulier lors de l’utilisation de très grands nombres dans Microsoft Excel 2010.
Avec l’introduction de la nouvelle version 64 bits de Microsoft Office 2010, une nouvelle version de Microsoft Visual Basic pour Applications (VBA), nommée Microsoft Visual Basic pour Applications 7.0 (VBA 7), a été publiée pour être utilisée avec les applications 32 bits et 64 bits. Il est important de noter que les modifications abordées dans cet article s’appliquent uniquement à la version 64 bits de Microsoft Office 2010. L’utilisation de la version 32 bits d’Office 2010 vous permet d’utiliser des solutions créées dans des versions précédentes de Microsoft Office sans modification.
Notes
Dans une installation par défaut d’Office 2010, la version 32 bits est installée, même sur les systèmes 64 bits. Vous devez explicitement sélectionner l’option d’installation de la version 64 bits d’Office 2010.
Dans VBA 7, vous devez mettre à jour les instructions d’API (Application Programming Interface) Windows existantes (instructions Declare) pour qu’elles fonctionnent avec la version 64 bits. En outre, vous devez mettre à jour les pointeurs d’adresses et les handles de fenêtres d’affichage dans les types définis par l’utilisateur qui sont utilisés par ces instructions. Cet aspect est abordé plus en détail dans cet article, de même que les problèmes de compatibilité entre les versions 32 bits et 64 bits d’Office 2010 et les solutions suggérées.
Comparaison des systèmes 32 bits et 64 bits
Les applications créées avec la version 64 bits d’Office 2010 peuvent faire référence à des espaces d’adresses plus grands, et offrent donc l’opportunité d’utiliser davantage de mémoire physique qu’auparavant, ce qui permet de réduire la charge liée au déplacement de données dans et en dehors de la mémoire physique.
Vous pouvez non seulement faire référence à des emplacements spécifiques (également appelés pointeurs) dans la mémoire physique utilisés par une application pour stocker des données ou des instructions de programmation, mais également utiliser des adresses pour faire référence à des identificateurs de fenêtres d’affichage (appelés handles). La taille (en octets) du pointeur ou du handle varie selon que vous utilisez un système 32 bits ou 64 bits.
Il existe deux problèmes fondamentaux lors de l’exécution de solutions existantes avec la version 64 bits d’Office 2010 :
Les processus 64 bits natifs dans Office 2010 ne peuvent pas charger de binaires 32 bits. Il s’agit d’un problème courant en cas de présence de compléments et de contrôles Microsoft ActiveX existants.
VBA n’offrait auparavant aucun type de données de pointeur ; c’est pourquoi les développeurs utilisaient des variables 32 bits pour stocker des pointeurs et des handles. Ces variables tronquent désormais les valeurs 64 bits retournées par les appels d’API lors de l’utilisation d’instructions Declare.
Présentation de la base de code VBA 7
VBA 7 est une nouvelle base de code qui remplace la version antérieure de VBA. VBA 7 existe pour les version 32 bits et 64 bits d’Office 2010. Il procure deux constantes de compilation conditionnelle : VBA7 et Win64. La constante VBA7 aide à garantir la compatibilité descendante de votre code en vérifiant si votre application utilise VBA 7 ou la version précédente de VBA. La constante Win64 permet de vérifier si le code s’exécute comme 32 bits ou 64 bits. Ces deux constantes de compilation sont illustrées plus loin dans cet article.
Malgré quelques exceptions indiquées ailleurs dans cet article, les macros dans un document (classeur et présentations également) qui fonctionnaient avec la version 32 bits de l’application fonctionneront après le chargement du document dans la version 64 bits de la même application.
Compatibilité des contrôles ActiveX et des compléments COM
Les contrôles ActiveX 32 bits existants, qu’ils soient fournis par des tierces parties ou par Microsoft, ne sont pas compatibles avec la version 64 bits de Office 2010. Pour les contrôles ActiveX et les objets COM, il existe trois solutions possibles :
Si vous avez le code source, vous pouvez générer une version 64 bits vous-même.
Vous pouvez contacter le fournisseur afin d’obtenir une version mise à jour.
Vous pouvez tenter de trouver une solution alternative.
Les processus 64 bits natifs dans Office 2010 ne peuvent pas charger de fichiers binaires 32 bits. Ceci inclut les contrôles courants de MSComCtl (TabStrip, Toolbar, StatusBar, ProgressBar, TreeView, ListViews, ImageList, Slider, ImageComboBox) et les contrôles de MSComCt2 (Animation, UpDown, MonthView, DateTimePicker, FlatScrollBar). Ces contrôles ont été installés par des versions précédentes de Microsoft Office et sont installés par Office 2010 32 bits. Une solution de remplacement doit être trouvée pour les solutions VBA Microsoft Office existantes qui utilisent ces contrôles lorsque le code est migré vers Office 2010 64 bits. Office 2010 64 bits ne fournit pas toutes les versions 64 bits des contrôles courants.
Compatibilité des interfaces de programmation d’applications
La combinaison de VBA et de bibliothèques de types met à votre disposition de nombreuses fonctionnalités pour la création d’applications Microsoft Office. Néanmoins, il est parfois nécessaire de communiquer directement avec le système d’exploitation de l’ordinateur et avec d’autres composants, par exemple lorsque vous gérez de la mémoire ou des processus, lors de l’utilisation d’éléments d’interface utilisateur telles que fenêtre et contrôles, ou lors de la modification du Registre de Windows. Dans ces scénarios, la meilleure option consiste à utiliser l’une des fonctions externes incorporées dans les fichiers DLL (Dynamic Linked Library). Pour cela, vous devez dans VBA effectuer des appels d’API à l’aide d’instructions Declare.
Notes
Microsoft fournit un fichier Win32API.txt qui contient 1 500 instructions Declare et un outil permettant de couper et coller l’instruction Declare dont vous avez besoin dans votre code. Cependant, ces instructions sont destinées aux systèmes 32 bits et doivent être converties en 64 bits à l’aide des informations fournies plus loin dans cet article. Les instructions Declare existantes ne seront pas compilées dans VBA 64 bits tant qu’elles n’auront pas été marquées comme fiables pour la version 64 bits à l’aide de l’attribut PtrSafe. Vous trouverez des exemples de ce type de conversion sur le site web de Jan Karel Pieterse, MVP Excel, à l’adresse suivante : http://www.jkp-ads.com/articles/apideclarations.asp.
Le guide d’utilisation de l’Inspecteur de compatibilité du code Microsoft Office est un outil utile permettant d’inspecter la syntaxe des instructions Declare de l’API pour l’attribut PtrSafe (le cas échéant), ainsi que le type de retour approprié.
Les instructions Declare ressemblent à ce qui suit, selon que vous appelez une sous-routine (qui n’a aucune valeur de retour) ou une fonction (qui a une valeur de retour).
Public/Private Declare Sub SubName Lib "LibName" Alias "AliasName" (argument list)
Public/Private Declare Function FunctionName Lib "Libname" alias "aliasname" (argument list) As Type
La fonction SubName ou FunctionName est remplacée par le nom de la procédure dans le fichier DLL et représente le nom utilisé lorsque la procédure est appelée à partir de code VBA. Vous pouvez également spécifier un argument AliasName pour le nom de la procédure, si vous le souhaitez. Le nom du fichier DLL qui contient la procédure appelée suit le mot clé Lib. Pour finir, la liste d’arguments contient les paramètres et types de données qui doivent être passés à la procédure.
L’instruction Declare suivante ouvre un subkey dans le Registre de Windows et remplace sa valeur.
Declare Function RegOpenKeyA Lib "advapi32.dll" (ByVal Key As Long, ByVal SubKey As String, NewKey As Long) As Long
L’entrée Windows.h (handle de fenêtre) pour la fonction RegOpenKeyA est la suivante :
LONG RegOpenKeyA ( HKEY hKey, LPCSTR lpSubKey, HKEY *phkResult );
En Microsoft Visual C et Microsoft Visual C++, l’exemple précédent est compilé correctement en 32 bits et 64 bits. Cela est dû au fait que HKEY est défini comme un pointeur, dont la taille reflète la taille mémoire de la plateforme sur laquelle le code est compilé.
Dans les versions précédentes de VBA, il n’existait aucun type de données de pointeur spécifique ; le type de données Long était par conséquent toujours utilisé. Le type de données Long étant toujours 32 bits, cela provoque un échec en cas d’utilisation sur un système avec une mémoire 64 bits car les 32 bits supérieurs peuvent être tronqués ou peuvent remplacer d’autres adresses mémoire. L’une ou l’autre de ces situations peut provoquer un comportement inattendu ou un blocage système.
Pour résoudre ce problème, VBA contient désormais un type de données pointeur réel : LongPtr. Ce nouveau type de données vous permet d’écrire l’instruction Declare d’origine correctement comme suit :
Declare PtrSafe Function RegOpenKeyA Lib "advapire32.dll" (ByVal hKey as LongPtr, ByVal lpSubKey As String, phkResult As LongPtr) As Long
Ce type de données et le nouvel attribut PtrSafe vous permettent d’utiliser cette instruction Declare sur des systèmes 32 bits ou 64 bits. L’attribut PtrSafe indique au compilateur VBA que l’instruction Declare cible la version 64 bits d’Office 2010. Sans cet attribut, l’utilisation de l’instruction Declare sur un système 64 bits génère une erreur au moment de la compilation. Notez que l’attribut PtrSafe est facultatif dans la version 32 bits d’Office 2010. Ceci permet aux instructions Declare existantes de fonctionner comme elles l’ont toujours fait.
Le tableau suivant fournit des informations supplémentaires sur les nouveaux qualificateur et type de données dont nous venons de discuter et sur un autre type de données, deux opérateurs de conversion et trois fonctions.
Type |
Élément |
Description |
---|---|---|
Qualificateur |
PtrSafe |
Indique que l’instruction Declare est compatible 64 bits. Cet attribut est obligatoire sur les systèmes 64 bits. |
Type de données |
LongPtr |
Type de données de variable qui est un type de données sur 4 octets sur les versions 32 bits et un type de données sur 8 octets sur les versions 64 bits d’Office 2010. Il s’agit de la méthode recommandée pour déclarer un pointeur ou un handle pour du nouveau code, mais également pour du code hérité s’il doit s’exécuter dans la version 64 bits d’Office 2010. Il est pris en charge uniquement dans le runtime VBA 7 sur les systèmes 32 bits et 64 bits. Notez que vous pouvez lui assigner des valeurs numériques mais pas des types numériques. |
Type de données |
LongLong |
Il s’agit d’un type de données sur 8 octets disponible uniquement dans les versions 64 bits d’Office 2010. Vous pouvez lui assigner des valeurs numériques, mais pas des types numériques (afin d’éviter la troncation). |
Opérateur de conversion |
CLngPtr |
Convertit une expression simple en un type de données LongPtr. |
Opérateur de conversion |
CLngLng |
Convertit une expression simple en un type de données LongLong. |
Fonction |
VarPtr |
Convertisseur de variant. Retourne un LongPtr sur les versions 64 bits et un Long sur les versions 32 bits (4 octets). |
Fonction |
ObjPtr |
Convertisseur d’objet. Retourne un LongPtr sur les versions 64 bits et un Long sur les versions 32 bits (4 octets). |
Fonction |
StrPtr |
Convertisseur de chaîne. Retourne un LongPtr sur les versions 64 bits et un Long sur les versions 32 bits (4 octets). |
L’exemple suivant montre comment utiliser certains de ces éléments dans une instruction Declare.
Declare PtrSafe Function RegOpenKeyA Lib "advapi32.dll" (ByVal Key As LongPtr, ByVal SubKey As String, NewKey As LongPtr) As Long
Notez que les instructions Declare sans attribut PtrSafe sont considérées comme non compatibles avec la version 64 bits d’Office 2010.
Comme nous l’avons vu plus haut, il existe deux nouvelles constantes de compilation conditionnelle : VBA7 et Win64. Pour garantir la compatibilité descendante avec les versions précédentes de Microsoft Office, la constante VBA7 est utilisée (il s’agit du cas le plus courant) afin d’empêcher le code 64 bits de s’exécuter dans la version antérieure de Microsoft Office. Pour le code qui diffère entre la version 32 bits et la version 64 bits, tel que l’appel d’une API mathématique qui utilise LongLong pour sa version 64 bits et Long pour sa version 32 bits, la constante Win64 est utilisée. Le code suivant illustre l’utilisation de ces deux constantes.
#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
Pour résumer, si vous écrivez du code 64 bits et que prévoyez de l’utiliser dans des versions précédentes de Microsoft Office, il faut utiliser la constante de compilation conditionnelle VBA7. En revanche, si vous écrivez du code 32 bits dans Office 2010, ce code fonctionne tel que dans les versions précédentes d’Microsoft Office sans la constante de compilation. Si vous souhaitez être sûr d’utiliser des instructions 32 bits pour les versions 32 bits et des instructions 64 bits pour les versions 64 bits, la meilleure solution consiste à utiliser la constante de compilation conditionnelle Win64.
Utilisation d’attributs de compilation conditionnelle
Le code suivant est un exemple de code VBA hérité qui doit être mis à jour. Notez les types de données dans le code hérité qui doivent être mis à jour de façon à utiliser LongPtr car ils font référence à des handles ou des pointeurs.
Code VBA hérité
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
Nouveau code VBA
#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
Forum aux Questions
Les questions ci-dessous sont celles fréquemment posées concernant les versions 32 bits et 64 bits de Microsoft Office.
À quel moment dois-je utiliser la version 64 bits de Microsoft Office ?
Cette décision dépend de l’application hôte que vous utilisez (Excel, Word, etc.). Par exemple, Excel peut gérer des feuilles de calcul beaucoup plus volumineuses avec la version 64 bits de Microsoft Office.Puis-je installer les versions 64 bits et 32 bits de Microsoft Office côte à côte ?
Non.À quel moment dois-je convertir les paramètres Long en LongPtr ?
Vous devez consulter la documentation relative à l’API Windows sur Microsoft Developers Network pour la fonction à appeler. Les poignées et les pointeurs doivent être convertis en LongPtr. Par exemple, la documentation relative à RegOpenKeyA fournit la signature suivante :LONG WINAPI RegOpenKeyEx( __in HKEY hKey, __in_opt LPCTSTR lpSubKey, __reserved DWORD ulOptions, __in REGSAM samDesired, __out PHKEY phkResult );
Les paramètres sont définis de la façon suivante :
Paramètre
Description
hKey [in]
Poignée permettant d’ouvrir une clé de Registre.
lpSubKey [in, facultatif]
Nom de la sous-clé de Registre à ouvrir.
ulOptions
Ce paramètre est réservé et doit être égal à zéro.
samDesired [in]
Masque qui spécifie les droits d’accès souhaités à la clé.
phkResult [out]
Pointeur vers une variable qui reçoit une poignée vers la clé ouverte.
Dans Win32API_PtrSafe.txt, l’instruction Declare est définie de la façon suivante :
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
Dois-je convertir des pointeurs et des poignées en structures ?
Oui. Voir le type MSG dans 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
À quel moment dois-je utiliser strptr, varpt et objptr ?
Vous devez utiliser ces fonctions pour extraire des pointeurs vers des chaînes, des variables et des objets, respectivement. Dans la version 64 bits de Microsoft Office, ces fonctions renvoient un paramètre LongPtr 64 bits, qui peut être transmis aux instructions Declare. L’utilisation de ces fonctions ne diffère pas par rapport aux versions précédentes de VBA. La seule différence réside dans le fait qu’elles renvoient désormais un paramètre LongPtr.
Conclusion
L’ajout d’une version 64 bits d’Office 2010 vous permet de manipuler davantage de données afin d’accroître les fonctionnalités. Lors de l’écriture de code 32 bits, vous pouvez utiliser la version 64 bits de Microsoft Office sans modification. En revanche, lors de l’écriture de code 64 bits, vous devez faire en sorte que votre code contienne des mots clés et des constantes de compilation conditionnelle spécifiques afin de garantir sa compatibilité descendante avec les versions antérieures de Microsoft Office et d’être certain que le code correct est exécuté si vous mélangez du code 32 bits et 64 bits.
Ressources supplémentaires
Pour plus d’informations sur les instructions Declare, voir les ressources suivantes :