Partager via


Procédure : accéder aux DLL dans Excel (traduction automatique)

Dernière modification : vendredi 13 mars 2009

S’applique à : Excel 2010 | Office 2010 | VBA | Visual Studio

Dans cet article
Appel des fonctions DLL et les commandes à partir de VBA
Appeler des fonctions DLL directement à partir de la feuille de calcul
Appeler des commandes DLL directement à partir d'Excel
Mémoire de la DLL et plusieurs Instances DLL

Important

Cet article a été traduit automatiquement, voir l’avertissement. Vous pouvez consulter la version en anglais de cet article ici.

Vous pouvez accéder à une fonction ou commande DLL dans Microsoft Excel de diverses manières :

  • Grâce à une Visual Basic pour Applications de Microsoft, le module de code (VBA) dans lequel la fonction ou la commande a été divulgué à l'aide d'une instruction Declare.

  • Par l'intermédiaire d'une feuille de macro XLM en utilisant les fonctions CALL ou REGISTER.

  • Directement à partir de la feuille de calcul ou d'un élément personnalisé de l'utilisateur (IU).

Cette documentation ne couvre pas les fonctions XLM. Il est recommandé que vous appliquez une des deux autres approches.

Pour accéder directement à partir de la feuille de calcul ou d'un élément dans l'interface utilisateur personnalisé, la fonction ou la commande doit d'abord être enregistrée avec Excel. Pour plus d'informations sur l'enregistrement des commandes et fonctions, consultez Accès au code XLL dans Excel (traduction automatique).

Appel des fonctions DLL et les commandes à partir de VBA

Vous pouvez accéder fonctions DLL et les commandes dans VBA à l'aide de l'instruction Declare. Cette instruction a une seule syntaxe pour les commandes et l'autre pour les fonctions.

  • Syntaxe 1 – commandes

    [Public | Private] Declare Sub name Lib "libname" [Alias "aliasname"] [([arglist])]
    
  • Syntaxe 2 – fonctions

    [Public | Private] Declare Function name Lib "libname" [Alias "aliasname"] [([arglist])] [As type]
    

Les mots clés facultatifs Public et Private spécifient l'étendue de la fonction importée : Visual Basic l'ensemble du projet ou seulement pour le module Visual Basic, respectivement. Le nom est le nom que vous souhaitez utiliser dans le code VBA. Si cela diffère du nom dans la DLL, vous devez utiliser le spécificateur d'Alias « NomAlias », et vous devez donner le nom de la fonction comme étant exportée par la DLL. Si vous souhaitez accéder à une fonction DLL par référence à un nombre ordinal DLL, vous devez fournir un nom d'alias, c'est-à-dire l'ordinal préfixé par #.

Commandes doivent retourner void. Fonctions doivent retourner les types que VBA peut reconnaître ByVal. Cela signifie que certains types sont renvoyées plus facilement en modifiant les arguments en place : chaînes, les tableaux, les types définis par l'utilisateur et les objets.

Notes

VBA ne peut pas vérifier que la liste d'arguments et le rendement indiqué dans le module Visual Basic sont les mêmes codé dans la DLL. Vous devez vérifier vous-même très attentivement, car une erreur pouvant provoquer d'Excel se bloque.

Lorsque la fonction ou les arguments de la commande ne sont pas passés par référence ou un pointeur, ils doivent être précédés le mot clé ByVal dans la déclaration de arglist. Lorsqu'une fonction C/C++ accepte les arguments de pointeur ou une fonction C++ accepte les arguments de référence, ils doivent être transmis à ByRef. Le mot clé ByRef peut être omis de listes d'arguments, car il s'agit de la valeur par défaut dans VBA.

Types d'arguments dans C/C++ et VBA

