SO WIRD'S GEMACHT: Automatisieren von Excel aus C++ .NET und MFC zum Füllen eines Bereichs mit Daten oder zum Abrufen von Daten aus einem Bereich über Arrays

SPRACHE AUSWÄHLEN SPRACHE AUSWÄHLEN
Artikel-ID: 308407 - Produkte anzeigen, auf die sich dieser Artikel bezieht
Dieser Artikel wurde zuvor veröffentlicht unter D308407
Dieser Artikel ist eine Übersetzung des folgenden englischsprachigen Artikels der Microsoft Knowledge Base:
308407 HOW TO: Automate Excel From C++ .NET and MFC To Fill or Obtain Data In a Range Using Arrays
In Artikel 302096 wird dieses Thema für Microsoft Visual C# .NET behandelt.
In Artikel 302094 wird dieses Thema für Microsoft Visual Basic .NET behandelt.
Hinweis: Die Verwendung der hier aufgeführten Informationen sowie Makro- oder Programmcodes geschieht auf Ihre eigene Verantwortung. Microsoft stellt Ihnen diese Informationen sowie Makro- und Programmlistings ohne Gewähr auf Richtigkeit, Vollständigkeit und/oder Funktionalität sowie ohne Anspruch auf Support zur Verfügung. Die zur Verfügung gestellten Makro- und Programmierungsbeispiele sollen lediglich exemplarisch die Funktionsweise des Beispiels aufzeigen.

Weitere Informationen zu den von Microsoft angebotenen Supportoptionen finden Sie unter folgender Internetadresse:
http://support.microsoft.com/
Bitte beachten Sie: Bei diesem Artikel handelt es sich um eine Übersetzung aus dem Englischen. Es ist möglich, dass nachträgliche Änderungen bzw. Ergänzungen im englischen Originalartikel in dieser Übersetzung nicht berücksichtigt sind. Die in diesem Artikel enthaltenen Informationen basieren auf der/den englischsprachigen Produktversion(en). Die Richtigkeit dieser Informationen in Zusammenhang mit anderssprachigen Produktversionen wurde im Rahmen dieser Übersetzung nicht getestet. Microsoft stellt diese Informationen ohne Gewähr für Richtigkeit bzw. Funktionalität zur Verfügung und übernimmt auch keine Gewährleistung bezüglich der Vollständigkeit oder Richtigkeit der Übersetzung.
Alles erweitern | Alles schließen

Auf dieser Seite

Zusammenfassung

Dieser Artikel beschreibt, wie Sie Excel mit Visual C++ .NET automatisieren, um mit Hilfe von Arrays einen Bereich mit mehreren Zellen mit Werten zu füllen oder Werte aus dem Bereich abzurufen.

Erstellen eines Automatisierungsclients für Excel

