Как обновить все поля в документе Word?

216219
Gilles

Мне нужен способ обновления всех полей в документе Word 2013. (Если это работает в других версиях, тем лучше; у меня изначально была эта проблема с Word 2007, и с тех пор, похоже, ничего не изменилось.) Это включает перекрестные ссылки, номера страниц, оглавления, индексы, заголовки и т. Д. Если это можно обновить нажатием F9, я хочу обновить.

(Теоретически обновление полей может привести к необходимости обновления других полей, например, более длинное оглавление изменяет некоторые номера страниц в основном тексте. Мне достаточно позаботиться об общих случаях. На самом деле, все нормально, если мне нужно запустить макрос два или три раза, прежде чем он стабилизируется. Я просто хочу иметь один макрос, который находит все.)

Моя попытка до сих пор не обновляет поля в текстовых полях внутри рисунков. Как мне их обновить и что еще я пропустил?


РЕДАКТИРОВАТЬ : Объединение ответа, данного с тем, что у меня уже было, дает макрос, который, кажется, обновляет все (с известным дефектом ).

'' 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 
89
Для полноты вы также можете добавить таблицу прав доступа: `Dim toa As Word.TableOfAuthorities / Для каждого toa в ActiveDocument.TablesOfAuthorities / toa.Update / Next` Terrance 11 лет назад 1
Просто на голову, что я попробовал это в Word 2013, и подтвердил, что это все еще работает. Большое спасибо @Gilles за предоставленный код! Ugo 8 лет назад 0
А как насчет макроса, который идет для предварительного просмотра печати и обратно в документ? Pedro77 8 лет назад 0
@ Pedro77 Как это должно помочь? По крайней мере, в Word 2013 (у меня больше нет доступа к Word 2007), при предварительном просмотре или печати не обновляются поля. Gilles 8 лет назад 0
Мои поля обновлены, по крайней мере, ссылки и поля перекрестных ссылок. Pedro77 8 лет назад 0
@ Pedro77 Ты сделал что-то особенное? Мои поля не были обновлены, и, судя по количеству людей, отправляющих мне PDF-файлы или распечатки документов с устаревшими полями, поведение, которое я наблюдаю, широко распространено. Gilles 8 лет назад 0

6 ответов на вопрос

79
DMA57361

Я просто делаю Ctrl+ A- чтобы выбрать все - и затем F9 обновить лот.

Хотя, это пропускает верхние и нижние колонтитулы, но они обновляются при печати / предварительном просмотре IIRC.


Обновить

Я нашел следующий макрос. При быстром тестировании были обновлены оглавления, поля в абзацах, поля в верхнем и нижнем колонтитулах, а также поля в плавающем текстовом поле.

Надеюсь, это охватывает все, что вам нужно, если нет, укажите, что все еще не удалось обновить.

Источник: http://www.gmayor.com/install_macro.htm

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 
@ Джайлс - Ладно, честно, всегда лучше убедиться, что основы изучены первыми. Я только что поохотился и нашел макрос, который, кажется, выполняет свою работу, проверь мое обновление, дай мне знать, если что-нибудь пропустит. DMA57361 13 лет назад 0
Сейчас мы говорим! Я понятия не имею, почему итерации с `NextStoryRange` и с` document.StoryRanges` - это разные вещи, но ваш код в сочетании с обновлениями таблиц, которые у меня уже были, составляют победителя (ну, [почти] (http://superuser.com / questions / 197132 / предотвращение-подтверждения-всплывающего-обновления-полей-в-словах), но это другая проблема). Gilles 13 лет назад 0
33
David Roussel

Go into the print settings, select update fields. Then go to print, or print preview your doc.

Et voilà, all fields are updated!

MS Word Print Options from Word of Mac 2016

Сейчас я работаю в Word 2010 (где настройка находится в «Файл → Параметры → Показать»). Фактически без опции * некоторые * поля обновляются, но не все. Я уверен, что в Word 2007 этого не было, но у меня больше нет возможности его тестировать. Gilles 8 лет назад 2
Я нахожусь на Word 2016 для Mac. Настройка в Word -> Настройки -> Печать. Но на вдовах это будет в разделе печати глобальных настроек. Я уверен, что я был там в прошлом, но у меня нет установки для тестирования прямо сейчас. David Roussel 8 лет назад 2
Я думаю, что это больше не работает на Word 2016. TCB13 8 лет назад 0
Это работало для меня в Word 2016 на Windows 7. bouvierr 7 лет назад 0
Не работает в Word 2016 Windows. Поля, например, в нижних колонтитулах, не обновляются правильно. Hobbes 6 лет назад 0
5

Эта страница выглядит интересно:

Если вы используете Word 2007, процесс немного отличается: нажмите кнопку Office, а затем нажмите «Параметры Word». Word отображает диалоговое окно Word Options. Нажмите «Дополнительно» в левой части диалогового окна. (Щелкните здесь, чтобы увидеть связанный рисунок.) В области «Общие» (прокрутите немного вниз, чтобы увидеть его), убедитесь, что установлен флажок «Обновить автоматические ссылки при открытии». Нажмите на ОК. Этот параметр должен убедиться, что все ваши ссылки всегда обновлены. Если вы хотите обновить поля при открытии документа, вам нужно использовать макрос для выполнения задачи. В частности, вам нужно будет использовать макрос AutoOpen или AutoClose, в зависимости от того, хотите ли вы обновить поля при открытии или закрытии документа. Ниже приведен пример макроса AutoOpen, который вы можете использовать.

Sub AutoOpen() With Options .UpdateFieldsAtPrint = True .UpdateLinksAtPrint = True End With ActiveDocument.Fields.Update End Sub 

Обратите внимание, что макрос проверяет, установлены ли параметры для принудительного обновления полей и ссылок при печати, а затем обновляет все элементы коллекции Fields в документе. Если вы вместо этого хотите обновить поля при закрытии, вы можете использовать этот макрос:

Sub AutoClose() ActiveDocument.Fields.Update End Sub 

Этот макрос намного короче, поскольку нет необходимости устанавливать параметры обновления при печати при выходе из документа. Выход из документа.

3
Yohnny

If you want to properly update all headers and footers, this worked for me:

 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 
Как это улучшает [принятый ответ] (http://superuser.com/a/196714)? Обновляет ли это поля в текстовых полях на рисунках? Gilles 9 лет назад 0
2
rlaviolette

Word 2010:

Щелкните правой кнопкой мыши по ленте, настройте ленту, выберите команду из «всех команд», найдите «обновление» и добавьте ее в нужное место.

Эта кнопка обновляет только выбранные поля.
Затем, чтобы обновить все поля, нажмите Ctrl+, Aзатем эту кнопку.

Чем он отличается от нажатия клавиши `F9`? Это действительно обновляет внутри рисунки, таблицы и т. Д.? Gilles 10 лет назад 0
У меня сейчас Word 2013, так что я проверил. Это похоже на нажатие клавиши F9. Он не обновляет поля внутри рисунков, что было моей главной мотивацией для постановки этого вопроса. Gilles 8 лет назад 1
2
Sherd

For 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."); } } } 

Похожие вопросы