Wie aktualisiere ich alle Felder in einem Word-Dokument?
216336
Gilles
Ich möchte eine Möglichkeit, alle Felder in einem Word 2013-Dokument zu aktualisieren . (Wenn es in anderen Versionen funktioniert, umso besser; ich hatte dieses Problem ursprünglich mit Word 2007, und seitdem scheint sich nichts geändert zu haben.) Dazu gehören Querverweise, Seitenzahlen, Inhaltsverzeichnisse, Indizes, Kopfzeilen usw. Wenn es durch Drücken von aktualisiert werden kann F9, möchte ich es aktualisieren.
(Theoretisch kann das Aktualisieren von Feldern dazu führen, dass andere Felder aktualisiert werden müssen, z. B. ändert ein längeres Inhaltsverzeichnis einige Seitenzahlen im Haupttext. Die Behandlung der häufigsten Fälle ist für mich gut genug. In der Tat ist es in Ordnung, wenn ich ausführen muss das Makro zwei oder drei Mal, bevor es sich stabilisiert. Ich möchte nur ein Makro haben, das alles findet.)
Mein bisheriger Versuch aktualisiert keine Felder in Textfeldern in Zahlen. Wie aktualisiere ich sie und was habe ich noch vermisst?
BEARBEITEN : Das Kombinieren der Antwort mit dem, was ich bereits hatte, ergibt ein Makro, das scheinbar alles aktualisiert (mit einem bekannten Defekt ).
'' Update all the fields, indexes, etc. in the specified document. Sub UpdateAllFieldsIn(doc As Document) '' Update tables. We do this first so that they contain all necessary '' entries and so extend to their final number of pages. Dim toc As TableOfContents For Each toc In doc.TablesOfContents toc.Update Next toc Dim tof As TableOfFigures For Each tof In doc.TablesOfFigures tof.Update Next tof '' Update fields everywhere. This includes updates of page numbers in '' tables (but would not add or remove entries). This also takes care of '' all index updates. Dim sr As range For Each sr In doc.StoryRanges sr.Fields.Update While Not (sr.NextStoryRange Is Nothing) Set sr = sr.NextStoryRange '' FIXME: for footnotes, endnotes and comments, I get a pop-up '' "Word cannot undo this action. Do you want to continue?" sr.Fields.Update Wend Next sr End Sub '' Update all the fields, indexes, etc. in the active document. '' This is a parameterless subroutine so that it can be used interactively. Sub UpdateAllFields() UpdateAllFieldsIn ActiveDocument End Sub
For completeness you may also want to add the table of authorities: `Dim toa As Word.TableOfAuthorities / For Each toa In ActiveDocument.TablesOfAuthorities / toa.Update / Next`
Terrance vor 11 Jahren
1
Nur ein Hinweis, dass ich dies in Word 2013 ausprobiert habe und bestätigt, dass es noch funktioniert. Vielen Dank, @Gilles, für den Code!
Ugo vor 9 Jahren
0
Was ist mit einem Makro, das zur Druckvorschau und zurück zum Dokument wechselt?
Pedro77 vor 9 Jahren
0
@ Pedro77 Wie soll das helfen? Zumindest mit Word 2013 (ich habe keinen Zugriff mehr auf Word 2007), werden die Druckvorschau oder die Druckvorschau für diese Angelegenheit nicht aktualisiert.
Gilles vor 9 Jahren
0
Meine Felder werden aktualisiert, zumindest Referenzen und Querverweisfelder.
Pedro77 vor 9 Jahren
0
@ Pedro77 Hast du etwas Besonderes gemacht? Meine Felder wurden nicht aktualisiert, und wenn man nach der Anzahl der Leute urteilt, die mir PDFs oder Ausdrucke von Dokumenten mit veralteten Feldern senden, ist das Verhalten, das ich beobachte, weit verbreitet.
Gilles vor 9 Jahren
0
Ich mache einfach Ctrl+ A-, um alles auszuwählen - und dannF9 das Los zu aktualisieren.
Obwohl dies Kopf- und Fußzeilen vermisst, werden sie aktualisiert, wenn Sie IIRC drucken / drucken.
Aktualisieren
Ich habe das folgende Makro gefunden. Bei einem Schnelltest wurden Inhaltsverzeichnisse, Felder innerhalb von Absätzen, Felder innerhalb der Kopf- und Fußzeile und Felder innerhalb einer Floating-Textfeld-Abbildung aktualisiert.
Hoffentlich deckt das alles ab, was Sie brauchen. Wenn nicht, geben Sie bitte an, was noch nicht aktualisiert werden kann.
Sub UpdateAll() Dim oStory As Range For Each oStory In ActiveDocument.StoryRanges oStory.Fields.Update If oStory.StoryType <> wdMainTextStory Then While Not (oStory.NextStoryRange Is Nothing) Set oStory = oStory.NextStoryRange oStory.Fields.Update Wend End If Next oStory Set oStory = Nothing End Sub
@ Giles - OK, fair genug, immer am besten zu überprüfen, ob die Grundlagen zuerst erforscht wurden. Ich hatte gerade eine Jagd und fand ein Makro, das scheinbar den Job erledigt, mein Update überprüft und mich informiert, wenn etwas fehlt.
DMA57361 vor 14 Jahren
0
Jetzt reden wir! Ich habe keine Ahnung, warum iterating mit NextStoryRange und mit document.StoryRanges verschiedene Dinge sind, aber Ihr Code kombiniert mit den Tabellenaktualisierungen, die ich bereits hatte, macht einen Gewinner (na ja, fast) (http://superuser.com) / questions / 197132 / Verhindern eines Bestätigungs-Popup-Updates-Felder (in-word), aber das ist ein anderes Thema.
Gilles vor 14 Jahren
0
33
David Roussel
Gehen Sie in die Druckeinstellungen und wählen Sie Aktualisierungsfelder aus. Dann gehen Sie zum Drucken oder drucken Sie eine Vorschau Ihres Dokuments.
Et voilà, alle Felder werden aktualisiert!
Für mich jetzt in Word 2010 arbeiten (wo die Einstellung in "Datei → Optionen → Anzeige" ist). Ohne die Option * werden einige * Felder aktualisiert, jedoch nicht alle. Ich bin mir ziemlich sicher, dass es nicht in Word 2007 war, aber ich habe es nicht mehr zum Testen.
Gilles vor 9 Jahren
2
Ich bin auf Word 2016 für Mac. Die Einstellung ist in Word -> Voreinstellungen -> Drucken. Bei Witwen wird es aber im Druckbereich der globalen Einstellungen liegen. Ich bin mir sicher, dass ich in der Vergangenheit schon einmal dort gewesen bin, aber ich habe momentan keine Installation zum Testen.
David Roussel vor 9 Jahren
2
Ich denke, das funktioniert auf Word 2016 nicht mehr.
TCB13 vor 8 Jahren
0
Dies funktionierte für mich in Word 2016 unter Windows 7.
bouvierr vor 8 Jahren
0
Funktioniert nicht in Word 2016 Windows. Felder in zB Fußzeilen werden nicht korrekt aktualisiert.
Hobbes vor 6 Jahren
0
Wenn Sie Word 2007 verwenden, ist der Vorgang ein wenig anders: Klicken Sie auf die Schaltfläche Office und dann auf Word-Optionen. Word zeigt das Dialogfeld Word-Optionen an. Klicken Sie auf der linken Seite des Dialogfelds auf Erweitert. (Klicken Sie hier, um eine verwandte Abbildung anzuzeigen.) Vergewissern Sie sich, dass im Bereich "Allgemein" (ein wenig nach unten scrollen), dass das Kontrollkästchen "Automatische Links beim Öffnen aktualisieren" aktiviert ist. Klicken Sie auf OK. Diese Einstellung sollte sicherstellen, dass alle Links immer auf dem neuesten Stand sind. Wenn Sie die Felder beim Öffnen des Dokuments aktualisieren möchten, müssen Sie zum Ausführen der Aufgabe ein Makro verwenden. Insbesondere müssen Sie entweder ein AutoOpen- oder ein AutoClose-Makro verwenden, je nachdem, ob Sie die Felder aktualisieren möchten, wenn das Dokument geöffnet oder geschlossen wird. Das folgende Beispiel zeigt ein AutoOpen-Makro, das Sie verwenden können.
Sub AutoOpen() With Options .UpdateFieldsAtPrint = True .UpdateLinksAtPrint = True End With ActiveDocument.Fields.Update End Sub
Beachten Sie, dass das Makro sicherstellt, dass die Optionen so eingestellt sind, dass die Aktualisierung der Felder und Verknüpfungen beim Drucken erzwungen wird. Anschließend werden alle Mitglieder der Fields-Auflistung im Dokument aktualisiert. Wenn Sie stattdessen die Felder beim Schließen aktualisieren möchten, können Sie dieses Makro verwenden:
Sub AutoClose() ActiveDocument.Fields.Update End Sub
Dieses Makro ist viel kürzer, da beim Beenden des Dokuments keine Optionen zum Aktualisieren beim Drucken festgelegt werden müssen.
3
Yohnny
Wenn Sie alle Kopf- und Fußzeilen ordnungsgemäß aktualisieren möchten, hat dies für mich funktioniert:
Dim oStory As Range Dim oSection As Object Dim oHeader As Object Dim oFooter As Object For Each oStory In ActiveDocument.StoryRanges oStory.Fields.Update Next oStory For Each oSection In ActiveDocument.Sections For Each oHeader In oSection.Headers oHeader.Range.Fields.Update Next oHeader For Each oFooter In oSection.Footers oFooter.Range.Fields.Update Next oFooter Next oSection
Wie verbessert sich die [akzeptierte Antwort] (http://superuser.com/a/196714)? Aktualisiert es Felder in Textfeldern in Zahlen?
Gilles vor 9 Jahren
0
2
rlaviolette
Word 2010:
Klicken Sie mit der rechten Maustaste auf die Multifunktionsleiste, passen Sie die Multifunktionsleiste an, wählen Sie den Befehl "Alle Befehle" aus, suchen Sie nach "Update" und fügen Sie ihn an der gewünschten Stelle ein.
Diese Schaltfläche aktualisiert nur ausgewählte Felder. Um alle Felder zu aktualisieren, drücken Sie Ctrl+ und Adann diese Taste.
Wie unterscheidet es sich von "F9"? Wird das in Zahlen, Tabellen usw. wirklich aktualisiert?
Gilles vor 11 Jahren
0
Ich habe jetzt Word 2013, also habe ich nachgesehen. Dies scheint das gleiche zu tun, als wenn Sie F9 drücken. Es aktualisiert keine Felder in Zahlen, was meine Hauptmotivation war, diese Frage zu stellen.
Gilles vor 9 Jahren
1
2
Sherd
Für c #:
using System; using System.Collections.Generic; using System.IO; using Microsoft.Office.Interop.Word; class Program { static void Main(string[] args) { List<string> path = new List<string>(args); string filePathstr = string.Join(" ", path.ToArray()); //System.Windows.Forms.MessageBox.Show("filepathstr: " + filePathstr); string folderPathstr = Path.GetDirectoryName(filePathstr); //System.Windows.Forms.MessageBox.Show("folderPathstr: " + folderPathstr); try { Application ap = new Application(); Document document = ap.Documents.Open(filePathstr); document.Fields.Update(); foreach (Section section in document.Sections) { document.Fields.Update(); // update each section HeadersFooters headers = section.Headers; //Get all headers foreach (HeaderFooter header in headers) { Fields fields = header.Range.Fields; foreach (Field field in fields) { field.Update(); // update all fields in headers } } HeadersFooters footers = section.Footers; //Get all footers foreach (HeaderFooter footer in footers) { Fields fields = footer.Range.Fields; foreach (Field field in fields) { field.Update(); //update all fields in footers } } } document.Save(); document.Close(); } catch (NullReferenceException) { System.Windows.Forms.MessageBox.Show("A valid file was not selected."); } } }