Romero: Excel-Mappe schließen ohne zu speichern?

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

  1. Den Link hatte ich dir aber auch schon mal gegeben:
    http://msdn.microsoft.com/en-us/library/office/ff838613.aspx

    1. 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

      1. 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)

        1. 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

          1. Dann hast du noch irgendwo eine Referenz auf ein Excelobjekt. Das Workbook-Objekt zum Beispiel.

            1. 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

              1. 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

                1. 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

                  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

                  1. 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.