Word VBA仅在页脚中运行操作,而不是在其他任何位置

时间:2016-03-30 15:42:59

标签: vba ms-word word-vba footer

以下代码是更大工作的一部分(除了这部分外,它完全按照我想要的方式工作)。 我在页脚中有一个带有文档名称的字段,这会将.doc / .docx放在最后。 问题在于,该代码似乎还使用文档的名称更新文档正文中的任何链接。如果文档中的链接是www.google.co.uk,则此宏会将文档上的链接更改为文档名称 - 我希望这只发生在页脚中。

请告知如何获取此代码?我尝试了一些不同的东西,但都没有。

        oldFilename = wdDocTgt.Name
         If Right(oldFilename, 5) = ".docx" Then
        oldFilename = Left(oldFilename, Len(oldFilename) - 5)
        ElseIf Right(oldFilename, 4) = ".doc" Then
        oldFilename = Left(oldFilename, Len(oldFilename) - 4)
 '       MsgBox (oldFilename)   'UNCOMMENT TO TEST

            'Updates all fields in the target document with the file name
 For Each aStory In wdDocTgt.StoryRanges
    For Each aField In aStory.Fields
    aField.Result.Text = oldFilename
        Next aField
        Next aStory

1 个答案:

答案 0 :(得分:1)

您的代码存在的问题是它正在处理文档的所有部分 - 您不需要这些部分。你只想要页脚。 Word文档可以有多个页脚,具体取决于文档的部分数量以及部分中的页脚是否与之前的部分取消链接。因此,如果您想要检查所有页脚,则需要循环所有部分,例如

Dim sec as Word.Section
Dim rngFooter as Word.Range
For each sec in ActiveDocument.Sections
  Set rngFooter = sec.Footers(wdHeaderFooterPrimary).Range
  For each field in rngFooter.Fields
    aField.Result.Text = oldFilename
  Next field
Next sec

但请记住,这将解决页脚中的所有字段,因此最终会影响您可能拥有的任何页码或日期......

您正在使用的方法存在另一个问题:字段代码会更新,而当它们执行时,您写入代码的任何内容都会丢失,就像您在代码中所做的那样。因此,当您打印此文档或其他某些操作触发域代码更新时,您可能会感到非常不愉快。

由于您不依赖于字段代码来自动生成文档名称,因此请勿使用字段代码(无论它是什么)。删除字段代码并使用书签。然后,您可以将文档名称分配给书签,如下所示:

Dim rngBkm as Word.Range
Dim sBkmName as String
sBkmName = "DocName"
If ActiveDocument.Bookmarks.Exists(sBkmName) Then
  Set rngBkm = ActiveDocument.Bookmarks(sBkmName)
  rngBkm.Text = oldFileName
  'Assigning the text deletes the bookmark, so add it back
  ActiveDocument.Bookmarks.Add sBkmName, rngBkm
End If

注意:我不建议你使用评论中的建议打开页脚 - 不需要实际打开它,最好不要打开。