Vous devez noter les éléments suivants lorsque vous comparez les déclarations des types d'arguments dans C/C++ et VBA.

  • Un String VBA est passé comme un pointeur vers une structure BSTR chaîne d'octets lorsqu'il est passé ByVal et comme un pointeur vers un pointeur lorsqu'il est passé ByRef.

  • Un Variant VBA qui contient une chaîne est passée comme un pointeur à un structure de chaîne à caractère élargi BSTR lorsqu'il est passé de Unicode ByVal et comme un pointeur vers un pointeur lorsqu'il est passé ByRef.

  • Le Integer VBA est un type de 16 bits équivalent au type short signé en C/C++.

  • Le Long VBA est un type de 32 bits équivalent à un int signé en C/C++.

  • VBA et C/C++ permettent la définition des types de données définis par l'utilisateur, en utilisant les instructions Type et struct respectivement.

  • VBA et C/C++ prend en charge le type de données Variant, défini pour C/C++ dans les fichiers d'en-tête Windows OLE/COM en tant que VARIANT.

  • Les tableaux VBA sont OLE SafeArrays, défini pour C/C++ dans les fichiers d'en-tête Windows OLE/COM en tant que SAFEARRAY.

  • Le type de données Currency VBA est passé comme une structure de type CY, défini dans le wtypes.h fichier en-tête de Windows, lorsque passée ByVal et comme un pointeur vers cette lorsque passé ByRef.

Dans VBA, les éléments de données dans les types de données définis par l'utilisateur sont emballés à des limites de 4 octets, considérant que dans Visual Studio, par défaut, ils sont compressés à des limites de 8 octets. Par conséquent, vous devez entourer la définition de la structure C/C++ dans un bloc de #pragma pack(4) … #pragma pack() pour éviter les éléments étaient mal alignées.

Voici un exemple des définitions de type utilisateur équivalents.

Type VB_User_Type
    i As Integer
    d As Double
    s As String
End Type
#pragma pack(4)
struct C_user_type
{
    short iVal;
    double dVal;
    BSTR bstr; // VBA String type is a byte string
}
#pragma pack() // restore default

VBA prend en charge d'une plage de valeurs dans certains cas que Excel prend en charge. Le double de VBA est conforme, IEEE, prise en charge un nombre subnormal qui est arrondi à zéro dans la feuille de calcul. Le type de Date VBA peut représenter des dates aussi tôt que 1-Jan-0100 à l'aide de dates sérialisés négatifs. Excel permet uniquement de dates sérialisés supérieure ou égale à zéro. Le type de Currency VBA — un entier 64 bits avec échelle — peuvent obtenir une précision non pris en charge dans les doubles de 8 octets et par conséquent, ne correspond pas dans la feuille de calcul.

Excel transmet uniquement les variantes des types suivants à une fonction définie par l'utilisateur VBA.

Type de données VBA

Indicateurs de bits de type Variant C/C++

Description

Double

VT_R8

Boolean

VT_BOOL

Date

VT_DATE

Chaîne

VT_BSTR

Chaîne d'octets OLE Bstr

Plage

VT_DISPATCH

Références de plage et de cellule

Variant contenant un tableau

VT_ARRAY | VT_VARIANT

Tableaux littérales

Ccy

VT_CY

entier 64 bits à l'échelle pour permettre quatre positions décimales de précision.

Variant contenant une erreur

VT_ERROR

VT_EMPTY

Les cellules vides ou des arguments omis

Vous pouvez vérifier le type d'un Variant passé dans VBA à l'aide de la VarType, à ceci près que la fonction renvoie le type des valeurs de la plage lorsqu'elle est appelée avec des références. Pour déterminer si un Variant est un objet de référence Range, vous pouvez utiliser la fonction IsObject.

Vous pouvez créer des Variants contenant des tableaux de variants dans VBA à partir d'un Range en définissant sa propriété Value à un Variant. Toutes les cellules dans la plage source qui sont mis en forme en utilisant le format monétaire standard pour les paramètres régionaux en vigueur au moment où sont convertis aux éléments du tableau de type Currency. Toutes les cellules formatés comme les dates sont converties aux éléments du tableau de type Date. Cellules contenant des chaînes sont convertis en variantes de BSTR de caractères étendus. Cellules contenant des erreurs sont converties en Variants de type VT_ERROR. Cellules contenant des BooleanTrue ou False sont converties en Variants de type VT_BOOL.

Notes

La Variant stocke True comme – 1 et False en tant que 0. Nombres non mis en forme en tant que dates ou les montants en devises sont convertis en variantes du type VT_R8.

Variant et Arguments de chaîne

