Comment faire pour créer un complément (XLL) pour Excel à l'aide de Visual C++

Traductions disponibles Traductions disponibles
Numéro d'article: 178474 - Voir les produits auxquels s'applique cet article
Agrandir tout | Réduire tout

Sommaire

Résumé

Un XLL est un composant logiciel complément pour Microsoft Excel que vous pouvez générer avec un compilateur qui prend en charge la génération de DLL (bibliothèques de liens dynamiques). Cet article est conçu pour vous aider à démarrer la création de XLL avec Microsoft Visual C++. Pour suivre les étapes décrites dans cet article, doivent avoir une certaine expérience de génération de DLL et vous devez disposer de la Excel 97 Kit de développement Microsoft, qui contient les fichiers d'en-tête et bibliothèque nécessaires pour générer un XLL.

Plus d'informations

Étapes pour créer un XLL

  1. Créez un projet MFC AppWizard (.dll) appelé Anewxll.
  2. Copiez les xlcall.h, Framewrk.h, Framewrk.c et Xlcall32.lib du Kit du développeur de Microsoft Excel 97 dans votre répertoire de projet.
  3. Renommez Framewrk.c Framewrk.cpp.
  4. Ajouter Framewrk.cpp à vos fichiers sources du projet.
  5. Ajoutez ce qui suit # include ligne vers le haut de Framewrk.cpp pour éviter les erreurs de compilateur sur les en-têtes précompilés :
    
          #include "stdafx.h"
    					
  6. Modifiez la ligne suivante dans Framewrk.cpp :
          #include "..\..\include\xlcall.h"
    					
    à:
          #include "xlcall.h"
    					
  7. Cliquez sur paramètres dans le menu projet. Cliquez sur l'onglet Link et ajouter Xlcall32.lib à l'objet / bibliothèque modules zone d'édition.
  8. Ajoutez le code suivant les instructions au sommet de Anewxll.cpp # include :
          #include "xlcall.h"
          #include "framewrk.h"
    					
    Remarque : le projet est maintenant le programme d'installation appropriée et doit compiler, toutefois, vous n'avez pas ajouté la prise en charge des XLL encore. Les étapes restantes fournissent un exemple de code que vous pouvez ajouter à la XLL pour vous aider à démarrer.

  9. Ajoutez le code suivant à Anewxll.cpp : exemple de code-----------
          //================================================================
          // Commonly used global variables
          int err;
          char buf[8192];
          char txt[8192];
    
          // Function registering table
          int nFuncs;
    
          // proc, type_text, function_text, arg, macro_type, category,
          // shortcut_text, help_topic, function_help
          static LPSTR func[][9] = {
          {" MyFunc", " JJJ", " MyFunc", " ", " 1", " MyCat", " ", " ", " "},
          {" MyMotd", " I", " MyMotd", " ", " 1", " MyCat", " ", " ", " "},
          {0,0,0,0, 0, 0, 0}
          };
    
          // Menu table
          int nMenuItems;
    
          static LPSTR menu[][5] = {
          {" &MyMenu", " ", " ", " Joe's Xll menu!!!", " "},
          {" M.O.T.D."," MyMotd", " ", " Message of the Day!", " "},
          {0, 0, 0, 0, 0}
          };
    
          // Initialization routine
          BOOL __stdcall xlAutoOpen(void) {
             AFX_MANAGE_STATE(AfxGetStaticModuleState( ));
    
             // DEBUG output to indicate when called
             AfxMessageBox("xlAutoOpen() called!", MB_SETFOREGROUND);
    
             int i, j;
    
             // Get XLL file name
             static XLOPER xDll;
             Excel(xlGetName, &xDll, 0);
    
             // Prefix strengths with their length & count items
             // Note the framework's TempStr() function prefixes the
             // lengths anyway, but this is for other code that might
             // use the arrays
             for(nFuncs=0;     func[nFuncs][0];     nFuncs++) {
                 for(i=0; i<9; i++) {
                     func[nFuncs][i][0]     = (BYTE) strlen(func[nFuncs][i]+1);
                 }
    
             }
    
             for(nMenuItems=0; menu[nMenuItems][0]; nMenuItems++) {
                 for(i=0; i<5; i++) {
                 menu[nMenuItems][i][0] = (BYTE) strlen(menu[nMenuItems][i]+1);
                 }
             }
    
             // Loop through the function list, and register the functions
             for(i=0; i<nFuncs; i++) {
    
                // Register a function
                err = Excel(xlfRegister, 0, 9, (LPXLOPER)&xDll,
                   (LPXLOPER)TempStr(func[i][0]),
                   (LPXLOPER)TempStr(func[i][1]),
                   (LPXLOPER)TempStr(func[i][2]),
                   (LPXLOPER)TempStr(func[i][3]),
                   (LPXLOPER)TempStr(func[i][4]),
                   (LPXLOPER)TempStr(func[i][5]),
                   (LPXLOPER)TempStr(func[i][6]),
                   (LPXLOPER)TempStr(func[i][7]),
                   (LPXLOPER)TempStr(func[i][8])
                   );
    
                if(err != xlretSuccess) {
                 sprintf(buf, "xlfRegister for function %d, err = %d", i, err);
                 AfxMessageBox(buf, MB_SETFOREGROUND);
                }
             }
    
             // Free XLL file name from the xlGetName call made earlier
             Excel(xlFree, 0, 1, (LPXLOPER)&xDll);
    
             // Menu support section
             static XLOPER xMenu;
             static XLOPER xMenuList[10*5];
             ASSERT(nMenuItems< 10);
    
             // Build menu
             xMenu.xltype            = xltypeMulti;
             xMenu.val.array.lparray = &xMenuList[0];
             xMenu.val.array.rows    = nMenuItems;
             xMenu.val.array.columns = 5;
    
             for(i=0; i<nMenuItems; i++) {
                 for(j=0; j<5; j++) {
                     xMenuList[j+i*5].xltype  = xltypeStr;
                     xMenuList[j+i*5].val.str = menu[i][j];
                 }
             }
    
             // Add menu
            Excel(xlfAddMenu,0,3,TempNum(1),(LPXLOPER)&xMenu,TempStr(" Help"));
    
             // Finished
             return 1;
          }
    
          // Cleanup routine
          BOOL __stdcall xlAutoClose(void) {
             ::MessageBox(NULL, "xlAutoClose()", "Debug", MB_SETFOREGROUND );
    
             // Delete menu
             Excel(xlfDeleteMenu, 0, 2, TempNum(1), TempStr(" MyMenu"));
    
             return 1;
          }
    
          // Support for descriptive information about the add-in(s)
          // You can add a new customized title for the user, but
          // unfortunately, only an add-in written in Microsoft Visual Basic
          // can add a description string.
          LPXLOPER _stdcall xlAddInManagerInfo(LPXLOPER xAction) {
             static XLOPER xInfo, xIntAction;
    
             // Find out what action must be taken
             Excel(xlCoerce, &xIntAction, 2, xAction, TempInt(xltypeInt));
    
             // DEBUG output to indicate when called
             sprintf(buf, "xlAddInManagerInfo(%ld)", (long)xIntAction.val.w);
             ::MessageBox(NULL, "xlAddInManagerInfo()", "Debug",
                 MB_SETFOREGROUND );
    
             // Set title if asked
             if(xIntAction.val.w == 1) {
                 xInfo.xltype = xltypeStr;
                 xInfo.val.str = " My Add-in!!!!";
                 xInfo.val.str[0] = (char)strlen(&xInfo.val.str[1]);
             }
             else {
                 xInfo.xltype = xltypeErr;
                 xInfo.val.err = xlerrValue;
             }
    
             return (LPXLOPER)&xInfo;
          }
    
            short __stdcall MyMotd(void) {
             char *name[] = {
                "Rebekah",
                "Brent",
                "John",
                "Joseph",
                "Robert",
                "Sara",
                0
             };
             char *quote[] = {
                "An apple a day, keeps the doctor away!",
                "Carpe Diem: Seize the Day!",
                "What you dare to dream, dare to do!",
                "I think, therefore I am.",
                "A place for everything, and everything in its place.",
                "Home is where the heart is.",
    
                0
             };
    
             int nNames, nQuotes;
    
             for(nNames=0; name[nNames]; nNames++);
             for(nQuotes=0; quote[nQuotes]; nQuotes++);
    
             sprintf(buf, "%s says '%s'", name[rand()%nNames],
                quote[rand()%nQuotes]);
             ::MessageBox(NULL, buf, "XLL MOTD", MB_SETFOREGROUND );
    
             return 0;
          }
    
          // Example function that returns the product of its two parameters
          long __stdcall MyFunc(long parm1, long parm2) {
           sprintf(buf, "You sent %ld and %ld to MyFunc()!", parm1, parm2);
           ::MessageBox(NULL, buf, "MyFunc() in Anewxll!!!", MB_SETFOREGROUND);
    
           return parm1 * parm2;
          }
          //=================================================================
    					
  10. Ajoutez les lignes suivantes à la fin de votre fichier Anewxll.def :
          xlAutoOpen
          xlAutoClose
          xlAddInManagerInfo
          MyMotd
          MyFunc
    					
  11. Vous pouvez maintenant compiler votre projet pour générer une DLL appelée Anewxll.dll. Une fois que la DLL est compilée, renommez-le Anewxll.xll.

