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

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
Cet article a été archivé. Il est proposé « en l'état » et ne sera plus mis à jour.
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)
XLL em xlcall xlcall32 xlmhowto

Propriétés

ID d'article : 178474 - Dernière mise à jour : 12/05/2015 08:15:02 - Révision : 4.3

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

  • kbnosurvey kbarchive kbmt kbhowto KB178474 KbMtfr
Commentaires