Thema: Delphi Excel richtig Schließen

Einzelnen Beitrag anzeigen

Benutzerbild von semo
semo

Registriert seit: 24. Apr 2004
755 Beiträge
 
Delphi 2010 Professional
 
#1

Excel richtig Schließen

  Alt 16. Mai 2004, 11:14
Ich habe folgendes Problem: beim FormCreate durchlaufe ich die procedure XlsToStringGtrid,
der ich mein StringGrid in die die Vokabeln reingeschrieben werden sollen und den Namen des zu ladenenden Exceldokumentes übergebe. Dieses funktioniert soweit ganz gut.

Wenn ich aber Änderungen speichern möchte (im OnCloseEvent), wird mir die Fehlermeldung ausgegeben dass der Zugriff auf diese Datei verweigert wird. Eine Überprüfung ob Excel noch geöffnet ist ergibt true. Was habe ich vergessen um Excel vollständig zu schließen im FormCreate bzw in procedure XlsToStringGrid oder was könnte sonst der Grund sein????

Code:
procedure XlsToStringGrid(aGrid: TStringGrid; VokabelListFile: string);
var
  myExcel, Sheet: OLEVariant;
  zeile, spalte: Integer;
begin
  if VokabelListFile <> '' then begin
    try
      // Create Excel-OLE Object
      myExcel := CreateOleObject('Excel.Application')
    except
      ShowMessage('Excel konnte nicht gestartet werden!');
      exit
    end;

    // Excel verbergen
    myExcel.Visible := false;

    // Öffnen der gewählten Arbeitsmappe
    myExcel.Workbooks.Open(VokabelListFile);

    // Sheet := XLApp.Workbooks[1].WorkSheets[1];
    Sheet := myExcel.Workbooks[ExtractFileName(VokabelListFile)].WorkSheets[1];

    // die Anzahl der (gefüllten) Zeilen der Exceltabelle bestimmen
    Sheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate;

    aGrid.RowCount := myExcel.ActiveCell.Row+1;
    //aGrid.ColCount := myExcel.ActiveCell.Column;

    for zeile:=1 to aGrid.RowCount do
      for spalte:=1 to 2 do
        aGrid.Cells[spalte, zeile] := myExcel.Cells[zeile, spalte].Value;

    // Quit Excel
    if not VarIsEmpty(myExcel) then
    begin
      myExcel.DisplayAlerts := False;
      myExcel.Quit;
      myExcel := Unassigned;
      Sheet  := Unassigned;
    end
  end;
end;


Code:
 // Speichern der Änderungen am Dokument
procedure TVokabelnEditForm.FormClose(Sender: TObject; var Action: TCloseAction);

  // ist Excel geöffnet???
  function IsObjectActive(ClassName: string): Boolean;
  var
    ClassID: TCLSID;
    Unknown: IUnknown;
  begin
    try
      ClassID := ProgIDToClassID(ClassName);
      Result := GetActiveObject(ClassID, nil, Unknown) = S_OK;
    except
      // raise;
      Result := False;
    end;
  end;

var
  myExcel, sheet: OLEVariant;
  zeile: Integer;
  selectedRect: TGridRect;
begin
  if IsObjectActive('Excel.Application') then
    ShowMessage('Excel is running !');

  if bWereThereChangings = true then begin
    if MessageDlg('Sollen die Änderungen übernommen werden?', mtWarning, [mbYes,mbNo,mbAbort], 0) = mrYes then
    begin

      // alle Leerzeilen bzw. unvollständigen Zeilen löschen
      for zeile := 1 to StringGrid1.RowCount-1 do
        // leere Zeile gefunden
        if (StringGrid_pruefeZeileAufVollstaendigkeit(StringGrid1, zeile) = false) then begin
          // leere Zeile gefunden --> löschen
          // dazu ein Feld der aktuellen leeren Zeile markieren
          selectedRect.Top   := zeile;
          selectedRect.Bottom := zeile;
          selectedRect.Left  := 1;
          selectedrect.Right := 1;
          StringGrid1.Selection := selectedRect;
          // und dann die vorgefertigte StringGridFunktion aufrufen
          StringGrid_selektierteZeilenLoeschen(StringGrid1);
        end;

      // Sortieren nach der 1. Spalte
      SortStringGrid(StringGrid1, 1);

      ////////////////////////////////////////////////////////////////////////////
      //
      // Inhalte des Grids abspeichern
      //

      try
        // Create Excel-OLE Object
        myExcel := CreateOleObject('Excel.Application')
      except
        ShowMessage('Excel konnte nicht gestartet werden!');
        exit
      end;

      // Excel verbergen
      myExcel.Visible := false;

      // Anlegen einer Arbeitsmappe
      myExcel.Workbooks.Add(xlWBatWorkSheet);

      Sheet := myExcel.Workbooks[1].WorkSheets[1];
      //Sheet := myExcel.Workbooks[ExtractFileName(sVokabelListFile)].WorkSheets[1];
      //Sheet.Name := ASheetName;

      for zeile:=1 to StringGrid1.RowCount-1 do begin
        Sheet.Cells[1, zeile].Value := StringGrid1.Cells[1,zeile];
        Sheet.Cells[2, zeile].Value := StringGrid1.Cells[2,zeile];
      end;

      // der Datei einen Namen geben wenn keiner vorhanden
      if sVokabelListFile = '' then
        if SaveDialog1.Execute then
          sVokabelListFile := SaveDialog1.FileName;

      try
        myExcel.Workbooks[1].SaveAs(sVokabelListFile);
      except
        on E: Exception do begin
          ShowMessage('Fehler beim Speichern aufgetreten: ' + E.message);
        end
      end;

      // Quit Excel
      if not VarIsEmpty(myExcel) then
      begin
        myExcel.DisplayAlerts := False;
        myExcel.Quit;
        myExcel := Unassigned;
        Sheet := Unassigned;
      end
    end
  end;
  Action := caFree
end;

Hier tritt der Fehler auf:
Code:
try
        myExcel.Workbooks[1].SaveAs(sVokabelListFile);
      except
        on E: Exception do begin
          ShowMessage('Fehler beim Speichern aufgetreten: ' + E.message);
        end
      end;
  Mit Zitat antworten Zitat