Шаблон Word 2010 с автоматически обновляемыми полями
Я хочу создать шаблон Word 2010 для своей команды, который гарантирует, что каждая страница содержит нижний колонтитул, отображающий следующую информацию:
- Кто последний сохранил файл
- Когда файл был сохранен последним
- Путь и имя файла, в котором хранится файл
Поэтому я создал файл шаблона (dotx) с нижним колонтитулом, который содержит следующие коды полей:
- {LASTSAVEDBY * Caps * MERGEFORMAT}
- {SAVEDATE \ @ "d MMM yyy" * MERGEFORMAT}
- {FILENAME -p}
Однако, сохраняя этот шаблон и создавая новый документ (затем сохраняя его), поля не обновляются. LASTSAVEDBY отображается как пробел, SAVEDATE показывает 0 XXX 0000, а FILENAME показывает Document1.
- Как установить стиль пули по умолчанию в Microsoft Word 2010?
- Office Word. Как открыть один и тот же документ в отдельных окнах?
- Остановить Microsoft Word 2010 от сглаживания скриншотов?
- Word 2010: Как ссылаться на пользовательские свойства документа?
- Изменить язык проверки орфографии для документа в Microsoft Word 2010
Я также попытался сохранить это как шаблон точки в случае, если есть скрытые макросы, но результаты одинаковы.
- Как иметь два заголовка на одном уровне в многоуровневом списке?
- Как включить кнопку быстрого доступа для включения и выключения проверки орфографии в Word 2010?
- Microsoft Word не может сохранить
- Word 2010 - перерыв страницы перед H2, кроме после H1
- Вставка / отображение двухстраничного объекта Word в листе Excel
- MS Word Find Style, охватывающий 2 строки, которые содержат текст и заменяют часть
- Экспорт стилей MS Word 2010
- Изменить значок DOCX
Поэтому, читая статью Microsoft KnowledegeBase об этом, вы получаете беспричинный ответ, что это по дизайну, поэтому вам нужно написать макрос для этого. Удобно они предоставляют макрос, который обновляет поля при открытии файла, а не сохраняет. Это действительно имеет смысл для нескольких полей, поэтому, если вы используете LASTSAVEDBY и SAVEDATE, это будет иметь смысл.
Просто помните, что вы не увидите обновлений, пока вы снова не откроете документ. Для нижних колонтитулов это абсолютно нормально.
И поскольку это макрос, вам определенно нужно сохранить как точку.
Для тех, кто нуждается в обновлении полей при сохранении, на форумах VBA Express обсуждается , или вы можете просто адаптировать макрос из документа Microsoft .
Обновление vbscript от Microsoft хорош, но приводит к документу, который всегда считает, что он был отредактирован, поэтому всегда запрашивает сохранение при закрытии. Большинство пользователей всегда будут нажимать на это, что приведет к значениям LASTSAVEDBY и SAVEDATE, показывающим, когда последний документ был прочитан, а кто.
Поэтому я добавил строку, чтобы сразу же пометить документ как неизменный после обновления полей. Любые дополнительные изменения в документе сбрасывают это значение, предоставляя подсказку сохранения при закрытии.
Вот код макроса:
Sub AutoOpen() ' ' AutoOpen Macro ' ' Dim aStory As Range Dim aField As Field For Each aStory In ActiveDocument.StoryRanges For Each aField In aStory.Fields aField.Update Next aField Next aStory ' set document as unchanged (prevents save dialog popping up when closing) ' further edits will set this back to false and restore ' the save dialog on close ActiveDocument.Saved = True End Sub
Обновление. Приведенный выше код работает нормально, если вы не сохранили его в вашем шаблоне Normal.dotm, и в этом случае он запускается каждый раз при открытии любого документа. Если документ открывается в защищенном представлении (т. Е. Он был загружен из Интернета или появился в виде вложения электронной почты), то ActiveDocument недоступен. Решение заключается в проверке того, что документ не находится в защищенном представлении перед запуском функций внутри макроса. Вот обновленный макрокоманд, в том числе оператор If, чтобы проверить, что документ не находится в защищенном режиме:
Sub AutoOpen() ' ' AutoOpen Macro ' ' Dim aStory As Range Dim aField As Field ' Check that document is not in Protected View before doing anything If Application.ActiveProtectedViewWindow Is Nothing Then For Each aStory In ActiveDocument.StoryRanges For Each aField In aStory.Fields aField.Update Next aField Next aStory ' set document as unchanged (prevents save dialog popping up when 'closing) - further changes will set this back ActiveDocument.Saved = True End If End Sub