带有自动更新字段的 Word 2010 模板

dun*_*nxd 2 templates microsoft-word-2010

我想为我的团队创建一个 Word 2010 模板,以确保每个页面都包含一个显示以下信息的页脚:

  • 谁最后保存了文件
  • 上次保存文件的时间
  • 存储文件的路径和文件名

因此,我创建了一个包含以下字段代码的页脚的模板文件 (dotx):

  • {LASTSAVEDBY *Caps *MERGEFORMAT}
  • {SAVEDATE \@ "d MMM yyy" *MERGEFORMAT}
  • {文件名 -p}

但是,当我保存此模板并创建新文档(然后保存)时,字段不会更新。LASTSAVEDBY 显示为空白,SAVEDATE 显示 0 XXX 0000,FILENAME 显示 Document1。

我也试过将它保存为 dotm 模板,以防有一些隐藏的宏,但结果是一样的。

dun*_*nxd 5

因此,阅读Microsoft 的 KnowledegeBase 文章对此给出了令人气愤的答案,即这是设计使然,因此您需要编写一个宏来执行此操作。他们很方便地提供了一个宏,可以在您打开文件时更新字段,而不是保存。这实际上对许多字段更有意义,因此只要您使用 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
Run Code Online (Sandbox Code Playgroud)

更新 上面的代码工作正常,除非您将其保存到您的 Normal.dotm 模板,在这种情况下,它会在您每次打开任何文档时运行。如果文档在受保护的视图中打开(即它是从 Internet 下载的或作为电子邮件附件提供的),则 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
Run Code Online (Sandbox Code Playgroud)