VBA-Skript zu schließen, jede Instanz von Excel, außer sich selbst
Habe ich ein Unterprogramm in mein errorhandling-Funktion, die versucht, zu schließen jeder Arbeitsmappe öffnen Sie in jeder Instanz von Excel. Sonst könnte es bleiben im Speicher, und breche meinen nächsten vbscript. Es sollte auch in der Nähe jeder Arbeitsmappe ohne speichern der änderungen.
Sub CloseAllExcel()
On Error Resume Next
Dim ObjXL As Excel.Application
Set ObjXL = GetObject(, "Excel.Application")
If Not (ObjXL Is Nothing) Then
Debug.Print "Closing XL"
ObjXL.Application.DisplayAlerts = False
ObjXL.Workbooks.Close
ObjXL.Quit
Set ObjXL = Nothing
Else
Debug.Print "XL not open"
End If
End Sub
Dieser code ist nicht optimal, jedoch. Zum Beispiel kann es in der Nähe 2 Arbeitsmappen in einer Excel-Instanz, aber wenn Sie 2 Instanzen von excel, es wird nur schließen, aus 1.
Wie kann ich diese umschreiben zu schließen alle Excel ohne speichern der änderungen?
Extra Credit:
Wie dies für den Zugang als auch ohne schließen der Access-Datei, die gehostet wird das script?
InformationsquelleAutor PowerUser | 2010-08-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Habe ich gerade versucht, die folgenden mit Excel und Access :
Wenn Sie ändern die msaccess.exe zu excel.exe, excel getötet werden.
Wenn Sie wollen etwas mehr Kontrolle über den Prozess, check-out:
http://www.vbaexpress.com/kb/getarticle.php?kb_id=811
InformationsquelleAutor Edward Leno
Sollten Sie in der Lage sein zu verwenden, Fenster Griffe dies.
Scheint es mir GetObject liefert die "ältesten" Access-Instanz. So, der sub schließt alle Zugriff auf Instanzen gestartet wurden, bevor man mit dem sub. Sobald Sie feststellt, Stoppt es. Vielleicht ist das gut für Ihre situation. Aber wenn Sie brauchen, um auch in der Nähe den Zugriff auf Instanzen gestartet, nachdem die Ausführung des Codes, schauen Sie auf die Windows API-Fenster-handle-Funktionen.
Ich habe nicht versucht, diesen Ansatz für Excel. Aber ich sah Excel-Anwendung.Hwnd und Anwendung.Hinstance ... also ich vermute, Sie können tun, etwas ähnliches gibt.
Beachten Sie auch, entledigte ich mich
On Error Resume Next
. GetObject wird immer wieder ein Application-Objekt in diesem sub, so dass es nicht dazu. Darüber hinaus versuche ich zu vermeidenOn Error Resume Next
im Allgemeinen.Update: Seit GetObject nicht der job für Sie tun, verwenden Sie eine andere Methode, um die Fenster-handles aller den Zugriff auf Instanzen. Schließen Sie jede von Ihnen, deren Fenster-handle passt nicht zu der, die Sie verlassen wollen laufen (der Anwendung.hWndAccessApp).
Meine bevorzugte Vorgehensweise ist, wenn ich will
Resume Next
in Reaktion auf einen spezifischen Fehler code ... mit einemSelect Case
in den ErrorHandler. Das ist eine ganze Menge anders (und besser, IMO) alsResume Next
als Antwort auf alle möglichen Fehler.Da meine Access-Skript steuert mehrere andere Zugriff auf scripts & öffnet einige Excel-Dateien, in der Standardeinstellung werden die ältesten in den Haufen. Danke für die Mühe, aber ohne eine Möglichkeit zu wählen andere Access-Prozess, ohne zu töten die erste, die es findet, es nicht mehr tun würde mir viel des guten.
Ich verstehe nicht, warum dies ist nicht die Antwort auf Ihre Frage. Was ist der Unterschied zwischen dem Zugriff auf Instanzen, unterscheidet Sie derart, dass Sie möchten, dass einige geschlossen und andere nicht? So weit wie ich kann sagen, Sie haben nicht erklärt, dass explizit.
Also, Sie wollen, um zu töten alle Instanzen, außer dem einen, in dem der code ausgeführt wird? Das ist die Antwort, die Sie habe zur Verfügung gestellt wurden hier. I"m nicht zu sehen, was ist falsch mit ihm.
InformationsquelleAutor HansUp
Unterscheidung der Instanzen einer Anwendung ist ein sehr altes problem, und es ist nicht eindeutig zu VBA.
Ich habe versucht, dies herauszufinden, mich über die Jahre nie mit mehr Erfolg als die Zeit vor.
Ich denke, die lange und die kurze davon ist, dass Sie können nie wissen, ob die Anwendungsinstanz, die Sie verweisen, ist das in dem der code ausgeführt wird (also beenden Sie es könnten, verlassen die anderen Instanzen öffnen).
Es verwirrt meinen Verstand, und ein Teil von mir glaubt, dass es möglich sein muss, so dass ich hoffe, Sie bekommen hier eine Antwort, aber soweit ich das überhaupt gefunden habe, gibt es keine Möglichkeit, verwenden Sie eine Prozess-id oder etwas über den Prozess selbst zu verbinden, um eine Referenz auf eine Instanz der Anwendung im code.
Danke für die info. Ich habe heute etwas gelernt!
InformationsquelleAutor Jay
Ich weiß, dies ist eine alte post, aber für diejenigen, die zu besuchen, die hier aus sucht finden es vielleicht hilfreich.
Dieser code wurde gefunden und geändert. Es wird Ihnen jedes BLATT in jeder ARBEITSMAPPE in jedem Fall. Von dort aus können Sie bestimmen, die aktive Instanz.
Modul..............
Code........................
Ich hoffe das hilft jemandem 🙂
InformationsquelleAutor John
Dies ist eine Antwort auf einen alten post, doch wie das poster in 2012, hoffentlich hilft es jemanden, vielleicht kommen hier basiert auf einem generischen web-Suche.
Hintergrund
Meine Firma verwendet XLSX "Modelle", um unsere Daten in "ziemlich" automatisch. Der Datenexport von SAS als XLS; wir haben nicht die Lizenzen oder add-ons zu exportieren als XLSX. Der normale Prozess ist, kopieren/fügen Sie jede der 14 SAS-outputs in das XLSX-Format. Der folgende code durchläuft die ersten beiden Exporte, wo die Daten kopiert werden aus der XLS, eingefügt in das XLSX-und XLS-geschlossen.
Bitte beachten Sie: Die XLSX-Datei auf der Festplatte gespeichert. Die XLS-Dateien werden NICHT GESPEICHERT, d.h. der Weg geht
"My Documents/"
aber keine Datei oder Datei dort sichtbar.Müssen Sie explizit in der Qualifikation Ihren Aussagen. d.h. statt der
Workbooks("Book_Name")
stellen Sie sicher, identifizieren Sie die Anwendung, die Sie beziehen, werden SieApplication.Workbooks("Book_Name")
oderxlApp1.Workbooks("Book_Name")
InformationsquelleAutor user3756574
versuchen Sie es in einer Schleife
Ich hätte es test für null-ersten. pls. siehe edit
Sorry, aber ich bin noch immer Fehler. Ich bin sicher, ich kann hacken, aber ich denke jetzt, dass eine nicht-Office .dll-basierte Lösung wäre ein besserer Ansatz.
InformationsquelleAutor Beth