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

SPRACHE AUSWÄHLEN SPRACHE AUSWÄHLEN
Artikel-ID: 178474 - Produkte anzeigen, auf die sich dieser Artikel bezieht
Alles erweitern | Alles schließen

Auf dieser Seite

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)

Eigenschaften

Artikel-ID: 178474 - Geändert am: Montag, 12. Februar 2007 - Version: 4.3
Die Informationen in diesem Artikel beziehen sich auf:
  • 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
Keywords: 
kbmt kbhowto KB178474 KbMtde
Maschinell übersetzter Artikel
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
Microsoft stellt Ihnen die in der Knowledge Base angebotenen Artikel und Informationen als Service-Leistung zur Verfügung. Microsoft übernimmt keinerlei Gewährleistung dafür, dass die angebotenen Artikel und Informationen auch in Ihrer Einsatzumgebung die erwünschten Ergebnisse erzielen. Die Entscheidung darüber, ob und in welcher Form Sie die angebotenen Artikel und Informationen nutzen, liegt daher allein bei Ihnen. Mit Ausnahme der gesetzlichen Haftung für Vorsatz ist jede Haftung von Microsoft im Zusammenhang mit Ihrer Nutzung dieser Artikel oder Informationen ausgeschlossen.

Ihr Feedback an uns

 

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