L'utilisation du complément avec Microsoft Excel

  1. Démarrez un nouveau classeur dans Microsoft Excel.
  2. Dans le menu Outils, cliquez sur Compléments. Accédez à ajouter Anewxll.xll, puis cliquez sur OK. Notez que lorsque vous cliquez sur OK dans la boîte de dialogue Macros complémentaires, la fonction xlAutoOpen s'exécute.
  3. Cliquez sur M.O.T.D dans le menu MyMenu. Lorsqu'un clic est effectué sur votre élément de menu, la fonction MyMotd s'exécute pour afficher un MessageBox avec un devis comme «Rebekah indique 'Un Apple jour, conserve le médecin absent'!».
  4. Dans une cellule, ajoutez la formule suivante :
    =MYFUNC(2,6)
    					
    MYFUNC renvoie 12, le produit de 2 et 6.

  5. Dans le menu Outils, cliquez sur Compléments. Désactivez la case à cocher complément, puis cliquez sur OK. Notez que lorsque vous cliquez sur OK dans la boîte de dialogue Macros complémentaires, la fonction xlAutoClose s'exécute.

Remarques supplémentaires

Si vous utilisez Microsoft Visual C++ 6.0, l'exemple précédent échoue lorsque vous la compilez en mode débogage. La défaillance se produit car en tant que de Visual C++ 6.0, chaîne littéraux sont placés dans en lecture seule mémoire de débogage se développe et l'astuce que les développeurs XLL utilisent pour préfixe de longueur leurs chaînes provoque une violation d'accès. Sous la forme d'une solution de contournement, vous pouvez supprimer le commutateur de compilateur /Zi dans vos paramètres de projet ou seulement tester une version release. Pour plus d'informations, consultez l'article suivant dans la base de connaissances Microsoft :
198477PRB : Utilisation de /Zi peut provoquer une violation d'accès

