PibeY2k Geschrieben 4. Februar 2003 Teilen Geschrieben 4. Februar 2003 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... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 4. Februar 2003 Teilen Geschrieben 4. Februar 2003 Ohne mir jetzt alles genau angesehen zu haben, ist mir doch das hier aufgefallen: Originally posted by PibeY2k char Zelle[] = "A"; ... strcat(Zelle, str_group); Zelle ist nur zwei Zeichen groß, davon brauchst du eins für das Stringende-Nullzeichen. Wenn du daran etwas anhängst, überschreibst du andere Stackinhalte. Das kann zu seltsamen Fehlern führen, vor allem bei längeren Strings in str_group. Reserviere also erst mal genügen Speicher für Zelle. Wenn der Fehler dann noch auftritt, kannst du ja nochmal Bescheid geben. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 4. Februar 2003 Teilen Geschrieben 4. Februar 2003 Ach ja, demnächst bitte die CODE-Tags benutzen. Ich habe das mal für dich nachgeholt. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
PibeY2k Geschrieben 4. Februar 2003 Autor Teilen Geschrieben 4. Februar 2003 *g*ok..... hatte das nur reinkopiert und dann sah das irgendwie nicht so aus wie im Compiler.... Beim nächsten mal mache ich es besser Und danke für deinen Tipp.....daran lags wirklich......weiß zwar nicht genau, warum der dann gerade ab 99 abstürzt, aber jetzt klappt es Danke Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.