Excel fonctionne en interne avec des chaînes de caractères étendus Unicode. Lorsqu'une fonction VBA définie par l'utilisateur est déclarée comme prenant un argument String, Excel convertit la chaîne fournie en une chaîne d'octets dans un moyen de paramètres régionaux spécifiques. Si vous souhaitez que votre fonction à passer une chaîne Unicode, votre fonction VBA définie par l'utilisateur doit accepter un Variant au lieu d'un argument de String. Votre fonction DLL peut accepter cette chaîne à caractère élargi BSTR Variant à partir de VBA.

Pour renvoyer des chaînes Unicode VBA à partir d'une DLL, vous devez modifier un argument de chaîne Variant en place. Pour ce faire, vous devez déclarer la fonction DLL comme prenant un pointeur vers le Variant et dans votre code C/C++ et déclarer l'argument dans le code VBA en tant que ByRef varg As Variant. La mémoire ancien de la chaîne doit être libérée, et la nouvelle valeur de chaîne créée en utilisant les fonctions de chaîne de OLE Bstr uniquement dans la DLL.

Pour renvoyer une chaîne d'octets à VBA à partir d'une DLL, vous devez modifier un argument de type BSTR chaîne d'octets en place. Pour ce faire, vous devez déclarer la fonction DLL comme prenant un pointeur vers un pointeur vers le BSTR et dans votre code C/C++ et déclarer l'argument dans le code VBA en tant que « ByRef varg As String ».

Vous devez gérer uniquement les chaînes qui sont passées à plusieurs égards à partir de VBA en utilisant les fonctions de chaîne OLE BSTR pour éviter les problèmes liés à la mémoire. Par exemple, vous devez appeler SysFreeString pour libérer la mémoire avant de remplacer la chaîne passée dans et de SysAllocStringByteLen ou de SysAllocStringLen pour allouer de l'espace pour une nouvelle chaîne.

Vous pouvez créer des erreurs de feuille de calcul Excel en tant que Variants dans VBA à l'aide de la fonction CVerr avec des arguments, comme indiqué dans le tableau suivant. Erreurs de feuille de calcul peuvent également être renvoyées vers VBA à partir d'une DLL à l'aide de Variants de type VT_ERROR et avec les valeurs suivantes dans le champ ulVal.

Erreur

Valeur de type Variant ulVal

Argument CVerr

# NULL !

2148141008

2000

#DIV/0!

2148141015

2007

# VALEUR !

2148141023

2015

# REF !

2148141031

2023

# NOM ?

2148141037

2029

# NUM !

2148141044

2036

#N/A

2148141050

2042

Notez que la valeur de ulVal de type Variant facultatif donnée est équivalente à la valeur de l'argument CVerr plus x800A0000 hexadécimal.

Appeler des fonctions DLL directement à partir de la feuille de calcul

Impossible d'accéder des fonctions de DLL Win32 à partir de la feuille de calcul sans, par exemple, à l'aide de VBA ou XLM en tant qu'interfaces, ou sans informer Excel la fonction, ses arguments et son type de retour à l'avance. Le processus d'effectuer cette opération s'appelle l'inscription.

L'une des manières dont les fonctions d'une DLL est accessible dans la feuille de calcul sont les suivantes :

  • Déclarez la fonction dans VBA, comme décrit précédemment et y accéder via une fonction définie par l'utilisateur VBA.

  • Appelez la fonction DLL à l'aide d'appel dans une feuille de macro XLM et y accéder via une fonction définie par l'utilisateur XLM.

  • Utiliser une commande XLM ou VBA pour appeler la fonction de REGISTER XLM, qui fournit les informations nécessaires à l'identification de la fonction lorsqu'il est entré dans une cellule de feuille de calcul Excel.

  • Transformer la DLL en un XLL et enregistrer la fonction à l'aide de la fonction de xlfRegister API C lorsque le XLL est activé.

L'approche quatrième est autonome : le code qui inscrit les fonctions et le code de fonction sont contenus dans le même projet de code. Modifications apportées à la macro complémentaire n'implique pas apporter des modifications à une feuille XML ou à un module de code VBA. Pour cela de manière bien gérée tout en restant toujours dans les fonctionnalités de l'API C, vous devez convertir une DLL en un XLL et charger la macro complémentaire qui en résulte en utilisant le Gestionnaire de compléments. Cela permet à Excel d'appeler une fonction qui expose de votre DLL lorsque le complément est chargé ou activé, à partir de laquelle vous pouvez vous inscrire toutes les fonctions votre XLL contient et procéder à toute autre initialisation de DLL.

