Ich hoffe, dass ein VB / VBA-Experte mir helfen kann. Folgendes berücksichtigen:
Der Benutzer öffnet ein Dokument in Word 2003, und innerhalb des Makros Normal.dot AutoOpen
betrachten wir das aktuelle Dokument. Wenn es durch Klicken auf einen Link auf einer Webseite geöffnet wurde und bestimmte anwendungsspezifische Kriterien erfüllt, schließen Sie die gestreamte "Kopie" und das Quelldokument öffnen (auf einem freigegebenen Laufwerk gefunden, auf das der Benutzer zugreifen kann):
Mein Gedanke war, dass ich Activate
aufrufen musste, um sicherzustellen, dass das Originaldokument das ActiveDocument
war, aber ich bekomme einen 4160 'Bad file name' Fehler beim .Activate
Aufruf. Wenn ich den Aufruf von .Activate
auskommentiere, scheint ActiveDocument
auf das origDoc-Dokument eingestellt zu sein, selbst wenn bereits andere Dokumente geöffnet waren (ich bin mir nicht sicher, wie die Dokumentensammlung verwaltet wird und wie Word bestimmt was als nächstes ActiveDocument
wäre, wenn du das aktuelle ActiveDocument programmatisch schließt)
Wird also beim Aufruf von .Open
in einem Dokument das Dokument explizit als ActiveDocument
festgelegt? Führt der Aufruf von .Activate
für das bereits aktive Dokument zu einem Fehler?
Ich konnte nicht wirklich viel Dokumentation darüber finden, also danke im Voraus für irgendwelche Vorschläge und Einblicke!
Die einfache Antwort ist ja. Indem Sie das Dokument mit Ihrem Code öffnen, machen Sie es zum aktiven Dokument, das Sie dann in der nächsten Zeile schließen und versuchen, es im nächsten zu aktivieren, was fehlschlägt, weil das Dokument nicht mehr geöffnet ist. VBA scheint im Allgemeinen so zu funktionieren.
Es ist wichtig, mit ActiveDocument vorsichtig zu sein, weil es nicht immer selbstverständlich ist, welche Aktionen im Code oder anderswo ein Dokument "aktiv" machen (ich habe keinen Beweis, aber sogar ein Autosave könnte es tun). Wenn Sie Zweifel haben, sollten Sie besser auf ein Dokument in der Dokumentensammlung verweisen, obwohl dies auch zu Fehlern führen kann, wenn das Dokument nicht mehr geöffnet ist. Sie müssen eventuell auf die Sammlung zurückgreifen, um sicherzugehen, dass das Dokument korrekt ist. in der Tat, offen. Ich stoße viel mit Excel VBA, und Word VBA scheint in dieser Hinsicht identisch funktionieren.
Außerdem ist VBA beim Freigeben von Anwendungsobjekten flockig. Wenn Sie nicht aufpassen, erhalten Sie mehrere WINWORD-Prozesse, die im Task-Manager angezeigt werden können, unabhängig davon, ob Sie sie im Code schließen oder beenden. Der Code, den ich gefunden habe, um dies zu umgehen, besteht darin, den Prozess der Auswahl von END PROCESS im Taskmanager zu simulieren. Es funktioniert, aber es sollte eine bessere Lösung geben.
Sie sollten das ActiveDocument
-Objekt nicht an erster Stelle verwenden, es sei denn, es ist absolut unzuverlässig. Der bevorzugte Ansatz wäre dies:
Achten Sie darauf, dass eine Reihe von Problemen auftreten können:
Wenn Sie das Dokument nach dem Schließen erneut öffnen möchten
einmal .... Word / Windows nicht
"Verlasse" den Dateinamen und du erhältst eine ' Datei beschäftigt ' Nachricht oder eine Nachricht über 'erstellen
eine temporäre Kopie '.
Um mit diesem Problem fertig zu werden, musste ich ein ausgeklügeltes System zum Erstellen / Speichern und Entwickeln entwickeln
Aufräumen mehrerer Versionen anderer Dokumente, die ich in meinen Word-Anwendungen öffne / manipuliere
wegen dieser Designfehler in Office Open
/ Close
/ Save
Methoden.
Verwenden Sie die ReadOnlyRecommended
-Eigenschaft, die mit der Option False
festgelegt wurde
.Open
Methode
kann auf das Dokumentobjekt (oben genanntes Dokument) verweisen
ernste Fehler, wenn Sie nicht zusichern
dass das doc
-Objekt noch existiert, bevor Sie es versuchen und manipulieren. Denk immer daran
Word ist eine "offene" Anwendungsplattform .... und der Benutzer kann Dinge tun, die Sie nicht gezählt haben
auf ... in der letzten Millisekunde oder so. Dieser Rat gilt für jedes andere Objekt oder Eigentum, das Sie verwenden können
möchte in Word manipulieren.
wenn Sie die Documents-Sammlung (oder eine andere) ohne bearbeiten
Sicherstellen, dass das Dokument oder ein anderes Objekt immer noch da ist und
gültig vor dem Löschen oder Verschieben innerhalb der Sammlung
Erhalten Sie ' Stapelüberlauf ' Fehler. Vor allem, wenn Sie es versuchen und
Schließen / Löschen von Objekten in einer Sammlung, beginnend mit .item(1)
. Sie
muss Elemente in einer Sammlung von der letzten löschen und merken
dass sich die Sammlungsregeln und Zeiger bei jedem Wechsel ändern
.add / .remove / .close Elemente von ihnen.