Ich habe folgendes Problem.
Ich habe ein Programm geschrieben, welches 2 Exceldateien öffnen.
Die erste Spalte einließt und miteinander vergleicht.
Die übereinstimmenden Datensätze schreibt das Programm in eine neue Excelmappe.
Das funtkioniert auch soweit, aber nur solange die erste Datei unter 99 Datensätze hat.
Er wirft mir beim öffnen des 2ten Worbooks folgenden fehler aus.
"Die Open Methode des Workbooks-Objektes ist fehlerhaft"
Dann hört das Programm auf zu laufen.
/***Hier deklarier ich die benötigten Variablen um, meine erste Datei zu öffnen***/
_Application app; // app is the Excel _Application object.
_Workbook book_group;
_Worksheet sheet_group;
Workbooks books_group;
Worksheets sheets_group;
Range range_group;
LPDISPATCH lpDisp_group;
char str_group[100]; //Hilfsstring, zum Umwandeln von Int in char
int zeile_group =4; //Anzahl der Datensätze
int exit_group = 0; //zum, setzen der Endbedinung, beim ermitteln der Anzahl der Datensätze
COleVariant test_group;
CStringArray Racf_group; //Array indem alle RacFs aus GroupData gespeichert werden
/***Hier öffne ich die Datei***/
// Allgemein verwendete OLE Varianten. Diese sind die einfachen für das Benennen zu verwendenden Varianten von Argumenten.
COleVariant
covTrue((short)TRUE),
covFalse((short)FALSE),
covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
// Start Excel and get the Application object.
if(!app.CreateDispatch("Excel.Application"))
{
AfxMessageBox(
"Couldn't start Excel and get an application 0bject");
return;
}
// Get Workbooks collection.
lpDisp_group = app.GetWorkbooks(); // Get an IDispatch pointer.
ASSERT(lpDisp_group);
books_group.AttachDispatch( lpDisp_group ); // Attach the IDispatch pointer
// to the books object.
// Open a workbook.
lpDisp_group = books_group.Open(m_gd_pathname,
covOptional, covOptional, covOptional, covOptional,
covOptional, covOptional, covOptional, covOptional,
covOptional, covOptional, covOptional, covOptional
);
ASSERT(lpDisp_group);
// Attach to a Workbook object.
book_group.AttachDispatch( lpDisp_group ); // Attach the IDispatch pointer
// to the Workbook object.
// Get sheets.
lpDisp_group = book_group.GetSheets();
ASSERT(lpDisp_group);
sheets_group.AttachDispatch(lpDisp_group);
lpDisp_group = sheets_group.GetItem( COleVariant((short)(1)) );
ASSERT(lpDisp_group);
// Attach the lpDisp pointer to a Worksheet object.
sheet_group.AttachDispatch(lpDisp_group);
/***In diesem Teil speicher ich alle Elemente der Spalte in Racf_group***/
do
{
char Zelle[] = "A"; //Am Anfang der Schleife neudeklarieren, damit nur A in Zelle drin steht
// Umwandeln der Zeilenzahl in einen String
itoa(zeile_group,str_group,10);
//Anhängen des Zeilenzahlstrings an die Spaltenbezeichnung
strcat(Zelle, str_group);
lpDisp_group = sheet_group.GetRange(COleVariant(Zelle), COleVariant(Zelle)); //markieren der Zelle
ASSERT(lpDisp_group);
range_group.AttachDispatch(lpDisp_group); // Attach the IDispatch pointer
// the range object.
test_group = range_group.GetText(); //Auslesen der markierten Zelle
//Überprüfen ob etwas in der Zelle drin steht
LPVARIANT p = test_group;
if( p->vt != VT_EMPTY )
{
try
{
test_group.ChangeType( VT_BSTR );
CString s_group = test_group.bstrVal;
if(s_group == "")
{
exit_group = 1; // Endbedinung setzen, wenn nichts mehr in einer Zelle steht
}
else
{
Racf_group.Add(s_group); //Einlesen der Datensätze von GroupData
}
}
catch( COleException& e ) {
e.ReportError();
}
}
zeile_group++;
}while(exit_group != 1);
/***Soweit funktioniert das ganze auch noch....***/
/***Dann deklarier ich die Variablen für das öffnen der 2ten Datei***/
_Workbook book_search;
_Worksheet sheet_search;
Workbooks books_search;
Worksheets sheets_search;
Range range_search;
LPDISPATCH lpDisp_search;
char str_search[100]; //Hilfsstring, zum Umwandeln von Int in char
int zeile_search = 1; //Anzahl der Datensätze
int exit_search = 0; //zum, setzen der Endbedinung, beim ermitteln der Anzahl der Datensätze
COleVariant test_search;
CStringArray Racf_search; //Array indem alle RacFs aus GroupData gespeichert werden
// Get Workbooks collection.
lpDisp_search = app.GetWorkbooks(); // Get an IDispatch pointer.
ASSERT(lpDisp_search);
books_search.AttachDispatch( lpDisp_search ); // Attach the IDispatch pointer
// to the books object.
AfxMessageBox("Öffnen des SearchData Workbooks");
// Open a workbook.
lpDisp_search = books_search.Open(m_sd_pathname,
covOptional, covOptional, covOptional, covOptional,
covOptional, covOptional, covOptional, covOptional,
covOptional, covOptional, covOptional, covOptional
);
[COLOR=red] /***hier gibt er mir den Fehler aus, und hört auf weiter zulaufen***/[/COLOR]
AfxMessageBox("Nachm öffnen d");
ASSERT(lpDisp_search);
AfxMessageBox("Nachm öffnen");
// Attach to a Workbook object.
book_search.AttachDispatch( lpDisp_search ); // Attach the IDispatch pointer
// to the Workbook object.
AfxMessageBox("Attach Workbook");
// Get sheets.
lpDisp_search = book_search.GetSheets();
ASSERT(lpDisp_search);
sheets_search.AttachDispatch(lpDisp_search);
AfxMessageBox("Get sheets");
lpDisp_search = sheets_search.GetItem( COleVariant((short)(1)) );
ASSERT(lpDisp_search);
// Attach the lpDisp pointer to a Worksheet object.
sheet_search.AttachDispatch(lpDisp_search);
Warum läuft das Programm, wenn die erste Datei weniger als 99 Datensätze hat? Und bei 99 und mehr nicht mehr?
Mache ich irgendwas falsch, irgendwas übersehen?
Wäre nett, wenn mir jemand helfen kann....
Danke...