Autor Beitrag
Peter18
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 489
Erhaltene Danke: 2


Delphi4
BeitragVerfasst: So 21.09.08 14:46 
Hallo Leute,

ich schreibe in eine Excel-Tabelle Daten und will sie dann wieder speichern. Das soll allerdings im "Verborgenen" geschehen und nicht mit Speichern-Dialog oder als Kopie gespeichert werden.

Save führt zu einem Dialog. Lasse ich Save weg, erscheint bei Close der Dialog "sollen die Änderungen gespeichert werden?".

(Delphi 4)
ausblenden Delphi-Quelltext
1:
2:
3:
  excel.ActiveWorkbook.Save;
  excel.Workbooks.Close;        // Ev. Parameter?
  excel.Application.Quit;       // Schließt Excel

Unter VBA ist das kein Problem, dann gebe ich den Parameter "True" oder "False" mit, je nach dem, ob ich speichern möchte oder nicht.

ausblenden Delphi-Quelltext
1:
  excel.Workbooks.Close(True);					

Diese Zeile führt zu der Fehlermeldung "Unzulässige Parameterzahl".

Kann mir jemand einen Tipp geben, wie sich das Problem lösen lässt??

Dank euch allen mit Grüßen von der sonnigen Nordsee

Peter
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: So 21.09.08 23:10 
Moin!

Such mal nach Suche in: Delphi-Forum, Delphi-Library DISPLAYALERTS, das war glaub ich die Eigenschaft, die die Dialoganzeige steuert. :idea: ;)

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
Peter18 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 489
Erhaltene Danke: 2


Delphi4
BeitragVerfasst: Mo 22.09.08 16:29 
Hallo Narses,

Der Tipp war gut, so klappt es. :D

