James为自己的文档添加了书签,以便进行交叉引用。有时,在编辑过程中,他可能需要删除以前添加书签的内容。 James怀疑是否有一种方法可以找出他想删除的文本(和书签)是否存在任何交叉引用。

如果您仅需要偶尔执行一次此任务,则可以手动执行。但是,如何使用它将取决于创建交叉引用的方式。您会看到,当您插入交叉引用时,Word将显示“交叉引用”对话框。 (请参见图1。)

image

图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。