Excel-Mappe schließen ohne zu speichern?
Romero
- javascript
Hallöchen an Euch,
möchte nur ne kurze Anwort auf die Frage, wie man Excel ohne zu speichern beenden kann bzw. die Mappe schließen kann?
Mit *.save() = false geht das ja sicherlich nicht.
Wie ist also die richtige Syntax dafür?
LG Romero
Den Link hatte ich dir aber auch schon mal gegeben:
http://msdn.microsoft.com/en-us/library/office/ff838613.aspx
Den Link hatte ich dir aber auch schon mal gegeben:
http://msdn.microsoft.com/en-us/library/office/ff838613.aspx
ich danke dir.
Ist zwar VBA aber hab es für Javascript so gestaltet:
Workbook.Close(SaveChanges=false)
Und siehe da, es klappt.
LG Romero
Nochmals Danke
Ist zwar VBA
Nein, das ist die Interface-Dokumentation. Das Interface kannst du dir z.B. mit OLE View ansehen. Close sieht als idl-Deklaration so aus:
[id(0x00000115), helpcontext(0x00010115)]
void Close(
[in, optional] VARIANT SaveChanges,
[in, optional] VARIANT Filename,
[in, optional] VARIANT RouteWorkbook);
Nur das Beispiel ist als VBA-Script angegeben. Man findet aber auch andere. Leider werden diese seit .Net immer schlechter.
aber hab es für Javascript so gestaltet:
Workbook.Close(SaveChanges=false)
und die globale Variable SaveChanges die du nebenbei anlegst ist total umsonst.
Workbook.Close(false)
Ist zwar VBA
Nein, das ist die Interface-Dokumentation. Das Interface kannst du dir z.B. mit OLE View ansehen. Close sieht als idl-Deklaration so aus:
[id(0x00000115), helpcontext(0x00010115)]
void Close(
[in, optional] VARIANT SaveChanges,
[in, optional] VARIANT Filename,
[in, optional] VARIANT RouteWorkbook);
Nur das Beispiel ist als VBA-Script angegeben. Man findet aber auch andere. Leider werden diese seit .Net immer schlechter.aber hab es für Javascript so gestaltet:
Workbook.Close(SaveChanges=false)
und die globale Variable SaveChanges die du nebenbei anlegst ist total umsonst.
Workbook.Close(false)
Hy unknown,
habe das mit dem .Close(false) gerücksichtigt.
Aber dazu ne andere Frage. Wenn ich, wie bei dem anderen Thema, was wir beide besprochen hatten, aber nun meine EXCELApp schließen will:
EXCELAPP.Workbook.Save()
EXCELAPP.Workbook.Close()
EXCELAPP.Application.Quit()
EXCELAPP.Application = null
dann sehe ich aber trotzdem eine EXCEL-Instanz im Task-Manager. Habe aber keine weitere offen. Sehe ja wie sich da eine EXCEL-Instanz öffnet (indem ich eineMappe öffne und eine Tabelle anlege) aber da nicht mehr "verschwindet".
Erst wenn ich das komplette Script schließe, "verschwindet" diese Instanz auch aus dem Task-Manager. War es bei deinen Tests ebenso? Bzw. warum wird diese Instanz daraus nicht "gelöscht"? Bei anderen Öffnungen einer Excel-Mappe durch mein Script werden ebenfalls diese Instanzen wieder aus dem Task-Manager genommen. Warum also diesmal nicht?
LG Romero
Dann hast du noch irgendwo eine Referenz auf ein Excelobjekt. Das Workbook-Objekt zum Beispiel.
Dann hast du noch irgendwo eine Referenz auf ein Excelobjekt. Das Workbook-Objekt zum Beispiel.
Ich habe folgendes getestet:
EXCEL_Speicherung.Workbook.Close(false);
EXCEL_Speicherung.Workbook = null;
EXCEL_Speicherung.Application.Quit();
EXCEL_Speicherung.Application = null;
Aber das alles brachte nix, es bleibt weiterhin im Task-Manager.
Wenn ich aber das im VBS wie folgt angebe:
OpenWorkbook.Close False
OpenExcel.Quit
Set OpenWorkbook = Nothing
Set OpenExcel = Nothing
dann wird die Instanz geschlossen.
Aber mit Hilfe deiner Klassen-Deklaration, übergebe ich ja an Javascript folgendes:
Class EXCELObj
Public Application
Public Workbook
End Class
Set ExcelObjekt = new EXCELObj
Set ExcelObjekt.Application = OpenExcel
Set ExcelObjekt.Workbook = OpenWorkbook
Set EXCEL_Tabelle_erstellen = ExcelObjekt
und versuche es, wie oben beschrieben in Javascript zu schließen.
Ich meine, es ist zwar nicht mehr "da" also keine Mappe offen aber es so nicht sauber programmiert.
Das erfolgt (in Javascript) über ein Button.
Wenn ich diesen Button oder diese "Schließungen" erneut drücke bzw. ausführen lasse, bekomm da zwar eine Fehlermeldung, dass ExcelObjekt.Workbook kein Null oder kein Objekt sei (was ja richtig ist, hab es ja "null" gesetzt) aber die Instanz verschwindet.
LG Romero
Ich habe folgendes getestet:
...
Aber das alles brachte nix, es bleibt weiterhin im Task-Manager.
Keine Ahnung, du musst alle Objekte freigeben
Wenn ich aber das im VBS wie folgt angebe:
dann wird die Instanz geschlossen.
Auch die im VBS
Ich habe folgendes getestet:
...
Aber das alles brachte nix, es bleibt weiterhin im Task-Manager.
Keine Ahnung, du musst alle Objekte freigebenWenn ich aber das im VBS wie folgt angebe:
dann wird die Instanz geschlossen.
Auch die im VBS
Hy unknown,
hab eine andere Lösung dafür gefunden.
Ich rufe eine weitere Datei auf, wo folgendes drin steht:
Function EXCEL_Beenden( ExcelObjekt )
ExcelObjekt.Workbook.Close False
ExcelObjekt.Application.Quit
Set ExcelObjekt.Workbook = Nothing
Set ExcelObjekt.Application = Nothing
End Function
Und da ich vorher von VBScript dieses ExcelObjekt als Klasse an Javascript übergebe, übergebe ich dieses ExcelObjekt wieder zurück an VBScript (neue Datei) und lasse diese dann über den o.g. Code schließen. Somit verschwindet das aus dem Task-Manager und ich kann somit weiter verfahren ohne das ich weiter Excel-Instanzen sich öffnen.
LG Romero
Und da ich vorher von VBScript dieses ExcelObjekt als Klasse an Javascript übergebe, übergebe ich dieses ExcelObjekt wieder zurück an VBScript (neue Datei) und lasse diese dann über den o.g. Code schließen. Somit verschwindet das aus dem Task-Manager und ich kann somit weiter verfahren ohne das ich weiter Excel-Instanzen sich öffnen.
Das ist total unlogisch. Du machst in beiden Fällen das gleiche. Nur in unterschiedlichen Sprachen.
Das hat mich aber auf eine Idee gebracht. In VBS scheint der Garbagecollector aufzuräumen, wenn eine Variable auf NULL gesetzt wird oder am Ende einer Funktion. In JS passiert das irgendwann.
http://blogs.msdn.com/b/ericlippert/archive/2003/09/17/53038.aspx
Also sollte ein
CollectGarbage();
am Ende deiner JS-Funktion dafür sorgen, daß Exel wirklich freigegeben wird.
Ein kleiner Test funktioniert bei mir.