Verwenden Sie MFC zum Automatisieren von Excel und Tabellen navigieren

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

Auf dieser Seite

Zusammenfassung

Dieser Artikel beschreibt wie Sie die Microsoft Foundation Class (MFC)-Bibliothek mit Microsoft Visual C++, Versionen 5.0 und 6.0 installiert-Version 4.2, um Microsoft Excel zu automatisieren. Insbesondere gezeigt, wie Sie zwischen die Arbeitsblätter in einer Arbeitsmappe und platzieren Sie Daten der Zellen in jedem Arbeitsblatt navigieren.

Weitere Informationen

Sie können den Code in diesem Artikel in der Meldungshandlerfunktion eines Ereignisses in einer MFC-cpp-Datei definiert kopieren. Allerdings ist der Zweck des Codes Erläutern Sie den Prozess der mithilfe der IDispatch-Schnittstellen und Memberfunktionen in der Excel-Typ-Bibliothek definiert. Der Hauptvorteil stammt aus lesen und Verstehen des Codes, so dass Sie das Beispiel ändern, oder Schreiben Sie Code zum Automatisieren von Microsoft Excel 97, Excel 2000 oder Excel 2002 völlig können.

Hinweise zur Automatisierung von Microsoft Excel 2000 und höher

Einige Methoden und Eigenschaften haben in Microsoft Excel 2000 und höher geändert. Weitere Informationen über den Beispielcode in diesem Artikel mit dem Microsoft Excel 2000 und höher geben Bibliothek beschriebenen finden Sie in der folgenden Artikel der Microsoft Knowledge Base:
224925INFO: Typbibliotheken für Office können sich mit neuen Version ändern.

