Erstellen eines Add-Ins (XLL) für Excel mit Visual C++

Wichtig: Dieser Artikel wurde maschinell und nicht von einem Menschen übersetzt. Die Microsoft Knowledge Base ist sehr umfangreich und ihre Inhalte werden ständig ergänzt beziehungsweise überarbeitet. Um Ihnen dennoch alle Inhalte auf Deutsch anbieten zu können, werden viele Artikel nicht von Menschen, sondern von Übersetzungsprogrammen übersetzt, die kontinuierlich optimiert werden. Doch noch sind maschinell übersetzte Texte in der Regel nicht perfekt, insbesondere hinsichtlich Grammatik und des Einsatzes von Fremdwörtern sowie Fachbegriffen. Microsoft übernimmt keine Gewähr für die sprachliche Qualität oder die technische Richtigkeit der Übersetzungen und ist nicht für Probleme haftbar, die direkt oder indirekt durch Übersetzungsfehler oder die Verwendung der übersetzten Inhalte durch Kunden entstehen könnten.

Den englischen Originalartikel können Sie über folgenden Link abrufen: 178474
Dieser Artikel wurde archiviert. Er wird im vorliegenden Zustand bereitgestellt und nicht mehr aktualisiert.
Zusammenfassung
Eine XLL ist ein Add-in für Microsoft Excel, die Sie mit jeder Compiler erstellen können, die Erstellen von DLLs (dynamic Link Libraries) unterstützt. Dieser Artikel soll Ihnen den Einstieg XLLs mit Microsoft Visual C++ erstellen. Um die in diesem Artikel beschriebenen Schritte befolgen, sollte Sie Erfahrung erstellen DLLs verfügen und Sie sollten Microsoft Excel 97 Developer's Kit, das die erforderlichen Header und Bibliothek Dateien, erstellen eine XLL enthält.
Weitere Informationen

Schritte zum Erstellen einer XLL

  1. Erstellen Sie ein neues MFC AppWizard (DLL)-Projekt Anewxll aufgerufen.
  2. Kopieren Sie die xlcall.h, Framewrk.h, Framewrk.c und Xlcall32.lib aus dem Microsoft Excel 97 Developer's Kit in Ihr Projektverzeichnis.
  3. Benennen Sie Framewrk.c in Framewrk.cpp.
  4. Projekt-Quellcodedateien Framewrk.cpp hinzugefügt.
  5. Fügen Sie den folgenden # include-Zeile an den Anfang der Framewrk.cpp um Compilerfehler zu vorkompilierten Headern zu vermeiden:
          #include "stdafx.h"					
  6. Ändern Sie die folgende Zeile in Framewrk.cpp:
          #include "..\..\include\xlcall.h"					
    zu:
          #include "xlcall.h"					
  7. Klicken Sie auf das Menü Projekt. Klicken Sie auf die Registerkarte Verbindung und des Objekts hinzugefügt Xlcall32.lib / Bibliothek Module Bearbeitungsfeld.
  8. Fügen Sie den folgenden # include-Anweisungen an den Anfang der Anewxll.cpp:
          #include "xlcall.h"      #include "framewrk.h"					
    Hinweis: das Projekt ist jetzt entsprechend und sollten kompilieren, jedoch, Sie haben nicht hinzugefügt XLL Unterstützung noch. Die verbleibenden Schritte geben Beispielcode, den können Sie die XLL, die Ihnen den Einstieg erleichtern hinzufügen.

  9. Hängen Sie den folgenden Code an Anewxll.cpp: Beispielcode-----------
          //================================================================      // 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. Fügen Sie die folgenden Zeilen am Ende der Datei Anewxll.def:
          xlAutoOpen      xlAutoClose      xlAddInManagerInfo      MyMotd      MyFunc					
  11. Sie können jetzt Ihr Projekt eine DLL mit Anewxll.dll erzeugen kompilieren. Nachdem die DLL kompiliert wird, benennen Sie in Anewxll.xll.

Verwenden des Add-Ins mit Microsoft Excel

  1. Starten Sie eine neue Arbeitsmappe in Microsoft Excel.
  2. Klicken Sie im Menü Extras auf Add-Ins. Wechseln Sie zu Anewxll.xll hinzufügen, und klicken Sie auf OK. Beachten Sie, wenn Sie im Dialogfeld Add-ins auf OK klicken, die Funktion XlAutoOpen ausgeführt wird.
  3. Klicken Sie im Menü MyMenu M.O.T.D auf. Wenn das Menüelement geklickt wird, wird die MyMotd-Funktion, ein Meldungsfeld mit einem Anführungszeichen anzuzeigen wie "Rebekah sagt"Ein Apple pro Tag, hält der Arzt sofort!"" ausgeführt.
  4. Fügen Sie in einer Zelle, die folgende Formel:
    =MYFUNC(2,6)					
    MYFUNC 12, das Produkt von 2 und 6 zurück.

  5. Klicken Sie im Menü Extras auf Add-Ins. Deaktivieren Sie das Kontrollkästchen Add-in, und klicken Sie auf OK. Beachten Sie, wenn Sie im Dialogfeld Add-ins klicken, die Funktion XlAutoClose ausgeführt wird.

Zusätzliche Hinweise

Wenn Sie Microsoft Visual C++ 6.0 verwenden, schlägt das vorangehende Beispiel fehl, wenn er im Debugmodus kompiliert. Der Fehler tritt da von Visual C++ 6.0 Zeichenfolge Literale in platziert werden lesen nur Speicher in Debug builds und der Stich XLL-Entwickler verwenden, um Längenpräfix Ihre Zeichenfolgen verursacht eine Zugriffsverletzung. Als eine Umgehung können Sie entfernen den Compilerschalter "/ Zi in den Projekteinstellungen oder nur einen Releasebuild zu testen. Weitere Informationen finden Sie unter den folgenden Artikel der Microsoft Knowledge Base:
198477PRB: Verwendung von/ZI Zugriffsverletzung verursachen
Informationsquellen
Weitere Informationen über XLLs finden Sie unter:
Microsoft Excel 97 Developer's Kit (ISBN: 1-57231-498-2)
XLL vc Xlcall xlcall32 xlmhowto

Warnung: Dieser Artikel wurde automatisch übersetzt.

Eigenschaften

Artikelnummer: 178474 – Letzte Überarbeitung: 12/05/2015 08:15:02 – Revision: 4.3

Microsoft Excel 2000 Standard Edition, Microsoft Excel 2002 Standard Edition, Microsoft Excel 97 Standard Edition, Microsoft Visual C++ 4.0 Standard Edition, Microsoft Visual C++ 5.0 Enterprise Edition, Microsoft Visual C++ 6.0 Enterprise Edition, Microsoft Visual C++ 5.0 Professional Edition, Microsoft Visual C++ 6.0 Professional Edition, Microsoft Visual C++, 32-bit Learning Edition 6.0

  • kbnosurvey kbarchive kbmt kbhowto KB178474 KbMtde
Feedback