Sie können die Eigenschaft Value eines Range-Objekts auf einen zweidimensionalen Array anwenden, um einen aus mehreren Zellen bestehenden Bereich zu füllen, ohne die Zellen einzeln füllen zu müssen. Ebenso können Sie einen zweidimensionalen Array von Werten mit der Eigenschaft Value für mehrere Zellen gleichzeitig abrufen. Die folgenden Schritte beschreiben die Vorgehensweise zum Füllen und Abrufen von Daten über zweidimensionale Arrays.
  1. Die Vorgehensweise zur Erstellung eines einfachen Automatisierungsclients ist in folgendem Artikel der Microsoft Knowledge Base beschrieben:
    307473 HOWTO: Use a Type Library for Office Automation from Visual C++ .NET
    Fügen Sie in Schritt 3 eine zweite Schaltfläche und ein Kontrollkästchen zum Formular hinzu. Ändern Sie die ID der Schaltfläche auf IDC_GETVALUES und die Beschriftung auf Werte abrufen. Ändern Sie die ID des Kontrollkästchens auf IDC_CHECK und die Beschriftung auf Füllen mit Zeichenfolgen.

    Wählen Sie in Schritt 4 des Artikels die Typbibliothek aus. Der Standardpfad für Excel 2000 ist "C:\Programme\Microsoft Office\Office\excel9.olb". Der Standardpfad für Excel 2002 ist "C:\Programme\Microsoft Office\Office10\excel.exe". Wählen Sie die folgenden Microsoft Excel-Schnittstellen aus:

    • _Application (Anwendung)
    • _Workbook (Arbeitsmappe)
    • _Worksheet (Arbeitsblatt)
    • Range (Bereich)
    • Workbooks (Arbeitsmappen)
    • Worksheets (Tabellenblätter)
    Fügen Sie in Schritt 6 die folgenden #include-Anweisungen unmittelbar nach der Direktive #pragma once in "Autoprojectdlg.h" ein:
    #include "CApplication.h"
    #include "CRange.h"
    #include "CWorkbook.h"
    #include "CWorkbooks.h"
    #include "CWorksheet.h"
    #include "CWorksheets.h"
  2. Fügen Sie die zwei folgenden öffentlichen Membervariablen zur Klasse CAutoProjectDlg hinzu:
    CApplication oExcel;
    CWorkbook oBook;
  3. Klicken Sie in Ihrem Dialogfeld mit der rechten Maustaste auf IDC_CHECK und wählen Sie Variable hinzufügen. Nennen Sie die Variable "m_bFillWithStrings" und klicken Sie auf Fertig stellen.
  4. Doppelklicken Sie in Ihrem Dialogfenster auf Ausführen und ersetzen Sie folgenden Code:
    void CAutoProjectDlg::OnBnClickedRun()
    {
    	// TODO: Add your control notification handler code here
    }
    durch:
    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));
    }
  5. durch: Kehren Sie zu Ihrem Dialogfenster zurück und doppelklicken Sie auf Werte abrufen. Ersetzen Sie folgenden Code:
    void CAutoProjectDlg::OnBnClickedGetvalues()
    {
    	// TODO: Add your control notification handler code here
    }
    durch:
    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 von einem Array.
  3. Klicken Sie auf Werte abrufen. Das Programm ruft die Daten in den Zellen A1:E5 ab, legt sie in einem neuen Array ab und zeigt die Ergebnisse in einem Meldungsfeld an.
  4. Wählen Sie Füllen mit Zeichenfolgen und klicken Sie auf Ausführen, um die Zellen A1:E5 mit Zeichenfolgendaten zu füllen.
  5. Klicken Sie auf Werte abrufen, um die Zeichenfolgenwerte in einem Meldungsfeld anzuzeigen.

Problembehandlung

Wenn Sie über die Option Datei im Assistenten zum Hinzufügen von Klassen aus der Typbibliothek Klassen-Wrapper für die Excel-Objektbibliothek hinzufügen, können Sie beim Aufrufen der Objektbibliothek eine Fehlermeldung erhalten. Geben Sie den vollständigen Pfad und Dateinamen für die Objektbibliothek an, um dieses Problem zu vermeiden. Weitere Informationen finden Sie in folgendem Artikel der Microsoft Knowledge Base:
311408 BUG: 'Read-Only' Warning When Adding MFC Class From Library
Wenn Sie bei der Erstellung Ihrer Beispielanwendung folgende Fehlermeldung erhalten, ändern Sie "Variant DialogBox" in CRange.h auf "Variant _DialogBox":
Warnung C4003: Nicht genügend übergebene Parameter für das Makro 'DialogBoxA'
Weitere Informationen zur Ursache dieses Fehlers finden Sie in folgendem Artikel der Microsoft Knowledge Base:
311407 BUG: MFC Class Wizard Does Not Resolve Naming Conflicts Between Windows APIs and COM Interface Methods

Informationsquellen

Weitere Informationen finden Sie auf der folgenden Webseite des Microsoft Developer Network (MSDN):
Microsoft Office Development with Visual Studio
http://msdn2.microsoft.com/en-us/library/aa188489(office.10).aspx
Weitere Informationen zur Verwendung von Arrays zum Füllen und Abrufen von Excel-Daten in Vorgängerversionen von Visual Studio finden Sie in folgenden Artikeln der Microsoft Knowledge Base:
186120 HOWTO: Use MFC to Automate Excel and Fill a Range with an Array
186122 HOWTO: Use MFC to Automate Excel and Obtain an Array from a Range
247412 INFO: Methods for Transferring Data to Excel from Visual Basic


Eigenschaften

Artikel-ID: 308407 - Geändert am: Mittwoch, 17. Januar 2007 - Version: 3.1
Die Informationen in diesem Artikel beziehen sich auf:
  • Microsoft Visual C++ .NET 2002 Standard Edition
  • Microsoft Excel 2002 Standard Edition
  • Microsoft Visual C++ .NET 2003 Standard Edition
Keywords: 
kbautomation kbgrpdso kbhowtomaster KB308407
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