在Word中用尾注文本替换参考

时间:2018-06-24 14:45:57

标签: vba reference ms-word

我在Word中有一个文本,其中包含对尾注的引用(1,2,3,...)。通过交叉引用创建的同一个尾注有多个引用(例如,多个1)。

我想用尾注文本替换所有参考。

在互联网上,我找到了可以做到这一点的代码。问题是,如果对同一个尾注有多个引用,则仅位置在文档中第一个的引用将被替换为文本(例如,仅第一个1,其他的不替换)。

我需要帮助,以适当的尾注文本替换所有参考。

Sub endnotes2()
  Dim Note As Endnote
  Dim NoteReference As String
  Dim NoteText As String

  For Each Note In ActiveDocument.Endnotes
    With Note
      NoteText = .Range.Text
      NoteReference = .Index
      Call Selection.SetRange(.Reference.End, .Reference.End)
      Selection.Font.Superscript = True
      Selection.TypeText (NoteText)
      Selection.Font.Superscript = False
    End With
  Next Note

  Do While ActiveDocument.Endnotes.Count > 0
    Call ActiveDocument.Endnotes(1).Delete
  Loop

 Selection.Find.ClearFormatting
  Selection.Find.Font.Superscript = True
  Selection.Find.Replacement.ClearFormatting
  Selection.Find.Replacement.Font.Superscript = False
  With Selection.Find
    .Text = ""
    .Replacement.Text = " (^&)" 'The ^& here refers to the "found text", so if we found "abc" we will replace it with "(abc)"
    .Forward = True
    .Wrap = wdFindContinue
    .Format = True
    .MatchCase = False
    .MatchWholeWord = False
    .MatchWildcards = False
    .MatchSoundsLike = False
    .MatchAllWordForms = False
  End With
  Selection.Find.Execute Replace:=wdReplaceAll
End Sub

1 个答案:

答案 0 :(得分:0)

以下在我的简单测试中对我有用。

由于默认情况下对尾注的交叉引用不使用上标,因此搜索上标不是一个可靠的标准。另外,其他事物也可以被上标。交叉引用由Word使用 Ref字段进行管理,当使用Insert cross-reference命令时,这些交叉引用指向放置在尾注引用中的书签。 。

此类书签以_Ref开头,后跟一个长数字。尾注字段使用名称NoteRef。因此,获取尾注引用的书签名称(可以有多个)是有意义的,检查它们是否使用_Ref模式命名,然后搜索文档以使用书签)。

为了“查找”域代码,使用模式^d。因此,搜索词是,然后是域代码的名称(NoteRef)和书签名称。如果搜索成功,则将删除域代码,并将尾注文本写入此位置。然后搜索从此点继续到文档末尾。

因此,代码循环遍历所有尾注,获取每个人的引用,获取其所有书签,循环书签,检查名称(如上所述)并搜索NoteRef字段(如上所述)。

最后,将原始尾注引用替换为尾注文本。

Sub WriteEndNoteToAllEndNoteRefs()
    Dim sEndNoteText As String
    Dim rngEndNoteRef As Word.Range, rngSearch As Word.Range
    Dim doc As Word.Document
    Dim en As Word.Endnote
    Dim bkm As Word.Bookmark
    Dim bFound As Boolean

    Set doc = ActiveDocument
    For Each en In doc.Endnotes
        Set rngEndNoteRef = en.Reference
        sEndNoteText = en.Range.Text
        For Each bkm In rngEndNoteRef.Bookmarks
             If Left(bkm.Name, 4) = "_Ref" Then
                Set rngSearch = doc.content
                rngSearch.TextRetrievalMode.IncludeFieldCodes = True
                Do
                    With rngSearch.Find
                        .Text = "^d NoteRef " & bkm.Name
                        .wrap = wdFindStop
                        bFound = .Execute
                        If bFound Then
                            rngSearch.Fields(1).Delete
                            rngSearch.Text = sEndNoteText
                            rngSearch.End = doc.content.End
                        End If
                    End With
                Loop While bFound
             End If
        Next
        rngEndNoteRef = sEndNoteText
    Next

End Sub