![]() |
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; |
Re: Excel richtig Schließen
Hallo computer-glossar.de,
Delphi-Quellcode:
sollte es sein, damit deine benutzte Excelmappe wieder freigegeben wird.
myExcel.Quit
bye Claus |
Re: Excel richtig Schließen
habe ich doch aufgenommmen:
Zitat:
|
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 |
Re: Excel richtig Schließen
![]() 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