Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Excel schließen und speichern(!) (https://www.delphipraxis.net/91749-excel-schliessen-und-speichern.html)

ImpCaligula 9. Mai 2007 11:06


Excel schließen und speichern(!)
 
Salü....

ich habe folgenden Code:

Code:
procedure TForm1.cmd1Click(Sender: TObject);
begin


  if f_Excel(Excel)then  // Excel startet
    ShowMessage('MSExcel ist erfolgreich gestartet worden!!')
   else
     ShowMessage('MSExcel konnte nicht gestartet werden!!');

  Excel.Visible := TRUE; // TRUE = Excel sichtbar.

  Excel.Application.Workbooks.Open(filename:='c:\test.xls'); // Neue Arbeitsmappe öffnen in EXECL
  //Excel.Application.Workbooks.Add;

  Excel.Worksheets ['Tabelle1'].Activate;


  zahl:= '0000123789';
  Excel.cells[2,2].select;            // Zelle wählen
  Excel.Selection.numberFormat:= '@'; // benutzerdefiniertes Zahlenformat zuweisen
  Excel.Cells[2,2]:= zahl;            // String in die Zelle schreiben.


  Excel.Workbooks.Close; // Mappe wieder schliessen.
  Excel.Quit;          // Excel schließen
end;

Das funktioniert ja auch ganz gut. Aber ich will Excel so benden, dass Änderungen automatisch
gespeichert werden. Und dann eventuell auch noch unter einem bestimmten Filenamen. Doch beides
funktioniert nicht so, wie ich das gerne will.

Weder

Delphi-Quellcode:
Excel.Workbooks.Close (savechanges:=true);
noch....

Delphi-Quellcode:
Excel.Workbooks.Close (savechanges:=true, filename:='c:\test.xls');

Kann mir hier jemand bei den 2 Codezeilen helfen? Danke!

Chemiker 10. Mai 2007 20:02

Re: Excel schließen und speichern(!)
 
Hallo ImpCaligula,

Von Workbook muss ein Object erstellt werden.

Mit saveChanges:=True wird bestimmt das die Änderungen gespeichert werden.

Mit WBobj.saved := TRUE; wird die alte Datei mit den neuen Daten ohne Nachfragen überschrieben (Bei FALSE kommt ein Dialogbox und fragt ob die Datei überschrieben werden soll).

Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var Datei: string;
    WBobj: olevariant;

begin
  Datei:= 'F:\Excel-ProgammOrdner\Beispiel Daten\Test1.xls';
  if f_Excel(Excel)then  // Excel startet
    ShowMessage('MSExcel ist erfolgreich gestartet worden!!')
   else
     ShowMessage('MSExcel konnte nicht gestartet werden!!');

  Excel.Visible := TRUE; // TRUE = Excel sichtbar.

  WBobj:= Excel.Application.Workbooks.Add; // Neue Arbeitsmappe öffnen in EXECL
  Excel.Worksheets ['Tabelle1'].Activate;
  Excel.Cells[1,1]:= 'Test';
  WBobj.saved := TRUE;         // ohne nachfragen Überschreiben
  WBobj.Close (saveChanges:=True, FileName:=Datei);
  Excel.Quit;

Bis bald Chemiker

oaktrvm 22. Jun 2007 21:39

Re: Excel schließen und speichern(!)
 
Hallo Chemiker,

ich habe den Code von ImpCaligula mit Deiner Erweiterung ausprobiert, da ich auch das Problem habe, Daten in eine Excel-Datei aus Delphi heraus speichern zu müssen. Excel wird auch gestartet und die Zahl in das Tabellenblatt eingetragen. Nur das Abspeichern funktioniert nicht, es kommt aber auch keine Fehlermeldung. Habe es mit vorhandener XLS-Datei und auch ohne ausprobiert.

System: D7 und Excel 2002

Ich bin Ratlos.

Oliver

Chemiker 23. Jun 2007 00:39

Re: Excel schließen und speichern(!)
 
Herzlich willkommen in der Delphi-PRAXiS, oaktrvm.

Ich habe mal den Quell-Code etwas geändert, vielleicht geht’s dann. Mir steht leider kein Excel 2002 zur Verfügung, deswegen kann ich nicht überprüfen wo der Fehler liegt. Einfach mal ausprobieren.

Delphi-Quellcode:
{------------------------------------------------------------------------------}
{ EXCEL starten                                                               }
{------------------------------------------------------------------------------}
function EXCELStarten (var m_EXCEL : Variant): boolean;
begin
   try
    m_EXCEL := CreateOleObject('Excel.Application');
    Result := TRUE;
  except
    ShowMessage('Excel konnte nicht gestartet werden!');
    Result := FALSE;
    Exit
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);

