Automatisieren von Excel aus MFC und Visual C++ 2005 oder Visual C++ .NET zum Ausfüllen oder Abrufen von Daten in einem Bereich mithilfe von Arrays

Eine Microsoft C# .NET-Version dieses Artikels finden Sie unter 302096. Eine Microsoft Visual Basic .NET-Version dieses Artikels finden Sie unter 302094.

Hinweis

Microsoft Visual C++ 2005, Microsoft Visual C++ .NET 2003 und Microsoft Visual C++ .NET 2002 unterstützen sowohl das vom Microsoft .NET Framework bereitgestellte verwaltete Codemodell als auch das nicht verwaltete systemeigene Microsoft Windows-Codemodell. Die Informationen in diesem Artikel gelten nur für nicht verwalteten Visual C++-Code.

Zusammenfassung

In diesem Schritt-für-Schritt-Artikel wird veranschaulicht, wie Sie Microsoft Excel aus Visual C++ 2005 oder Visual C++ .NET automatisieren, um Werte in einem Mehrzellenbereich mithilfe von Arrays auszufüllen und abzurufen.

Erstellen eines Automatisierungsclients für Excel

Wenn Sie einen Mehrzellenbereich ausfüllen möchten, ohne Zellen einzeln zu füllen, können Sie die Value-Eigenschaft eines Range-Objekts auf ein zweidimensionales Array festlegen. Ebenso können Sie mithilfe der Value-Eigenschaft ein zweidimensionales Array von Werten für mehrere Zellen gleichzeitig abrufen. Die folgenden Schritte veranschaulichen diesen Prozess für das Festlegen und Abrufen von Daten mithilfe von zweidimensionalen Arrays.

  1. Führen Sie die Schritte im Abschnitt "Erstellen eines Automatisierungsclients" des folgenden Microsoft Knowledge Base-Artikels aus, um einen einfachen Automatisierungsclient zu erstellen:

    307473 Verwenden einer Typbibliothek für die Office-Automatisierung aus Visual C++ .NET

    Fügen Sie in Schritt 3 dem Formular eine zweite Schaltfläche und ein Kontrollkästchen hinzu. Ändern Sie die ID der Schaltfläche in IDC_GETVALUES und die Beschriftung in "Werte abrufen". Ändern Sie die ID des Kontrollkästchens in IDC_CHECK und die Beschriftung in "Mit Zeichenfolgen ausfüllen".

    Wählen Sie in Schritt 4 des Artikels "Microsoft Excel 10.0-Objektbibliothek" aus, wenn Sie Excel 2002 aus Office XP automatisieren. Der Standardspeicherort für Excel 2002 ist "C:\Programme\Microsoft Office\Office10\Excel.exe". Oder wählen Sie "Microsoft Excel 11.0-Objektbibliothek" aus, wenn Sie Microsoft Office Excel 2003 automatisieren. Der Standardspeicherort für Excel 2003 ist "C:\Program Files\Microsoft Office\Office11\Excel.exe". Wählen Sie die folgenden Microsoft Excel-Schnittstellen aus:

    • _Anwendung
    • _Arbeitsmappe
    • _Arbeitsblatt
    • Bereich
    • Arbeitsmappen
    • Arbeitsblätter

    Fügen Sie in Schritt 6 die folgenden #include Anweisungen direkt nach der #pragma once-Direktive in Autoprojectdlg.h hinzu:

    #include "CApplication.h"
    #include "CRange.h"
    #include "CWorkbook.h"
    #include "CWorkbooks.h"
    #include "CWorksheet.h"
    #include "CWorksheets.h"
    
    
  2. Fügen Sie der CAutoProjectDlg-Klasse die folgenden zwei variablen öffentlichen Member hinzu:

    CApplication oExcel;
    CWorkbook oBook;
    
    
  3. Klicken Sie im Dialogfeld mit der rechten Maustaste auf IDC_CHECK, und wählen Sie "Variable hinzufügen" aus. Benennen Sie die Variable m_bFillWithStrings, und klicken Sie auf "Fertig stellen".

  4. Doppelklicken Sie im Dialogfeld auf "Ausführen", und ersetzen Sie den folgenden Code

    void CAutoProjectDlg::OnBnClickedRun()
    {
    // TODO: Add your control notification handler code here
    }
    
    

    mit:

    void CAutoProjectDlg::OnBnClickedRun()
    {
    CWorkbooks oBooks;
    CWorksheets oSheets;
    CWorksheet oSheet;
    CRange oRange;
    COleVariant covOptional(DISP_E_PARAMNOTFOUND,VT_ERROR);
    
    // If you have not created Excel, create a new instance.
    if (oExcel.m_lpDispatch == NULL) {
    oExcel.CreateDispatch("Excel.Application");
    }
    // Show Excel to the user.
    oExcel.put_Visible(TRUE);
    oExcel.put_UserControl(TRUE);
    
    // Add a new workbook and get the first worksheet in that book.
    oBooks = oExcel.get_Workbooks();
    oBook = oBooks.Add(covOptional);
    oSheets = oBook.get_Worksheets();
    oSheet = oSheets.get_Item(COleVariant((short)1));
    
    // Get a range of data.
    oRange = oSheet.get_Range(COleVariant("A1"),covOptional);
    oRange = oRange.get_Resize(COleVariant((short)5),COleVariant((short)5));
    
    COleSafeArray saRet;
    DWORD numElements[2];
    numElements[0] = 5;
    numElements[1] = 5;
    
    long index[2];
    // Create a BSTR or double safe array.
    if (m_bFillWithStrings.GetCheck())
    saRet.Create(VT_BSTR,2,numElements);
    else
    saRet.Create(VT_R8,2,numElements);
    
    // Fill the array with data.
    for (int iRow = 1; iRow <= 5; iRow++) {
    for (int iCol = 1; iCol <= 5; iCol++) {
    index[0]=iRow-1;
    index[1]=iCol-1;
    if (m_bFillWithStrings.GetCheck()) {
    CString szTemp;
    szTemp.Format("%d|%d",iRow,iCol);
    BSTR bstr = szTemp.AllocSysString();
    saRet.PutElement(index,bstr);
    SysFreeString(bstr);
    } else {
    double d = iRow * iCol;
    saRet.PutElement(index,&d);
    }
    }
    }
    // Send the array to Excel.
    oRange.put_Value(covOptional,COleVariant(saRet));
    }
    
    

    Hinweis In Visual C++ 2005 müssen Sie die Common Language Runtime-Unterstützungscompileroption (/clr:oldSyntax) hinzufügen, um das vorherige Codebeispiel erfolgreich kompilieren zu können. Führen Sie die folgenden Schritte aus, um die Common Language Runtime-Unterstützungscompileroption hinzuzufügen:

    1. Klicken Sie auf "Projekt" und dann auf " ProjectName-Eigenschaften".

      Beachten Sie, dassProjectName ein Platzhalter für den Namen des Projekts ist.

    2. Erweitern Sie die Konfigurationseigenschaften, und klicken Sie dann auf "Allgemein".

    3. Klicken Sie im rechten Bereich auf die Option " Common Language Runtime Support, Old Syntax (/clr:oldSyntax)" in den Projekteinstellungen für die Common Language Runtime-Unterstützung .

    4. Klicken Sie im Feld Wähleinstellungen (Telefonkontext) auf Durchsuchen, um die Wähleinstellungen für den Benutzer zu suchen.

    Weitere Informationen zu Compileroptionen für allgemeine Sprachlaufzeiten finden Sie auf der folgenden Microsoft Developer Network (MSDN)-Website:

    https://msdn.microsoft.com/en-us/library/k8d11d4s.aspxDiese Schritte gelten für den gesamten Artikel.
    5. Kehren Sie zu Ihrem Dialogfeld zurück, und doppelklicken Sie auf "Werte abrufen". Ersetzen Sie den folgenden Code

    void CAutoProjectDlg::OnBnClickedGetvalues()
    {
    // TODO: Add your control notification handler code here
    }
    
    

    mit:

    void CAutoProjectDlg::OnBnClickedGetvalues()
    {
    CWorksheets oSheets;
    CWorksheet oSheet;
    CRange oRange;
    COleVariant covOptional(DISP_E_PARAMNOTFOUND,VT_ERROR);
    
    // Make sure that Excel has been started.
    if (oExcel.m_lpDispatch == NULL) {
    AfxMessageBox("Excel has not been started.  Press button1 to start Excel.");
    return;
    }
    // Get the first worksheet.
    oSheets = oBook.get_Worksheets();
    oSheet = oSheets.get_Item(COleVariant((short)1));
    // Set the range of data to retrieve
       oRange = oSheet.get_Range(COleVariant("A1"),COleVariant("E5"));
    
    // Get the data.
    COleSafeArray saRet(oRange.get_Value(covOptional));
    
    long iRows;
            long iCols;
            saRet.GetUBound(1, &iRows);
            saRet.GetUBound(2, &iCols);
    
    CString valueString = "Array Data:\r\n";
    long index[2];
    // Loop through the data and report the contents.
    for (int rowCounter = 1; rowCounter <= iRows; rowCounter++) {
    for (int colCounter = 1; colCounter <= iCols; colCounter++) {
    index[0]=rowCounter;
    index[1]=colCounter;   
    COleVariant vData;
    saRet.GetElement(index,vData);
    CString szdata(vData);
                valueString += szdata;
    valueString += "\t";
    }
    valueString += "\r\n";
    }
    AfxMessageBox(valueString,MB_SETFOREGROUND,NULL);
    }
    
    

