查找对特定书签的交叉引用(Microsoft Word)
James为自己的文档添加了书签,以便进行交叉引用。有时,在编辑过程中,他可能需要删除以前添加书签的内容。 James怀疑是否有一种方法可以找出他想删除的文本(和书签)是否存在任何交叉引用。
如果您仅需要偶尔执行一次此任务,则可以手动执行。但是,如何使用它将取决于创建交叉引用的方式。您会看到,当您插入交叉引用时,Word将显示“交叉引用”对话框。 (请参见图1。)
图1.“交叉引用”对话框。
在对话框中,使用“引用类型”下拉列表,可以选择要创建的交叉引用的类型。每种类型的引用都使用REF字段的不同变体来插入实际的交叉引用。例如,如果您插入对书签的交叉引用,则插入的字段如下所示:
{ REF MyBookmark \h }
“ MyBookmark”部分是您要交叉引用的书签名称。
参数(在本例中为\ h)由“交叉引用”对话框中的“将引用插入到”下拉列表控制。如果您改为在文档中插入对标题的交叉引用,则其外观类似于:
{ REF _Ref47603047 \h }
此域代码的“ _Ref47603047”部分是系统生成的书签,该书签已隐藏。它指的是您为交叉引用选择的标题。如果显示“书签”对话框并单击对话框底部的“隐藏的书签”复选框,则可以看到这些隐藏的书签。
在本技巧中,由于James专门要求查找带有书签的文本的交叉引用,因此我假设他创建交叉引用时,是通过在“交叉”的“将引用插入到”下拉列表中选择“书签”来实现的。 -引用对话框。实际上,这也使查找书签是否在任何地方都被交叉引用变得容易一些。
首先找出要删除的文本中的书签名称。在这种情况下,我将假定它是一个名称,例如MyBookmark。您需要做的就是按Alt + F9,这会使Word在文档中显示域代码,而不是域代码的结果。此时,您只需搜索书签名称(在这种情况下为MyBookmark),就可以找到任何REF字段(请记住,REF字段用于交叉引用)
包含书签名称。如果找不到书签名称,则没有对该书签的交叉引用,因此可以安全地删除文本及其包含的书签。完成后,再次按Alt + F9可关闭域代码的显示。
如果您需要查找是否不时地多次引用了书签,或者要执行比“查找和替换”所提供的功能更完整的搜索,则应考虑使用宏。在这种情况下,以下四个宏集可以派上用场。
Sub IsBookmarkReferenced() Dim aStory As Range Dim aShape As Shape Dim aField As Field Dim bkName As String Dim bReffed As Boolean bReffed = False If Selection.Bookmarks.Count > 0 Then bkName = Selection.Bookmarks(1).Name For Each aStory In ActiveDocument.StoryRanges If TestForBookmark(aStory, bkName) Then bReffed = True Else Select Case aStory.StoryType Case wdMainTextStory, wdEvenPagesHeaderStory, _ wdPrimaryHeaderStory, wdEvenPagesFooterStory, _ wdPrimaryFooterStory, wdFirstPageHeaderStory, _ wdFirstPageFooterStory For Each aShape In aStory.ShapeRange If aShape.TextFrame.HasText Then If TestForBookmark(aShape.TextFrame.TextRange, bkName) Then bReffed = True End If Next End Select Next aStory Endif Next aStory sTemp = "Bookmark " & bkName & " is " If Not bReffed Then sTemp = sTemp & "NOT " sTemp = sTemp & "referenced in the document." Else sTemp = "There is no bookmark in the selected text." End If MsgBox sTemp End Sub
Function TestForBookmark(tRange As Range, bkName As String) As Boolean Dim aField As Field TestForBookmark = True For Each aField In tRange.Fields Select Case aField.Type Case wdFieldRef, wdFieldAsk, wdFieldBarCode, _ wdFieldGoToButton, wdFieldHyperlink, _ wdFieldNoteRef, wdFieldPageRef, wdFieldSet If BookRef(aField.Code.Text, aField.Type) = bkName Then Exit Function Case wdFieldTOC, wdFieldTOA If TOCRef(aField.Code.Text) = bkName Then Exit Function End Select Next aField TestForBookmark = False End Function
Function BookRef(str As String, typeCode As Long) As String Dim s As String Dim i As Long s = Trim(str) If s <> "" Then i = InStr(s, " ") If i > 0 Then s = Trim(Mid(s, i)) If typeCode = wdFieldHyperlink Then If InStr(s, "\l") > 0 Then s = Mid(s, InStr(s, """") + 1) i = InStr(s, """") If i > 1 Then s = Left(s, i - 1) Else s = "" End If Else i = InStr(s, " ") If i > 0 Then s = Trim(Left(s, i)) End If End If BookRef = s End Function
Function TOCRef(str As String) As String Dim s As String Dim i As Long s = Trim(str) i = InStr(s, "\b") If i = 0 Then TOCRef = "" Exit Function End If s = Trim(Mid(s, i + 2)) i = InStr(s, " ") If i > 0 Then s = Left(s, i - 1) TOCRef = s End Function
为了使用宏,您需要做的就是选择要删除的文本,然后运行IsBookmarkReferenced宏。
反过来,它利用其他三个功能来确定是否在其他位置引用了所选文本中的任何书签。宏不仅会检查主文档本身中的字段,还会检查页眉,页脚和文本框中的字段。
_WordTips_是您进行经济有效的Microsoft Word培训的来源。
(Microsoft Word是世界上最流行的文字处理软件。)本技巧(7619)适用于Microsoft Word 2007、2010、2013、2016、2019和Office 365中的Word。