AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Excel richtig Schließen

Ein Thema von semo · begonnen am 16. Mai 2004 · letzter Beitrag vom 16. Mai 2004
Antwort Antwort
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
Benutzerbild von Duffy
Duffy

Registriert seit: 19. Mär 2003
Ort: Wuppertal
835 Beiträge
 
Delphi 3 Standard
 
#2

Re: Excel richtig Schließen

  Alt 16. Mai 2004, 11:25
Hallo computer-glossar.de,
myExcel.Quit sollte es sein, damit deine benutzte Excelmappe wieder freigegeben wird.

bye
Claus
Künftige Generationen wollen ihre Fehler selber machen.
Jedes Programm wird nie das können, was Du wirklich brauchst.
Das Gegenteil von gut ist gut gemeint
-----
  Mit Zitat antworten Zitat
Benutzerbild von semo
semo

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

Re: Excel richtig Schließen

  Alt 16. Mai 2004, 11:28
habe ich doch aufgenommmen:

Zitat:
// Quit Excel
if not VarIsEmpty(myExcel) then
begin
myExcel.DisplayAlerts := False;
myExcel.Quit;
myExcel := Unassigned;
Sheet := Unassigned;
end
  Mit Zitat antworten Zitat
Benutzerbild von Duffy
Duffy

Registriert seit: 19. Mär 2003
Ort: Wuppertal
835 Beiträge
 
Delphi 3 Standard
 
#4

Re: Excel richtig Schließen

  Alt 16. Mai 2004, 11:57
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
Künftige Generationen wollen ihre Fehler selber machen.
Jedes Programm wird nie das können, was Du wirklich brauchst.
Das Gegenteil von gut ist gut gemeint
-----
  Mit Zitat antworten Zitat
Benutzerbild von semo
semo

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

Re: Excel richtig Schließen

  Alt 16. Mai 2004, 12:09
http://www.computer-glossar.de/uploads/excel.jpg

da hat aber einer mal richtig recht gehabt


ich könnte

danke vielmals an dieser Stelle!
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:44 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz