Zum Inhalt springen

Öffnen von Excel-Worbooks mit vielen Datensätzen


PibeY2k

Empfohlene Beiträge

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...

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

*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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...