Vue d’ensemble de Visual Basic pour Applications 64 bits64-bit Visual Basic for Applications overview

Microsoft Visual Basic pour Applications (VBA) est la version de Visual Basic livrée avec Microsoft Office.Microsoft Visual Basic for Applications (VBA) is the version of Visual Basic that ships with 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.In Microsoft Office 2010, VBA includes language features that enable VBA code to run correctly in both 32-bit and 64-bit environments.

Notes

Par défaut, Office 2010, 2013 et 2016 installent la version 32 bits.By default, Office 2010, 2013 and 2016 install the 32-bit version. Le choix de la version 64 bits doit être explicitement exprimé pendant l’installation.You must explicitly choose to install the 64-bit version during setup. À partir d’Office 2019 et Microsoft 365, la version par défaut est la version 64 bits.Starting with Office 2019 and Microsoft 365, the default is the 64-bit version.

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.Running VBA code that was written before the Office 2010 release (VBA version 6 and earlier) on a 64-bit platform can result in errors if the code is not modified to run in 64-bit versions of 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 des** instructions Declare ** qui participent à l’API Windows à l’aide des types de données 32 bits pour marqueurs et descripteurs.Errors will result because VBA version 6 and earlier implicitly targets 32-bit platforms, and typically contains Declare statements that call into the Windows API by using 32-bit data types for pointers and handles. É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.Because VBA version 6 and earlier does not have a specific data type for pointers or handles, it uses the Long data type, which is a 32-bit 4-byte data type, to reference pointers and handles. Les marqueurs et descripteurs dans des environnements 64 bits sont en 8 octets 64 bits.Pointers and handles in 64-bit environments are 8-byte 64-bit quantities. Ces quantités 64 bits ne peut pas conservées dans les types de données 32 bits.These 64-bit quantities cannot be held in 32-bit data types.

Notes

Ne modifiez le code VBA que s’il s’exécute dans la version 64 bits de Microsoft Office.You only need to modify VBA code if it runs in the 64-bit version of 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.The problem with running legacy VBA code in 64-bit Office is that trying to load 64-bits into a 32-bit data type truncates the 64-bit quantity. Cela peut entraîner une saturation de la mémoire, des résultats inattendus dans votre code et l’échec de l’application.This can result in memory overruns, unexpected results in your code, and possible application failure.

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.To address this problem and enable VBA code to work correctly in both 32-bit and 64-bit environments, several language features have been added to VBA. Le tableau en bas de ce document récapitule les nouvelles fonctionnalités de langue VBA.The table at the bottom of this document summarizes the new VBA language features. Trois ajouts importants sont le type aliasLongPtr, le type de donnéesLongLonget le mot cléPtrSafe.Three important additions are the LongPtr type alias, the LongLong data type, and the PtrSafe keyword.

  • LongPtr.LongPtr. VBA inclut désormais l’alias du type de variable LongPtr.VBA now includes the variable type alias 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.The actual data type that LongPtr resolves to depends on the version of Office that it is running in; LongPtr resolves to Long in 32-bit versions of Office, and LongPtr resolves to LongLong in 64-bit versions of Office. Utilisez LongPtr pour les marqueurs et descripteurs.Use LongPtr for pointers and handles.

  • LongLong.LongLong. Le type de donnéesLongLong est un entier signé 64 bits qui est disponible uniquement sur les versions 64 bits d’Office.The LongLong data type is a signed 64-bit integer that is only available on 64-bit versions of Office. Utilisez LongLong pour les intégrales 64 bits.Use LongLong for 64-bit integrals. 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.Conversion functions must be used to explicitly assign LongLong (including LongPtr on 64-bit platforms) to smaller integral types. Les conversions implicites de LongLong à des intégrales de plus petite taille ne sont pas autorisées.Implicit conversions of LongLong to smaller integrals are not allowed.

  • PtrSafe.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.The PtrSafe keyword asserts that a Declare statement is safe to run in 64-bit versions of Office.

Important

Toutes les instructions Declaredoivent désormais inclure le mot clé PtrSafe lors de l’exécution dans les versions 64 bits d’Office.All Declare statements must now include the PtrSafe keyword when running in 64-bit versions of 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.It is important to understand that simply adding the PtrSafe keyword to a Declare statement only signifies that the Declare statement explicitly targets 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.All data types within the statement that need to store 64-bits (including return values and parameters) must still be modified to hold 64-bit quantities.

Notes

Les instructionsDeclare avec le mot-clé PtrSafe sont la syntaxe recommandée.Declare statements with the PtrSafe keyword is the recommended syntax. Les instructionsDeclare qui incluent PtrSafe fonctionnent correctement dans l’environnement de développement VBA7 sur les plateformes 32 bits et 64 bits.Declare statements that include PtrSafe work correctly in the VBA7 development environment on both 32-bit and 64-bit platforms.

Pour assurer la compatibilité descendante avec VBA7 et versions antérieures, utilisez la construction suivante :To ensure backwards compatibility in VBA7 and earlier use the following construct:

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

Envisagez les exemples d’instructionsDeclare suivants.Consider the following Declare statement examples. 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.Running the unmodified Declare statement in 64-bit versions of Office will result in an error indicating that the Declare statement does not include the PtrSafe qualifier. 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.The modified VBA example contains the PtrSafe qualifier, but notice that the return value (a pointer to the active window) returns a Long data type. Dans Office 64 bits, cela est incorrect, car le pointeur doit être 64 bits.On 64-bit Office, this is incorrect because the pointer needs to be 64-bits. L’identificateur PtrSafe indique au compilateur que l’instruction Declare cible les 64 bits, donc l’instruction s’exécute sans erreur.The PtrSafe qualifier tells the compiler that the Declare statement is targeting 64-bits, so the statement executes without error. 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.But because the return value has not been updated to a 64-bit data type, the return value is truncated, resulting in an incorrect value returned.

