我想为我的团队创建一个 Word 2010 模板,确保每一页都包含一个显示以下信息的页脚:
- 谁最后保存了文件
- 文件上次保存的时间
- 存储文件的路径和文件名
因此,我创建了一个模板文件(dotx),其页脚包含以下字段代码:
- {LASTSAVEDBY *Caps *MERGEFORMAT}
- {SAVEDATE \@ "d MMM yyy" *MERGEFORMAT}
- {文件名-p}
但是,当我保存此模板并创建新文档(然后保存)时,字段未更新。LASTSAVEDBY 显示为空白,SAVEDATE 显示 0 XXX 0000,FILENAME 显示 Document1。
我还尝试将其保存为 dotm 模板,以防存在一些隐藏的宏,但结果是一样的。
答案1
所以读Microsoft 的知识库文章给出了令人恼火的答案,这是设计使然,所以你需要编写一个宏来执行此操作。他们提供了一个宏,可以在你打开文件,而不是保存。这实际上对许多字段更有意义,因此只要您使用 LASTSAVEDBY 和 SAVEDATE,这些都会有意义。
请记住,您只有再次打开文档才能看到应用的更新。对于页脚,这完全没问题。
因为这是一个宏,所以您肯定需要将其保存为 dotm。
对于需要在保存时更新字段的人来说,有VBA Express 论坛上的讨论,或者你也可以调整宏微软的文档。
更新 Microsoft 的 vbscript 很好,但会导致文档始终认为已被编辑,因此在关闭时总是提示保存。大多数用户总是会单击此按钮,这会导致 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