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;

  // Exceldatei öffnen
  Excel.Workbooks.Open(eExcel.Text);

  // Excel-Arbeitsblatt wählen
  Excel.Worksheets.Item['Z'].Activate

  strTemp:=Excel.Cells[1,1];  //  <<<<--- EVariantError

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'// Fehler einbauen
  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

user profile iconSeifriz hat folgendes geschrieben Zum zitierten Posting springen:
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?