Ich gebe in einem Programm dem Anwender die Möglichkeit Daten aus einer Excel-Datei zu importieren.
Leider kann es vorkommen, dass in einer Zelle der "Wert"
=#BEZUG! drinsteht.
Und sobald ich diesen Wert einer String-Variablen zuweisen will, bricht die Import-Prozedur ohne Kommentar ab und das Programm läuft an der Stelle weiter, an der die Prozedur aufgerufen wurde.
Hier ein Auszug aus der Prozedur:
Delphi-Quellcode:
procedure ImportXLS(AXLSFile: String);
var
XLApp, Sheet, XLSDatei : OLEVariant;
AnzSeiten, i : Integer;
RangeMatrix : Variant;
AktSheet, VStart : Variant;
apa : Variant;
x, k, r : Integer;
b : Boolean;
sn, s, t : String;
anzleerzell : Integer;
begin
// [...]
XLApp := CreateOleObject('Excel.Application');
try
// Verstecke Excel bei der Ausführung
XLApp.Visible := false;
// Excel File öffnen
XLApp.Workbooks.Open(AXLSFile);
// Zugriff auf Datei
XLSDatei := XLApp.Workbooks[ExtractFileName(AXLSFile)];
if FGetMode=fmGetAll then
begin
if FSheetN='0' then
begin
AnzSeiten := XLSDatei.Sheets.Count;
VStart := 1;
end else begin
AnzSeiten := 0;
VStart := FSheetN;
end;
b := true;
AktSheet := VStart;
while b do
begin
if terminated then
exit;
Sheet := XLSDatei.WorkSheets[AktSheet];
Sheet.Activate;
sn := XLApp.ActiveSheet.Name;
FGridX := 100;
FGridY := 100;
// Range einstellen
RangeMatrix := XLApp.Range['A1', XLApp.Cells.Item[FGridX, FGridY]].Value;
// Werte der einzelnen Zellen auslesen
k := 1;
anzleerzell := 0;
repeat
if terminated then
exit;
for r := 1 to FGridY do begin
// ==> // in diesen 5 Zeilen habe ich mein Problem
// ==> // Habe es auch schon mit VarIsEmpty versucht
apa := RangeMatrix[K, R];
if (not VarIsClear(apa)) then
s := RangeMatrix[K, R]
else
s := '';
// Diese Funktion füllt ein oder mehrere StringGrids mit den Werten aus den Zellen
SendCallBackAll(r,k,s, FGridX, FGridY, XLApp.ActiveSheet.Name);
end;
Inc(k, 1);
until k > FGridX;
// RangeMatrix entleeren
RangeMatrix := Unassigned;
end;
// [...]
finally
//[...]
end;
end;
Ich hoffe, mir kann jemand helfen.
edit:
ich habe mal folgendes abgeändert:
Delphi-Quellcode:
apa := RangeMatrix[K, R];
if (not VarIsClear(apa)) then
s := RangeMatrix[K, R]
else
s := '';
in
Delphi-Quellcode:
s := '';
try
apa := RangeMatrix[K, R];
s := RangeMatrix[K, R]
except
s := '';
end;
Mit dem Erfolg, dass die Funktion zwar nicht abbricht, beim debuggen springt die Ausführung allerdings nicht in den Except-Block sondern direkt dahinter. Und da vorher nur das try..finally war sprang der wohl auch direkt dahinter, also ans Ende der Prozedur