我在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
答案 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