var zahl, zahl2 : string;
    DateiName: string;
    WBobj: olevariant;
    Excel: Variant;
begin
  DateiName:= 'F:\Excel-ProgammOrdner\Beispiel Daten\Test1.xls';
  if EXCELStarten(Excel)then  // Excel startet
  begin
    ShowMessage('MSExcel ist erfolgreich gestartet worden!!');
  end
  else
  begin
     ShowMessage('MSExcel konnte nicht gestartet werden!!');
  end;

  Excel.Visible := TRUE; // TRUE = Excel sichtbar.
  WBobj:= Excel.Application.Workbooks.Add; // Neue Arbeitsmappe öffnen in EXECL
  Excel.Worksheets ['Tabelle1'].Activate;

  zahl:= '+0000123789';
  zahl2:= '+0000123789222';

  Excel.cells[1,1].select;            // Zelle wählen
  Excel.Selection.numberFormat:= '@'; // benutzerdefiniertes Zahlenformat
  Excel.Cells[1,1]:= zahl;            // String in die Zelle schreiben.
  Excel.Cells[1,2].select;
  Excel.Selection.numberFormat:= '@';
  Excel.Cells[1,2]:= zahl2;
  Excel.cells[1,6]:= 'Hiervvvvvvvv1111111 ';

  WBobj.saved := FALSE;
  WBobj.Close (saveChanges:=TRUE, FileName:=DateiName);
  Excel.Quit;

end;
Bis bald Chemiker

oaktrvm 24. Jun 2007 21:06

Re: Excel schließen und speichern(!)
 
Hallo Chemiker,

vielen Dank für die schnelle Antwort, aber das trifft es nicht. Das Problem liegt nicht am Eintragen der Daten in das Excel-Blatt, sondern am Speichern. Wenn ich die beiden Zeilen wbobj.saved und wbobj.close auskommentiere, fragt Excel, ob es speichern soll und speichert die Datei unter dem dann gewählten Dateinamen. Die Daten stehen dann korrekt in den entsprechenden Feldern. Wenn die Zeilen drin sind, passiert gar nichts. Egal, ob die Datei test1 im gewählten Verzeichnis vorhanden ist, oder nicht. Liegt es vielleicht an der Unit comobj, die ich für die Funktionen eingebunden habe?

mfg

Oliver

Chemiker 24. Jun 2007 21:58

Re: Excel schließen und speichern(!)
 
Hallo oaktrvm,

ich glaube nicht, dass es an der Unit ComObj liegt. Es wird wahrscheinlich daran liegen, dass Du WBobj.saved auf FALSE und saveChanges auf TRUE setzen muss. Außerdem muss der Path und das Laufwerk stimmen, dann müsste es eigentlich funktionieren. Wenn nicht, melde Dich noch mal.

Bis bald Chemiker

semo 24. Jun 2007 22:42

Re: Excel schließen und speichern(!)
 
so klappt bei mir das speichern der neuen daten:
Delphi-Quellcode:
  // nervige Meldungen ausschalten:
  Excel.DisplayAlerts := FALSE;

  WBobj.saved := false;
  WBobj.Close (saveChanges:=TRUE, FileName:=DateiName);
  Excel.Quit;
