Thema: Delphi Fehler bei XLS-Import

Einzelnen Beitrag anzeigen

DevilsCamp
(Gast)

n/a Beiträge
 
#1

Fehler bei XLS-Import

  Alt 22. Mär 2006, 10:16
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='0then
      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
  Mit Zitat antworten Zitat