Leider ergeben sich aber neue Probleme: Anscheinend wird die OLE-Instanz nicht abgebaut, oder der Vermerk, "Datei zum Schreiben geöffnet" wird nicht entfernt. :(

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
  Vertrieb.excel.DisplayAlerts := FALSE;                   // Meldungen  abstellen
  Vertrieb.excel.ActiveWorkbook.SaveAs(Vertrieb.FilePath); // Tabelle speichern
  Vertrieb.excel.DisplayAlerts := TRUE;                    // Meldungen wieder anstellen.
  Vertrieb.excel.Workbooks.Close;                          // Datei schließen
  Vertrieb.excel.Application.Quit;                         // Schließt Excel


Delphi kann die Tabelle mehrfach lesen. Wenn sie aber aus dem Programm mit Excel geöffnet wird, meint Excel "Hab keine Lust." Wahrscheinlich erscheint der "Schreibgeschützt-Dialog" verdeckt und Excel hängt. Die Meldung ausgeschaltet zu lassen hilft auch nicht weiter. Erst wenn die Anwendung beendet wird, ist die Tabelle wieder frei. (Typisch Windoof) Läst sich zwar mit dem Taskmanager austrixen aber das ist nix für DAUs.

Kennt jemand einen Weg, wie das Problem zu lösen ist??

Grüße von Peter
Chemiker
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 194
Erhaltene Danke: 14

XP, Vista 32 Bit, Vista 64 Bit, Win 7 64 Bit
D7, BDS 2006, RAD Studio 2009+C++, Delphi XE2, XE3, VS 2010 Prof.
BeitragVerfasst: Mo 22.09.08 18:58 
Hallo Peter18,

man muss wenn man die OLE-Automation benutzt, alles anschließend wieder aufräumen.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
Vertrieb.Excel.DisplayAlerts := FALSE;
Vertrieb.Excel.ActiveWorkbook.Close (saveChanges:=True, FileName:= Vertrieb.FilePath);
Vertrieb.Excel.DisplayAlerts := TRUE;
if not VarIsEmpty(Vertrieb.excel)then
begin
  Vertrieb.excel.Quit;
end;
Vertrieb.excel := Unassigned;

Wenn Du evt. noch ein Sheet angelegt hast muss das natürlich zuvor geschlossen und die Instanc auch auf Unassigned gestellt werden.
In Excel verhält es sich genauso wie in Delphi. Die Erstellten Objekte müssen auch ordentlich wieder freigegeben werden.
Wenn man Excel im Delphi Programm schließt, dann sollte keine Excel-Instanc mehr im Taskmanager zu sehen sein.

Bis bald Chemiker
Peter18 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 489
Erhaltene Danke: 2


Delphi4
BeitragVerfasst: Di 23.09.08 09:47 
Hallo Chemiker,

das war der entscheidende Tipp, nun läuft alles sauber. Hatte es mit "nil" versucht, was aber anscheinend keine Wirkung hatte. Danke!

Die Hilfe enthält leider keine entsprechenden Beispiele. Da muss man wissen, was man sucht. Meine Literatur gibt leider auch nichts her. Gibt es Literatur oder Internetseiten, die solche Infos liefern?

Für alle, die mit solchen Problemen zu kämpfen haben noch einmal die vollständige Befehlssequenz (ohne Prüfungen):

Excel öffnen:
ausblenden Delphi-Quelltext
1:
2:
3:
  excel := CreateOleObject( 'Excel.Application');
  excel.Workbooks.Open( FilePath );
  Sheet := Vertrieb.excel.ActiveWorkbook.Worksheets[WorkSheet];  // WorkSheet := Name des Blattes


Excel schließen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
  excel.DisplayAlerts := FALSE;                   // Meldungen  abstellen
  excel.ActiveWorkbook.SaveAs(FilePath);          // Tabelle speichern
  excel.DisplayAlerts := TRUE;                    // Meldungen wieder anstellen.
  excel.Workbooks.Close;                          // Datei schließen
  excel.Application.Quit;                         // Schließt Excel
  Sheet := Unassigned;                            // Räumt Speicher auf
  excel := Unassigned;


Grüße von der Nordsee
Peter
Chemiker
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 194
Erhaltene Danke: 14

XP, Vista 32 Bit, Vista 64 Bit, Win 7 64 Bit
D7, BDS 2006, RAD Studio 2009+C++, Delphi XE2, XE3, VS 2010 Prof.
BeitragVerfasst: Di 23.09.08 22:53 
Hallo Peter18,

um Informationen über die OLE-Automation zu bekommen, würde ich mal einen Blick in den Ordner von Delphi werfen.

Borland\BDS\4.0\Demos\DelphiWin32\VCLWin32\ActiveX\OleAuto

Die Beispiele befassen sich zwar mit Word, können aber auch auf Excel angewendet werden, mit entsprechenden Änderungen. Um bestimmte Befehl in Excel umzusetzen kann es sehr hilfreich sein, sich zuvor einen Macro aufzuzeichnen und diese Befehle in Delphi umzusetzen. Weitere Hilfe bekommt man, wenn man in den Delphi – Foren nach dem Begriff „Excel“ sucht.

Zu bedenken ist das es 2 verschiede OLE-Automationen gibt, die mit den Begriffen mit „frühe Bindung“ (das währe z.B.: mit den Komponenten in Dephi) und „späte Bindung“ umschrieben werden. Beide haben ihre Vor- und Nachteile.
Ich persönlich, benutze lieber die späte Bindung, weil sie den für mich entscheiden Vorteil hat, dass sie nicht von der Excel-Version abhängig ist.
Das Bedeutet konkret im meinen Fall, das ich ein Programm das ich unter Delphi 7 für Excel 2000 entwickelt habe, ohne Konvertierung auch unter Delphi 2009 mit Excel 2007 läuft.

Als Alternative um mit Excel von einem Delphi-Programm aus zu kommunizieren, gibt es noch ADO.

Bis bald Chemiker
Peter18 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 489
Erhaltene Danke: 2


Delphi4
BeitragVerfasst: Mi 24.09.08 10:05 
Hallo Chemiker,

Danke für die Info. Anscheinend habe ich eine derbe abgespeckte Version. Den Ordner "Borland\BDS" gibt es bei mir schon nicht. Kein Wunder, dass ich mich immer im Dunkeln bewege. Gibt es Möglichkeiten da ran zu kommen? :D

Und wieder ein neues Problem:
Ich möchte in Excel einen Hyperlink anlegen. Dabei erhalte ich immer eine Fehlermeldung, dass die Typen inkompatibel sind. Dank der Minimalversion habe ich dazu auch nichts finden können. :(

Sowohl die Übergabe als String-Konstante scheiterte als auch mit einer Variablen.

ausblenden Delphi-Quelltext
1:
  Sheet.Cells[Index+1, K+1].Hyperlinks.Add('ff@feuer.de');					

ausblenden Delphi-Quelltext
1:
  Sheet.Cells[Index+1, K+1].Hyperlinks.Add(StrPCopy('ff@feuer.de'));					

ausblenden Delphi-Quelltext
1:
  Sheet.Cells[Index+1, K+1].Hyperlinks.Add(CB.Text);					


Auch verschiedene Konvertierungen wurden als Fehler angemeckert.

Grüße von der Nordsee
Peter
Chemiker
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 194
Erhaltene Danke: 14

XP, Vista 32 Bit, Vista 64 Bit, Win 7 64 Bit
D7, BDS 2006, RAD Studio 2009+C++, Delphi XE2, XE3, VS 2010 Prof.
BeitragVerfasst: Mi 24.09.08 20:00 
Hallo Peter18,

Zitat:
Den Ordner "Borland\BDS" gibt es bei mir schon nicht.


Sorry, war mein Fehler ich habe nicht darauf geachtet, dass Du mit Delphi 4 arbeitest. Vermutlich hast Du einen „Borland\Delphi4“ Ordner.

Um Dein Problem zu lösen, hast Du mal einen Macro in Excel aufgezeichnet um einen Hyperlink zu erzeugen?

Bis bald Chemiker
Peter18 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 489
Erhaltene Danke: 2


Delphi4
BeitragVerfasst: Mi 24.09.08 20:35 
Hallo Chemiker,

stimmt.

Ja mit einem Macro habe ich auch getestet. Dort kann ich einfach einen String mit der Adresse eintragen. Da Delphi diverse String-Typen kennt nehme ich an, ich hab noch nicht den richtigen zu fassen bekommen. Hatte gehofft, man kann es ev. irgendwo nachlesen.

ausblenden Quelltext
1:
  Cells(1, 1).Hyperlinks.Add('ff@feuer.de')					

Du hattest 2 OLE-Typen erwähnt. mir ist es auch wichtig Version-unabhängig zu sein. deshalb bin ich von VBA zu Delphi übergegangen. Worin bestehen denn die Unterschiede?

Grüße von der Nordsee
Peter
Chemiker
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 194
Erhaltene Danke: 14

XP, Vista 32 Bit, Vista 64 Bit, Win 7 64 Bit
D7, BDS 2006, RAD Studio 2009+C++, Delphi XE2, XE3, VS 2010 Prof.
BeitragVerfasst: Mi 24.09.08 21:12 
Hallo Peter18,

Früh- Späte Bindung:

www.delphi-treff.de/...utomation%20steuern/

Bis bald Chemiker
Peter18 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 489
Erhaltene Danke: 2


Delphi4
BeitragVerfasst: Fr 26.09.08 13:31 
Hallo an alle,

Problem gelöst: :D
was als Makro funktioniert muss mit OLE nicht auch funktionieren.

In diesem Fall will "Add" anscheinend als 1. Parameter ein Range-Objekt, daher die Inkompatibilität. :idea: Und so funktioniert es:
ausblenden Delphi-Quelltext
1:
  Sheet.Hyperlinks.Add( Sheet.Cells[Index+1, K+1], 'mailto:' + CB.Text, CB.Text);					


Grüße von der Nordsee
Peter