Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Excel richtig Schließen (https://www.delphipraxis.net/22335-excel-richtig-schliessen.html)

semo 16. Mai 2004 10:14


Excel richtig Schließen
 
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;

Duffy 16. Mai 2004 10:25

Re: Excel richtig Schließen
 
Hallo computer-glossar.de,
Delphi-Quellcode:
myExcel.Quit
sollte es sein, damit deine benutzte Excelmappe wieder freigegeben wird.

bye
Claus

semo 16. Mai 2004 10:28

Re: Excel richtig Schließen
 
habe ich doch aufgenommmen:

Zitat:

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

Duffy 16. Mai 2004 10:57

Re: Excel richtig Schließen
 
Hallo computer-glossar.de,
falls Du Wíndows 2000 oder XP verwendest, schau mal im Taskmanager nach, ob noch weitere Instanzen von Excel laufen, die Dir deine Mappe wegsperren.

bye
Claus

semo 16. Mai 2004 11:09

Re: Excel richtig Schließen
 
http://www.computer-glossar.de/uploads/excel.jpg

da hat aber einer mal richtig recht gehabt :lol:


ich könnte :wall:

danke vielmals an dieser Stelle!


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:58 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz