Excel Instanz schliessen ??
-
Hallo Forum.
Hab hier nen grosses Problem ... und zwar öffne ich wie in einem Beispiel in der FAQ beschrieben ein XLS Sheet.Variant Excel; Excel = Variant::CreateObject("Excel.Application"); Excel.OlePropertyGet("ActiveWorkBook"); // Excel-Datei öffnen Excel.OlePropertyGet("WorkBooks").OleFunction("Open",XLS.c_str()); // Sichtbar machen //Excel.OlePropertySet("Visible",1); Variant Sheet; Sheet=Excel.OlePropertyGet("ActiveSheet");Soweit so gut, der Versuch die Instanz zu schliessen funktionierte jedoch nicht.
Wenn ich nun 500 XLS Dateien öffne bleiben diese alle Offen

Jemand ne idee ??
-
"Funktioniert nicht" ist keine ausreichende Problembeschreibung.
-
hi,
probier mal das hier:Sheet.OleFunction("Close");Oder um Excel ganz zu Beenden:
Excel.OleFunction("Quit");Ist nicht getestet

Kann auch sein das Excel dann Fragt ob man Speichern
will müsstest dann "Save" vorher ausführen.
-
Danke ... werde ich gleich probieren.
@ Jansen ... Sorry für meine ungenaue Problemschilderung.
-
Na wie wär's dann mit einer genauen Beschreibung!?
-
...
also das mit dem schliessen hat soweit geklappt, wenn ich nen save davor setze ... um die bestätigung für das speichern zu automatisieren kann ich ja nen makro aufzeichnen. Soweit gut.Bei öffnen fragt Excel jedoch nach, ob Verknüpfungen aktualisiert werden sollen. Der Code aus dem Makro sieht folgendermaßen aus:
Workbooks.Open Filename:= "D:\A0#6007LLHV28.xls", UpdateLinks:=0
Doch wie bau ich das in zum beispiel diesen C Code ein ??
C/C++ Code:
Excel.OlePropertyGet("WorkBooks").OleFunction("Open",XLS.c_str());
C/C++ Code:
Excel.OlePropertyGet("WorkBooks").OleFunction("Open",XLS.c_str());... und damit ich in Zukunft nich mehr so nervige fragen stellen muss ... woher wisst ihr die Antwort eigentlich ??? Kann man die OLE sachen irgendwo nachschauen ??
-
Also ich hatte ein kleineres Projekt mit Excel und ein größeres mit Word da lernt man einiges über OLE.
Du solltest generell vor dem Posten hier im Forum die Suchfunktion oder auch google mal besuchen. Dort finde ich meistens Antworten auf meine Fragen
Folgendes deaktiviert Fehlermeldungen z.B. wenn man Excel beendet:
Excel.OlePropertySet("DisplayAlerts", false);Probier das auch mal vor dem Öffnen der Dateien auszuführen vielleicht geht ja die Aktualisierungsfrage weg

-
Schau mal nach dem schliessen der Instanz in deinen Taskmanager. Sind dort zufällig noch 499 Excelinstanzen vorhanden? Nach deinem Code wird jedesmal eine neue Instanz aufgemacht. Solltest vorher abfragen ob Excel schon offen ist dann klappts auch mit dem Nachbarn

-
Die idee is gut

-
woher wisst ihr die Antwort eigentlich ??? Kann man die OLE sachen irgendwo nachschauen ??
das ist wohl die wichtigste frage, welche ich dir auch beantworten möchte.

Wenn du in Excel ein Macro aufzeichnest, wird VisualBasic- Quellcode erzeut. Du kannst so gut wie alles, was du dort machst auch mit ole machen.
Beispiel: Ein erstelltes Macro:
Application.ActiveWorkbook.Sheets.Add Application.ActiveWorkbook.ActiveSheet.Name = "Hallo11" Application.ActiveWorkbook.SaveAs ("C:\test.xls")Den ganzen Müll kannst du auch mit ole machen. Dabei unterscheidet man zwischen Eingenschaften und Methoden.
Methoden
Dafür benutzt mann "OleFunction". Der erste Parameter ist der Funktionsname, die folgendenden die Parameter.Eigenschaften:
für sowas musst du "OlePropertyGet" nehmen, wenn du eine Eigenschaft abrufen willst und
OlePropertySet wenn du eine setzen willst. Bei OlePropertySet erst der Eigenschaftsname dann die Eigenschaft. Bei OLPropertyGet mit Index-Eigenschaften, wird dieser mit angegeben:.... var_ActivWorkbook.OlePropertyGet("Sheets",1); // gib das erste TabellenblattBeispiel:
Variant var_Excel=CreateOleObject("Excel.Application"); Variant var_ActivWorkbook=var_Excel.OlePropertyGet("ActiveWorkbook"); var_ActivWorkbook.OleFunction("Add"); Variant var_ActivSheet=var_ActivWorkbook.OlePropertyGet("ActiveSheet"); var_ActivSheet.OlePropertySet("Name","Andreas"); var_ActivWorkbook.OleFunction("SaveAs","C:\\test.xls");Im besten Fall baust du also erst einmal ein VB-Macro in Excel, das deine gewünschten Funktionalitäten erfüllt. Das dürfte kein Problem sein. Wenn du spezielle Funktionen/Eigenschaften brauchst, kannst du diese in der Hilfe zu Excel nachlesen.
Das Macro setzt du dann nach ole um, wobei das Aufrufen immer nach den selben Muster erfolgt, wie ich beschrieben habe.
Es ist also keine Hellseherrei. Da kann ich dich beruhigen...
PS: Ich hab ausversehen auf editieren anstatt auf zitieren geklickt, weshalb der Beitrag von 66Blade[DC]666 am 30 Aug 2004 um 11:08 ertwas kapput ist. sorry.
-
Vielen Dank
Ich werde es direkt nachher mal ausprobieren.
Auf so einen Beitrag habe ich gewartet
THANX !!!
-
hab auch einen Tipp:
ich hab mehrere Projekte mit Excel und Word usw. Da hab ich irgendwann die
Nase voll gehabt und hab mir ne Dll in VB geschrieben und dann gelinkt. Nun
kann ich mit eigens definierten Funktionsaufrufen sehr viel leisten.Mittlerweile erzeuge ich damit ganze Berichte, mit Diagrammen und komplett
formatieren Texten. Solltest du sowas öfter benötigen, denk mal über diese
Lösung nach. Der Vorteil ist der, das du mit VB so ziemlich alles hinbekommst,
was in Office abgeht und den Code bekommst du, wie schon gesagt wurde, durch
Aufzeichnen der Makros ...
-
Hmmm interessant ... kann ich einfach ne function in VBA machen, das als dll compilieren und die dann mit BCB6 einbinden und aufrufen ???
-
Hi,
so einfach gehts nicht, also nicht mit VBA. Musst schon VB nehmen.
So entsteht dann eine COM-Dll.
Nicht mehr aktuell, weil .NET ja nun da ist.
Egal, auf jeden Fall wird eine solche Dll mit Kommandozeile (oder über
viele Setups automatisch) registriert. Per Kommandozeile mit:regsvr32 "Dll-Path"
fertig. Somit ist die Dll überall im System zu sehen, ist also egal wo sie
liegt. In Borland wird einfach mit Library-Import ne cpp-Datei automatisch
erzeugt. usw....Aber VB solltest du dafür schon haben. Mittlerweile kann ich mir vorstellen,
dass man sich das leicht kaufen kann, wo es das doch nicht mehr so geben wird.