Denise正在开发一个宏,她需要测试以查看插入点是否位于书签中。她需要知道这一点,因为如果插入点在书签中,则需要让代码修改书签。如果它不在书签中,则她的代码需要创建一个。

从理论上讲,该过程非常简单。您所需要做的就是以这种方式查看所选内容中有多少个书签:

If Selection.Bookmarks.Count > 0 Then     ' Inside a bookmark End If

无论选择内容是文本范围还是选择内容折叠到插入点,这都有效。但是,有几个潜在的“陷阱”要注意。第一个是如果插入点紧靠书签的左侧(仅触摸书签的开头),则Count属性仍将大于0。这是因为由折叠的插入点定义的Selection为被认为包括在插入点右边的字符。

要注意的第二件事是,如果您的选择被折叠,则不能依赖Count属性为0或1。实际上,它可以大于1,因为书签可能会“重叠”。 |||因此,插入点必须同时在一个以上的书签中。因此,您可能需要代码来测试插入点位于哪个书签中。最简单的方法是通过以下方式检查书签的Name属性:

Dim bFoundIt As Boolean Dim J As Integer

bFoundIt = False Selection.Collapse If Selection.Bookmarks.Count > 0 Then     ' Inside a bookmark     For J = 1 To Selection.Bookmarks.Count         If Selection.Bookmarks(J).Name = "DesiredName" Then             bFoundIt = True         End If     Next J End If

执行此代码时,仅当插入点在所需书签内时bFoundIt才会为True。还要注意,包含了一个折叠选择的命令,以确保选择确实位于插入点而不是所选文本的范围内。

第三个潜在的“陷阱”是Word实际上出于多种目的在内部使用书签。例如,它使用它们来定义打印范围,但这不是唯一的地方。但是,可以检测到系统定义的书签,因为它们始终以下划线开头。尽管在上述代码中这不是问题(因为您专门在寻找具有特定名称的书签),但是如果您的代码正在寻找任何书签,则可能是一个潜在问题。以下代码作为可调用函数编写,在这种情况下可能会有所帮助。

Function InBookmark() As Boolean     ' Returns True if the insertion point is inside     ' any non-system bookmark. Also collapses the     ' selection to an insertion point

Dim bFoundIt As Boolean     Dim J As Integer

bFoundIt = False     Selection.Collapse

For J = 1 To Selection.Bookmarks.Count         If Left(Selection.Bookmarks(J).Name) <> "_" Then             bFoundIt = True         End If     Next J

InBookmark = bFoundIt End Function

要在宏中使用此功能,可以使用以下简单的命令:

If Not InBookmark Then     ' create new bookmark End If

注意:

如果您想知道如何使用此页面(或_WordTips_网站上的任何其他页面)上描述的宏,我准备了一个包含有用信息的特殊页面。

链接:/ wordribbon-WordTipsMacros [点击此处在新的浏览器标签中打开该特殊页面]。

_WordTips_是您进行经济有效的Microsoft Word培训的来源。

(Microsoft Word是世界上最流行的文字处理软件。)本技巧(6905)适用于Microsoft Word 2007、2010、2013和2016。