Schritte zum Erstellen des Projekts

  1. Erstellen Sie in Microsoft Excel eine neue Arbeitsmappe mit dem Namen Test.xls ein. Speichern Sie es auf C:\Test.xls.
  2. Führen Sie die Schritte 1 bis 12 im folgenden Microsoft Knowledge Base Artikel ein Beispielprojekt zu erstellen, die IDispatch-Schnittstellen und Memberfunktionen in der Bibliothek Excel8.olb Typ definierten verwendet:
    178749Gewusst wie: Erstellen eines Automatisierungsprojekts mit MFC und einer Typenbibliothek
  3. Fügen Sie am oberen Rand der AutoProjectDlg.cpp die folgende Zeile:
          #include "excel8.h"
    						
    für Excel 2000, den Dateinamen excel9.h ändern. Für Excel 2002 ändern Sie den Dateinamen in excel.h.
  4. Fügen Sie folgenden Code hinzu CAutoProjectDlg::OnRun() in der Datei AutoProjectDLG.cpp.

    Beispielcode

          // This example walks through three worksheets and places
    
          // literal strings in cells A1 and B2 on each sheet.
    
          try
           {
           _Application app;  // app is an _Application object.
           _Workbook book;
           _Worksheet sheet;
           Workbooks books;
           Worksheets sheets;
           Range range;
           char buf[1024];
           LPDISPATCH lpDisp; // IDispatch *; pointer reused many times.
           long count; // Count of the number of worksheets.
           int i;
    
           // Common OLE variants. These are easy variants to use for
           // calling arguments.
           COleVariant
                      covTrue((short)TRUE),
                      covFalse((short)FALSE),
                      covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
    
           // Start Excel and get Application object.
           if(!app.CreateDispatch("Excel.Application"))
           {
            AfxMessageBox("Couldn't CreateDispatch on Excel");
            return;
           }
    
           // Set visible.
           app.SetVisible(TRUE);
    
           // Get Workbooks collection.
           lpDisp = app.GetWorkbooks();  // Get an IDispatch pointer
    
           ASSERT(lpDisp);               // or fail.
           books.AttachDispatch( lpDisp );  // Attach the IDispatch pointer
                                            // to the books object.
    
              // Open a workbook.
              lpDisp = books.Open("C:\\Test.xls",
                             covOptional, covOptional, covOptional, covOptional,
                             covOptional, covOptional, covOptional, covOptional,
                             covOptional, covOptional, covOptional, covOptional,
                             covOptional, covOptional, covOptional); // Excel 2000 has 13 parameters
              ASSERT(lpDisp);  // It worked!
    
    
    
           // Attach to a Workbook object.
           book.AttachDispatch( lpDisp );  // Attach the IDispatch pointer
                                           // to the book object.
    
           // Get sheets.
           lpDisp = book.GetSheets();
           ASSERT(lpDisp);
           sheets.AttachDispatch(lpDisp);
    
           // Get the number of worksheets in this book.
           count = sheets.GetCount();
           sprintf(buf, "%ld worksheets in this Workbook.", count);
           ::MessageBox(NULL, buf, "Sheet Count", MB_OK | MB_SETFOREGROUND);
    
           // Enumerate through worksheets in book and activate in
           // succession.
           for(i=0; i<count; i++)
           {
            // Get the sheet. Note that 1 is added to the index to make sure
            // it is 1-based, not zero-based. Otherwise, you will get odd
            // exceptions.
            lpDisp = sheets.GetItem( COleVariant((short)(i+1)) ); // 'Item' in
                                  // the Worksheets collection = worksheet #.
            ASSERT(lpDisp);
            sheet.AttachDispatch(lpDisp);
            // Activate and sleep for two seconds so you can see it happen.
            sheet.Activate();
            ::Sleep(2000);
    
            lpDisp = sheet.GetRange(COleVariant("A1"), COleVariant("W40"));
                                                       // From cell# To cell#.
            ASSERT(lpDisp);
            range.AttachDispatch(lpDisp);  // Attach the IDispatch pointer
                                           // to the range.
            range.Clear();  // Could be ClearContents().
            ::Sleep(500);
            lpDisp = sheet.GetRange(COleVariant("A1"), COleVariant("A1"));
                                                           // From and To.
            ASSERT(lpDisp);
            range.AttachDispatch(lpDisp);// Attach the IDispatch pointer
                                         // to the range.
            range.SetValue(COleVariant("A1A1")); // Excel 97 and Excel 2000.
    
    range.SetValue2(COleVariant("A1A1")); // Excel 2002. A1A1 is data string
    
    
            lpDisp = sheet.GetRange(COleVariant("B2"), COleVariant("B2"));
            ASSERT(lpDisp);
            range.AttachDispatch(lpDisp);
            range.SetValue(COleVariant("B2B2")); // B2B2 is data also.
    range.SetValue2(COleVariant("B2B2")); // Excel 2002
            ::Sleep(2000);  // Could be Sleep(1000) for a one second pause.
            // Release dispatch pointer.
            sheet.ReleaseDispatch();
            } // End of For loop. You walked through all three sheets of the
              // workbook, and stuffed data into cells A1 and B2.
           AfxMessageBox("Waiting...");
    
           // Set the workbook back to sheet 1 so that it starts there next
           // time it is opened.
           lpDisp = sheets.GetItem( COleVariant((short)(1)) );
    
           ASSERT(lpDisp);
           sheet.AttachDispatch(lpDisp);
           sheet.Activate();
    
           lpDisp = sheet.GetRange(COleVariant("A1"), COleVariant("W40"));
                                                      // From and To.
           ASSERT(lpDisp);
           range.AttachDispatch(lpDisp);// Attach the IDispatch pointer
                                        // to the range object.
           range.Clear();  // Could be ClearContents().
    
           lpDisp = sheet.GetRange(COleVariant("A1"), COleVariant("A1"));
           ASSERT(lpDisp);
           range.AttachDispatch(lpDisp);
           range.SetValue(COleVariant("GoodBye"));// Excel 97 and Excel 2000
    range.SetValue2(COleVariant("GoodBye")); // Excel 2002
    
           ::Sleep(3000);
    
           range.Clear();  // Could be ClearContents().
           book.SetSaved(TRUE); // Forestall the 'Save ?' dialog box.
           app.Quit();  //Excel departs.
    
           }  // End of Processing logic.
    
          catch(COleException *e)
          {
           char buf[1024];
           sprintf(buf, "COleException. SCODE: %08lx.", (long)e-> 
    m_sc);
           ::MessageBox(NULL, buf, "COleException", MB_SETFOREGROUND | MB_OK);
          }
    
          catch(COleDispatchException *e)
          {
    
           char buf[1024];
           sprintf(buf,
              "COleDispatchException. SCODE: %08lx,Description: \"%s\".",
              (long)e->m_wCode, (LPSTR)e->m_strDescription.GetBuffer(1024));
           ::MessageBox(NULL, buf, "COleDispatchException",
                        MB_SETFOREGROUND | MB_OK);
          }
    
          catch(...)
          {
           ::MessageBox(NULL, "General Exception caught.", "Catch-All",
                        MB_SETFOREGROUND | MB_OK);
          }
    					
  5. Möglicherweise müssen den Code in CAutoProjectDlg::OnRun() an den richtigen Pfad für Ihre Arbeitsmappe Test.xls ändern. Die Arbeitsmappe wird in der folgenden Zeile verwiesen:
    lpDisp = books.open("C:\\Test.xls", . . .);
    					

Informationsquellen

Weitere Informationen zur Automatisierung von Office-Anwendungen finden Sie in Microsoft Knowledge Base, klicken Sie auf die Artikelnummer unten klicken, um der Microsoft Knowledge Base:
222101So suchen und Verwenden der Dokumentation zum Office-Objektmodell

Eigenschaften

Artikel-ID: 178782 - Geändert am: Montag, 22. Januar 2007 - Version: 4.1
Die Informationen in diesem Artikel beziehen sich auf:
  • Microsoft Foundation Class Library 4.2, wenn verwendet mit:
    • Microsoft Visual C++ 5.0 Standard Edition
    • Microsoft Visual C++ 6.0 Service Pack 5
    • Microsoft Excel 97 Standard Edition
  • Microsoft Office XP Developer Edition
  • Microsoft Office 2000 Developer Edition
  • Microsoft Excel 2002 Standard Edition
Keywords: 
kbmt kbautomation kbhowto kbinterop KB178782 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: 178782
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