Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Umgehen eines EVariantErrors beim Einlesen aus Excel
Seifriz - Mi 10.12.08 22:45
Titel: Umgehen eines EVariantErrors beim Einlesen aus Excel
Hallo,
ich lese über folgenden Code eine Zelle einer Exceltabelle ein:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| try Excel:=CreateOleObject('Excel.Application'); Excel.Visible:=False; except ShowMessage('Excel konnte nicht gestartet werden !'); Exit; end;
Excel.Workbooks.Open(eExcel.Text);
Excel.Worksheets.Item['Z'].Activate
strTemp:=Excel.Cells[1,1]; |
Das funktioniert solange ein 'Wert' in der Excelzelle steht. Steht dort aber '#DIV/0!' oder '#WERT!' erhalte ich einen EVariantError.
Das verstehe ich auch - ist ja bereits ein Fehler in Excel :shock:
Wie kann ich solche Zellen übergehen bzw. mit einer Showmessage auf die fehlerhafte Zelle hinweisen.
Mit folgender Funktion
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| function CT(Input: Variant): String; begin try Result:=Input; except on EVariantError do begin showmessage('EVariantError'); Result:='0'; end; end; end; |
und dem Aufruf
Delphi-Quelltext
1: 2: 3:
| ... strTemp:=CT(Excel.Cells[1,1]); ... |
bricht das Prog immer vor dem except Block ab.
Liegt wohl an der Zuweisung Result:=... :?:
Kann mir jemand ein Tipp geben?
Danke!
Seifriz - Mi 10.12.08 23:37
Ola!
Ausserhalb der IDE macht das Prog was ich will! Das war eine Debugger-Exception. :oops:
Vielleicht hat aber jemand eine 'elegantere' Lösung? Mir scheint die nicht sehr professionell zu sein.
Grüße
jaenicke - Do 11.12.08 00:01
Hast du es schonmal mit Cells[].Value versucht? Vielleicht geht das.
Dass beim Debuggen die Exception angezeigt wird ist ja normal. Auch wenn diese danach abgefangen wird durch ein try..except. Du kannst die Anzeige bestimmter Exceptions aber auch beim Debuggen deaktivieren.
delfiphan - Do 11.12.08 00:11
Was ist denn der Wert? null oder unassigned? Dann verwende VarToStr() für die Konvertierung zu String.
Seifriz - Do 11.12.08 00:44
Hi,
so schnell komm ich garnicht mit testen nach..
AT jaenicke:
Cells[].Value kennt mein Delphi2007 nicht?!
AT delfiphan:
Nach meiner bescheidenen Erfahrung ist es eben weder NULL noch UNASSIGNED, dann könnte man es ja gut abfangen...
d.h. auch VarToStr führt zur einer Exception.
Danke für Eure Tipps
Chemiker - Do 11.12.08 00:59
Hallo Seifriz,
Deine Fehlerbehandlung greift zu spät, da der Fehler schon in Excel auftritt, sollte er auch in Excel abgefangen werden.
Man kann in Excel mit IsError prüfen, ob ein Fehlerwert vorliegt. Ist das nicht der Fall soll der Wert in die Variable abgespeichert werden.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| Excel.Cells[1,1].Value:= '=10/0'; if not Excel.IsError(Excel.Cells[1,1].Value) then begin TestText:= Excel.Cells[1,1].Value; end else begin ShowMessage('Es ist ein Fehler aufgetreten!'); end; ShowMessage(TestText); |
Bis bald Chemiker
Seifriz - Do 11.12.08 10:34
Hallo Chemiker,
danke für die Info. Ich habe da einiges noch nicht richtig durchschaut gehabt, was die Verbindung mit Excel angeht bzw. die Funktionen die man nutzen kann.
Eine Liste der Funktionen (z.B. IsError) finde ich sicher bei Excel und VBA.
Die Lösung gefällt mir! Werde sie nun in mein Prog einbinden.
Danke für Eure Hilfe!
delfiphan - Di 10.02.09 10:11
Seifriz hat folgendes geschrieben : |
Hi,
so schnell komm ich garnicht mit testen nach..
AT jaenicke:
Cells[].Value kennt mein Delphi2007 nicht?!
AT delfiphan:
Nach meiner bescheidenen Erfahrung ist es eben weder NULL noch UNASSIGNED, dann könnte man es ja gut abfangen...
d.h. auch VarToStr führt zur einer Exception.
Danke für Eure Tipps |
Was ist der Typ des Variants? Kannst du es vielleicht mit
if VarType(Input) = varError abfangen?
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!