Testen des Automatisierungsclients

  1. Drücken Sie F5, um das Beispielprogramm zu erstellen und auszuführen.
  2. Klicken Sie auf "Ausführen". Das Programm startet Excel mit einer neuen Arbeitsmappe und füllt die Zellen A1:E5 des ersten Arbeitsblatts mit numerischen Daten aus einem Array auf.
  3. Klicken Sie auf "Werte abrufen". Das Programm ruft die Daten in den Zellen A1:E5 in ein neues Array ab und zeigt die Ergebnisse in einem Meldungsfeld an.
  4. Wählen Sie "Mit Zeichenfolgen ausfüllen" aus, und klicken Sie auf "Ausführen", um die Zellen A1:E5 mit Zeichenfolgendaten auszufüllen.
  5. Klicken Sie auf "Werte abrufen", um die Zeichenfolgenwerte in einem Meldungsfeld anzuzeigen.

Problembehandlung

Wenn Sie Klassenwrapper für die Excel-Objektbibliothek mithilfe der Option "Datei" im Assistenten zum Hinzufügen von Klassen aus TypeLib hinzufügen hinzufügen, wird möglicherweise eine Fehlermeldung angezeigt, wenn Sie zur Objektbibliothek navigieren. Um dieses Problem zu vermeiden, geben Sie den vollständigen Pfad und Dateinamen für die Objektbibliothek ein, anstatt zur Datei zu navigieren.

Wenn beim Erstellen der Beispielanwendung die folgende Fehlermeldung angezeigt wird, ändern Sie "Variant DialogBox" in CRange.h in "Variant _DialogBox":

Warnung C4003: Nicht genügend tatsächliche Parameter für Makro 'DialogBoxA'

References

Weitere Informationen finden Sie auf der folgenden Microsoft Developer Network (MSDN)-Website: Microsoft Office-Entwicklung mit Visual Studio https://msdn.microsoft.com/en-us/library/aa188489(office.10).aspx

Weitere Informationen zur Verwendung von Arrays zum Festlegen und Abrufen von Excel-Daten mit früheren Versionen von Visual Studio finden Sie im folgenden Knowledge Base-Artikel:

247412 INFO: Methoden zum Übertragen von Daten aus Visual Basic nach Excel