Appeler des commandes DLL directement à partir d'Excel

Commandes de DLL Win32 ne sont pas accessibles directement à partir des menus et boîtes de dialogue Excel sans qu'une interface, tels que VBA, ou sans les commandes en cours d'inscription à l'avance.

L'une des manières dans laquelle vous pouvez accéder aux commandes d'une DLL sont les suivantes :

  • Déclarer la commande dans VBA, comme décrit précédemment et y accéder via une macro VBA.

  • Appelez la commande DLL à l'aide de CALL sur une feuille de macro XLM et accédez-y en utilisant une macro XLM.

  • Pour appeler la fonction REGISTER XLM, qui fournit les informations que nécessaires à reconnaître la commande lorsqu'il est entré dans une boîte de dialogue suppose que le nom d'une commande de macro Excel, utilisez une commande XLM ou VBA.

  • Transformer la DLL en un XLL et enregistrer la commande en utilisant la fonction de xlfRegister API C.

Comme indiqué précédemment dans le contexte des fonctions DLL, l'approche quatrième est la plus autonome, conserver le code d'enregistrement proche pour le code de commande. Pour ce faire, vous devez convertir une DLL en un XLL et charger le complément obtenu à l'aide du Gestionnaire de compléments. Enregistrement des commandes de cette manière vous permet également de joindre la commande à un élément de l'interface utilisateur, tel qu'un menu personnalisé, ou pour configurer une interruption d'événement qui appelle la commande sur une séquence de touches donnée ou tout autre événement.

Toutes les commandes XLL qui sont enregistrés avec Excel sont adoptés par Excel pour la forme suivante.

int WINAPI my_xll_cmd(void)
{
// Function code...
    return 1;
}

Notes

Excel ignore la valeur de retour, sauf si elle est appelée à partir d'une feuille de macro XLM, dans lequel cas la valeur de retour est convertie en TRUE ou FALSE. Vous devez par conséquent retourner 1 si votre commande exécutée avec succès et 0 si elle a échoué ou a été annulée par l'utilisateur.

Mémoire de la DLL et plusieurs Instances DLL

Lorsqu'une application charge un DLL, code exécutable de la DLL est chargé dans le tas global afin qu'elle puisse être exécutée et l'espace est alloué sur le tas global pour ses structures de données. Windows utilise le mappage de mémoire pour rendre ces zones de mémoire apparaissent comme s'ils sont dans le processus de l'application afin que l'application peut y accéder.

Si une deuxième application puis charge la DLL, Windows ne rend pas une autre copie du code exécutable DLL, comme cette mémoire est en lecture seule. Windows mappe la mémoire de code exécutable DLL aux processus des deux applications. Toutefois, il effectue allouer un deuxième espace pour une copie privée de structures de données de la DLL et mappe cette copie pour le second processus uniquement. Ceci garantit qu'aucune application peut interférer avec les données de la DLL de l'autre.

Cela signifie que les développeurs de la DLL n'ont pas à se préoccuper de variables statiques et globales et les structures de données accessibles par plusieurs applications ou plus d'une instance de la même application. Chaque instance de chaque application obtient sa propre copie des données de la DLL.

Les développeurs DLL n'avez pas besoin de vous préoccuper de la même instance d'une application appelant leur DLL autant de fois à partir de threads différents, car cela peut entraîner des conflits relatifs aux données de cette instance. Pour plus d'informations, consultez Gestion de la mémoire dans Excel (traduction automatique).

Notes

Avertissement traduction automatique : cet article a été traduit par un ordinateur, sans intervention humaine. Microsoft propose cette traduction automatique pour offrir aux personnes ne maîtrisant pas l’anglais l’accès au contenu relatif aux produits, services et technologies Microsoft. Comme cet article a été traduit automatiquement, il risque de contenir des erreurs de grammaire, de syntaxe ou de terminologie.

Voir aussi

Concepts

Développement de DLL (traduction automatique)

Appel dans Excel à partir de DLL ou XLL (traduction automatique)