L’exemple suivant est une instruction VBA héritée Declare non modifiée :Following is an unmodified legacy VBA Declare statement example:

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 :The following VBA Declare statement example is modified to include the PtrSafe qualifier but still use a 32-bit return value:

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.To reiterate, you must modify the Declare statement to include the PtrSafe qualifier, and you must update any variables within the statement that need to hold 64-bit quantities so that the variables use 64-bit data types.

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 :Following is a VBA Declare statement example that is modified to include the PtrSafe keyword and is updated to use the proper 64-bit (LongPtr) data type:

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.In summary, for code to work in 64-bit versions of Office, you need to locate and modify all existing Declare statements to use the PtrSafe qualifier. 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.You also need to locate and modify all data types within these Declare statements that reference handles or pointers to use the new 64-bit compatible LongPtr type alias, and types that need to hold 64-bit integrals with the new LongLong data type. 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.Additionally, you must update any user defined types (UDTs) that contain pointers or handles and 64-bit integrals to use 64-bit data types, and verify that all variable assignments are correct to prevent type mismatch errors.

Écriture de code fonctionnant sur Office 32 bits et 64 bitsWriting code that works on both 32-bit and 64-bit Office

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.To write code that can port between both 32-bit and 64-bit versions of Office, you only need to use the new LongPtr type alias instead of Long or LongLong for all pointers and handle values. L’alias type LongPtr résultera au type de données Long ou LongLong selon la version d’Office en cours d’exécution.The LongPtr type alias will resolve to the correct Long or LongLong data type depending on which version of Office is running.

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.Note that if you require different logic to execute, for example, you need to manipulate 64-bit values in large Excel projects, you can use the Win64 conditional compilation constant as shown in the following section.

Écrire du code fonctionnant sur Microsoft Office 2010 (32 bits ou 64 bits) et les versions antérieures d’OfficeWriting code that works on both Office 2010 (32-bit or 64-bit) and previous versions of 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.To write code that can work in both new and older versions of Office, you can use a combination of the new VBA7 and Win64 conditional Compiler constants. 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).The Vba7 conditional compiler constant is used to determine if code is running in version 7 of the VB editor (the VBA version that ships in 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.The Win64 conditional compiler constant is used to determine which version (32-bit or 64-bit) of Office is running.

#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 VBA7Summary of VBA7 language updates

Le tableau suivant résume et explique les ajouts au langage VBA.The following table summarizes the new VBA language additions and provides an explanation of each.

NomName TypeType DescriptionDescription
PtrSafePtrSafe Mot cléKeyword Indique qu’une instruction Declare est destinée aux systèmes 64 bits.Asserts that a Declare statement is targeted for 64-bit systems. Obligatoire sur 64 bits.Required on 64-bits.
LongPtrLongPtr Type de donnéesData type Alias de type mappé à Long sur les systèmes 32 bits et à LongLong sur les systèmes 64 bits.Type alias that maps to Long on 32-bit systems, or LongLong on 64-bit systems.
LongLongLongLong Type de donnéesData type Type de données de 8 octets qui est uniquement disponible sur les systèmes 64 bits.8-byte data type that is only available on 64-bit systems. Type numérique.Numeric type. Nombres entiers compris entre -9,223,372,036,854,775,808 et 9,223,372,036,854,775,807.Integer numbers in the range of -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807.

LongLong est un type déclaré valide uniquement sur les plateformes 64 bits.LongLong is a valid declared type only on 64-bit platforms. 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).Additionally, LongLong may not be implicitly converted to a smaller type (for example, you can't assign a LongLong to a Long). Cette opération est effectuée pour empêcher la troncature de pointeur par inadvertance.This is done to prevent inadvertent pointer truncation.

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).Explicit coercions are allowed, so in the previous example, you could apply CLng to a LongLong and assign the result to a Long (valid on 64-bit platforms only).
^ Caractère de déclaration de typeLongLongLongLong type-declaration character Déclare explicitement une valeur littérale comme un LongLong.Explicitly declares a literal value as a LongLong. Nécessaire pour déclarer une valeur littérale LongLong supérieure à la valeurLong maximale (sinon, elle sera implicitement convertie en double).Required to declare a LongLong literal that is larger than the maximum Long value (otherwise it will get implicitly converted to double).
CLngPtrCLngPtr Fonction de conversion de typetype conversion function Convertit une expression simple en LongPtr.Converts a simple expression to a LongPtr.
CLngLngCLngLng Fonction de conversion de typetype conversion function Convertit une expression simple en type de données LongLong (valide uniquement sur les plateformes 64 bits).Converts a simple expression to a LongLong data type (valid on 64-bit platforms only).
vbLongLongvbLongLong Constante VarTypeVarType constant Entier LongLong (Valide sur les plateformes 64 bits uniquement).LongLong integer (valid on 64-bit platforms only).
DefLngPtrDefLngPtr Instruction DefTypeDefType statement Définit le type de données par défaut d’une plage de variables comme LongPtr.Sets the default data type for a range of variables as LongPtr.
DefLngLngDefLngLng Instruction DefTypeDefType statement Définit le type de données par défaut d’une plage de variables comme LongLong.Sets the default data type for a range of variables as LongLong.

Voir aussiSee also

Assistance et commentairesSupport and feedback

Avez-vous des questions ou des commentaires sur Office VBA ou sur cette documentation ?Have questions or feedback about Office VBA or this 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.Please see Office VBA support and feedback for guidance about the ways you can receive support and provide feedback.