das ist aber nicht die beste lösung.
scheinbar liegt es an den parametern von wobj.close(...).
kenne das problem, das bei unterschiedlichen version von word / excel da gern mal unterschiedliche parameter angegeben werden mussten, selbst wenn es nur eine "emptyParam" mehr war.

und noch etwas:
wenn du das ole object erstellst, könnte man auch noch prüfen ob excel bereits läuft und dann auf diese instanz zugreifen.
Delphi-Quellcode:
 
//Create Excel-OLE Object
  try
    XLApp := GetActiveOleObject('Excel.Application');  // laden wenn excel offen
  except
    XLApp := CreateOleObject('Excel.Application');     // oder Excel starten
  end;

Chemiker 24. Jun 2007 23:05

Re: Excel schließen und speichern(!)
 
Hallo computer-glossar.de,

mit WBobj.saved:= FALSE wird EXCEL vorgespielt, dass es noch nicht gespeicherte Änderungen gibt. Mit SaveChanges muss auf TRUE gesetzt werden, sonst werden die Änderungen im WorkBook nicht abgespeichert. Mit Excel.DisplayAlerts := FALSE; währe ich sehr vorsichtig. Man sollt die Rückfragen auch wieder vor dem Verlassen zurückstellen, weil alle Rückfragen ausgestellt werden!

Wenn man Excel.DisplayAlerts := FALSE; benutzt sollte man es so anwenden:

Delphi-Quellcode:
{-------------------------------------------------------------------------------
 Funktion: EXCELOhneNachFragenSchliessen()
 Bemerkung: Mit dieser Function wird das neu aktive WorkBook unter den unter
            DateiName angegeben Namen abgespeichert. Dabei wird die Rückfrage
            "Sollen Ihre Änderungen in <Datei> gespeichert werden?" erscheint
            immer, wenn eine Arbeitsmappe geschlossen wird, welche nicht
            gespeicherte Änderungen enthält unterdrückt. Die Datei wird immer
            abgespeichert, auch wenn diese keine Änderung enthält.
 Parameter: m_Excel :Variant    // Ist die Excel-Apllication-Variable.
            WorkBobj:olevariant // Ist die Aktuelle Workbook-Variable.
            DateiName: String   // Ist der komplette Path mit Laufwerk, Path
                                 // und DateiName.
 Functions-Wert: = TRUE // alles Klar die Datei ist normal abgespeichert
                         // worden.
                 = FALSE // Es ist beim Abspeichern ein Fehler aufgetreten.
 Version:   1.01
 letz.Ändr.: 12.05.2006
-------------------------------------------------------------------------------}
function EXCELOhneNachFragenSchliessen(m_Excel: Variant; WorkBobj: olevariant;
         const DateiName: String): Boolean;
begin
  Result:= FALSE;
  m_Excel.Application.DisplayAlerts := False; // Alle Rückfragen ausstellen
  try
    WorkBobj.saved := FALSE;
    WorkBobj.Close (saveChanges:=TRUE, FileName:=DateiName);
    Result:= TRUE;  // Alles OK dann wird TRUE zurückgegeben.
  finally
    m_Excel.Application.DisplayAlerts := TRUE; // Alle Rückfragen anstellen
    m_Excel.Quit;
  end;
end;
Wenn dann ein Fehler auftritt, weil der Path oder die Laufwerk Angaben nicht stimmen, werden die Rückfragen wieder angezeigt.


Bis bald Chemiker

oaktrvm 25. Jun 2007 21:35

Re: Excel schließen und speichern(!)
 
Hallo Chemiker,

der letzte Tip war es. Ich hatte, wie in deinem ersten Posting an ImpCaligula wbobj.saved auf True gesetzt. Mit False geht es.
Danke.

Oliver


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:23 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