Vue d’ensemble de Visual Basic pour Applications 64 bits

Microsoft Visual Basic pour Applications (VBA) est la version de Visual Basic livrée avec Microsoft Office. Dans Microsoft Office 2010, VBA inclut des fonctionnalités de langue qui permettent d’exécuter correctement le code VBA dans les environnements 32 bits et 64 bits.

Remarque

Par défaut, Office 2010, 2013 et 2016 installent la version 32 bits. Le choix de la version 64 bits doit être explicitement exprimé pendant l’installation. À partir d’Office 2019 et Microsoft 365, la version par défaut est la version 64 bits.

Exécuter du code VBA écrit avant la publication d’Office 2010 (version VBA 6 et version antérieure) sur une plateforme 64 bits peut entraîner des erreurs si le code n’est pas modifié pour être exécuté dans les versions 64 bits d’Office. Des erreurs arrivent, car la version 6 et versions antérieures de VBA ciblent implicitement la plateformes 32 bits et contiennent généralement desinstructions Declare qui participent à l’API Windows à l’aide des types de données 32 bits pour marqueurs et descripteurs. Étant donné que la version 6 et versions antérieures de VBA ne comportent pas de type de données spécifiques pour les marqueurs et descripteurs, elles utilisent le type de donnéesLong, qui est un type de données de 4 octets 32 bits, pour référencer marqueurs et descripteurs. Les marqueurs et descripteurs dans des environnements 64 bits sont en 8 octets 64 bits. Ces quantités 64 bits ne peut pas conservées dans les types de données 32 bits.

Remarque

Ne modifiez le code VBA que s’il s’exécute dans la version 64 bits de Microsoft Office.

Le problème lors de l’exécution du code VBA hérité dans Office 64 bits est que vous essayez de charger 64 bits dans un type de données 32 bits et que cela tronque la quantité 64 bits. Cela peut entraîner une saturation de la mémoire, des résultats inattendus dans votre code et l’échec de l’application.

Pour résoudre ce problème et permettre au code VBA de fonctionner correctement dans les environnements 32 bits et 64 bits, plusieurs fonctionnalités de langue ont été ajoutées à VBA. Le tableau en bas de ce document récapitule les nouvelles fonctionnalités de langue VBA. Trois ajouts importants sont le type aliasLongPtr, le type de donnéesLongLonget le mot cléPtrSafe.

  • LongPtr. VBA inclut désormais l’alias du type de variable LongPtr. Le type de données réel dont LongPtr résulte dépend de la version d’Office sur laquelle il est exécuté ; LongPtr résulte en Long dans les versions 32 bits d’Office, et LongPtr résulte en LongLong dans les versions 64 bits d’Office. Utilisez LongPtr pour les marqueurs et descripteurs.

  • LongLong. Le type de donnéesLongLong est un entier signé 64 bits qui est disponible uniquement sur les versions 64 bits d’Office. Utilisez LongLong pour les intégrales 64 bits. Les fonctions de conversion doivent être utilisées pour assigner explicitement LongLong (y compris LongPtr sur les plateformes 64 bits) aux types entiers plus petits. Les conversions implicites de LongLong à des intégrales de plus petite taille ne sont pas autorisées.

  • PtrSafe. Le mot clé PtrSafe atteste que l’instruction Declare peut s’exécuter en toute sécurité dans les versions 64 bits d’Office.

Importante

Toutes les instructions Declaredoivent désormais inclure le mot clé PtrSafe lors de l’exécution dans les versions 64 bits d’Office. Il est important de comprendre que le simple ajout du mot clé PtrSafepour une instruction Declare indique uniquement que l’instruction Declare cible explicitement les 64 bits. Tous les types de données au sein de l’instruction qui ont besoin de stocker 64 bits (y compris les valeurs de retour et les paramètres) doivent être modifiés pour conserver les quantités 64 bits.

Remarque

Les instructionsDeclare avec le mot-clé PtrSafe sont la syntaxe recommandée. Les instructionsDeclare qui incluent PtrSafe fonctionnent correctement dans l’environnement de développement VBA7 sur les plateformes 32 bits et 64 bits.

Pour assurer la compatibilité descendante avec VBA7 et versions antérieures, utilisez la construction suivante :

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

Envisagez les exemples d’instructionsDeclare suivants. Exécuter l’instruction Declare non modifiée dans les versions 64 bits d’Office entraîne une erreur indiquant que l’instruction Declare n’inclut pas l’identificateur PtrSafe. L’exemple VBA modifié contient l’identificateurPtrSafe, mais notez que la valeur de retour (pointeur vers la fenêtre active) renvoie un type de donnéesLong. Dans Office 64 bits, cela est incorrect, car le pointeur doit être 64 bits. L’identificateur PtrSafe indique au compilateur que l’instruction Declare cible les 64 bits, donc l’instruction s’exécute sans erreur. Mais étant donné que la valeur de retour n’a pas été mise à jour pour un type de données 64 bits, la valeur de retour est tronquée, ce qui engendre le retour d’une valeur incorrecte.