Références

Pour plus d'informations concernant les XLL, consultez :
Kit de développement Microsoft Excel 97 (ISBN: 1-57231-498-2)

Propriétés

Numéro d'article: 178474 - Dernière mise à jour: lundi 12 février 2007 - Version: 4.3
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft Excel 2000 Standard
  • Microsoft Excel 2002
  • Microsoft Excel 97 Standard
  • Microsoft Visual C++ 4.0 Édition Standard
  • Microsoft Visual C++ 5.0 Édition Entreprise
  • Microsoft Visual C++ 6.0 Édition Entreprise
  • Microsoft Visual C++ 5.0 Édition Professionnelle
  • Microsoft Visual C++ 6.0 Édition Professionnelle
  • Microsoft Visual C++, 32-bit Learning Edition 6.0
Mots-clés : 
kbmt kbhowto KB178474 KbMtfr
Traduction automatique
IMPORTANT : Cet article est issu du système de traduction automatique mis au point par Microsoft (http://support.microsoft.com/gp/mtdetails). Un certain nombre d?articles obtenus par traduction automatique sont en effet mis à votre disposition en complément des articles traduits en langue française par des traducteurs professionnels. Cela vous permet d?avoir accès, dans votre propre langue, à l?ensemble des articles de la base de connaissances rédigés originellement en langue anglaise. Les articles traduits automatiquement ne sont pas toujours parfaits et peuvent comporter des erreurs de vocabulaire, de syntaxe ou de grammaire (probablement semblables aux erreurs que ferait une personne étrangère s?exprimant dans votre langue !). Néanmoins, mis à part ces imperfections, ces articles devraient suffire à vous orienter et à vous aider à résoudre votre problème. Microsoft s?efforce aussi continuellement de faire évoluer son système de traduction automatique.
La version anglaise de cet article est la suivante: 178474
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.

Envoyer des commentaires

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com