Autor Beitrag
Volker1983
Hält's aus hier
Beiträge: 1



BeitragVerfasst: Mo 10.08.09 22:47 
Hallo,

ich habe ein Problem beim späten Binden mit Excel. Ich habe lediglich die Möglichkeit auf das erste Worksheet zuzugreifen. Sobald ich hier ein anderes anspreche erhalte ich einen Fehler (Ausnahme von HRESULT: 0x800ADF21), der beim nächsten Funktionsaufruf erfolgt. Folgendes habe ich bereits herausfinden können:

- Der Variablen objXlSheet wird ein COM-Objekt zugewiesen.
- Der Fehler tritt auch bei anderen Funktionsaufrufen als UsedRanged auf.
- Anstatt des Indexes habe ich es auch mit der Übergabe des Namens ausprobiert. Dort hat sich das selbe gezeigt("Sheet1" funktioniert, "Sheet2" verursacht den Fehler)
- Mit einer Abfrage von "Count" erhält man die korrekte Anzahl von Arbeitsseiten.
- Mit früher Bindung kann man es einfach über Excel.Workbook.Worksheets[2] aufrufen.
- Ach ja, DIE EXCEL-DATEI HAT AUCH MEHR ALS EINE ARBEITSSEITE!

Anbei der Codeabschnitt:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
Type objXlType = Type.GetTypeFromProgID("Excel.Application");
Object objXlApp = Activator.CreateInstance(objXlType);
Object objXlBooks = mObjXlApp.GetType().InvokeMember("Workbooks", BindingFlags.GetProperty, null, mObjXlApp, null);
Object objXlBook = objXlBooks.GetType().InvokeMember("Open", BindingFlags.InvokeMethod, null, objXlBooks, new Object[]{@"C:\test.xls"});
Object objXlSheets = objXlBook.GetType().InvokeMember("Worksheets", BindingFlags.GetProperty, null, objXlBook, null);
Object objXlSheet = objXlSheets.GetType().InvokeMember("Item", BindingFlags.GetProperty, null, objXlSheets, new Object[]{1});
Object objXlRange = objXlSheet.GetType().InvokeMember("UsedRange", BindingFlags.GetProperty, null, objXlSheet, null);


So funktioniert das Programm einwandfrei. Ersetzt man in Zeile 6 den letzten Parameter von new Object[]{1} in new Object[]{2}, sollte er das zweite Worksheet ansprechen.

Vielen Dank im Voraus,
Volker