L’exemple suivant est une instruction VBA héritée Declare non modifiée :

Declare Function GetActiveWindow Lib "user32" () As Long

L’exemple d’instruction VBA Declare est modifié pour inclure l’identificateur PtrSafe, mais utilisant une valeur de retour 32 bits :

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

Pour réitérer, modifiez l’instruction Declare pour inclure le qualificateur PtrSafe et mettez à jour les variables de l’instruction qui doivent contenir des quantités de 64 bits afin qu’elles utilisent des types de données sur 64 bits.

Exemple d’instruction VBA Declare modifiée pour inclure le mot clé PtrSafe et mise à jour pour utiliser le type de données 64 bits (LongPtr) correct :

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

Pour résumer, pour que le code fonctionne dans les versions 64 bits d’Office, vous devez localiser et modifier toutes les instructions Declareexistantes pour utiliser l’identificateur PtrSafe. Vous devez également rechercher et modifier tous les types de données au sein de ces instructionsDeclare faisant référence à des marqueurs ou descripteurs pour utiliser le nouvel alias type compatible 64 bits LongPtr, et les types qui doivent contenir des intégrales 64 bits grâce aux nouveaux types de donnéesLongLong. En outre, vous devez mettre à jour les types définis par l’utilisateur (UDT) qui contiennent des marqueurs ou descripteurs et les intégrales 64 bits pour utiliser des types de données 64 bits, puis vérifier que toutes les affectations variables sont correctes pour empêcher des erreurs d’incompatibilité de type.

Écriture de code fonctionnant sur Office 32 bits et 64 bits

Pour écrire du code qui peut porter entre les versions 32 bits et 64 bits d’Office, il vous suffit d’utiliser le nouvel alias type LongPtr à la place de Long ou LongLong pour toutes les valeurs de marqueurs et descripteurs. L’alias type LongPtr résultera au type de données Long ou LongLong selon la version d’Office en cours d’exécution.

Notez que si vous avez besoin d’une logique différente pour l’exécution, par exemple, vous avez besoin de manipuler les valeurs 64 bits dans des projets Excel de grande échelle, vous pouvez utiliser la constante de compilation conditionnelle Win64 comme illustré dans la section suivante.

Écrire du code fonctionnant sur Microsoft Office 2010 (32 bits ou 64 bits) et les versions antérieures d’Office

Pour écrire du code fonctionnant dans les nouvelles et anciennes versions d’Office, vous pouvez utiliser une combinaison des nouvellesconstantes de compilation conditionnelleVBA7 et Win64. La constante de compilation conditionnelle Vba7est utilisée pour déterminer si le code est en cours d’exécution dans la version 7 de Visual Basic editor (la version VBA fournie avec Office 2010). La constante de compilation conditionnelle Win64 est utilisée pour déterminer quelle version (32 bits ou 64 bits) d’Office est en cours d’exécution.

#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 

Synthèse des mises à jour du langage VBA7

Le tableau suivant résume et explique les ajouts au langage VBA.

Nom Type Description
PtrSafe Mot clé Indique qu’une instruction Declare est destinée aux systèmes 64 bits. Obligatoire sur 64 bits.
LongPtr Type de données Alias de type mappé à Long sur les systèmes 32 bits et à LongLong sur les systèmes 64 bits.
LongLong Type de données Type de données de 8 octets qui est uniquement disponible sur les systèmes 64 bits. Type numérique. Nombres entiers compris entre -9,223,372,036,854,775,808 et 9,223,372,036,854,775,807.

LongLong est un type déclaré valide uniquement sur les plateformes 64 bits. En outre, LongLong peut ne pas être converti implicitement à un type de plus petite taille (par exemple, vous ne pouvez pas attribuer un LongLong à un Long). Cette opération est effectuée pour empêcher la troncature de pointeur par inadvertance.

Les contraintes explicites sont autorisées, donc dans l’exemple précédent, vous pouvez appliquer CLng à un LongLong et attribuer le résultat à un Long (valide sur plateformes 64 bits uniquement).
^ Caractère de déclaration de typeLongLong Déclare explicitement une valeur littérale comme un LongLong. Nécessaire pour déclarer une valeur littérale LongLong supérieure à la valeurLong maximale (sinon, elle sera implicitement convertie en double).
CLngPtr Fonction de conversion de type Convertit une expression simple en LongPtr.
CLngLng Fonction de conversion de type Convertit une expression simple en type de données LongLong (valide uniquement sur les plateformes 64 bits).
vbLongLong Constante VarType Entier LongLong (Valide sur les plateformes 64 bits uniquement).
DefLngPtr Instruction DefType Définit le type de données par défaut d’une plage de variables comme LongPtr.
DefLngLng Instruction DefType Définit le type de données par défaut d’une plage de variables comme LongLong.

Voir aussi

Assistance et commentaires

Avez-vous des questions ou des commentaires sur Office VBA ou sur cette documentation ? Consultez la rubrique concernant l’assistance pour Office VBA et l’envoi de commentaires afin d’obtenir des instructions pour recevoir une assistance et envoyer vos commentaires.