以下想法已针对 Word 2010 进行了测试。它应该也适用于 2007 年和 2013 年,但不适用于 2003 年。
我建议将ContentControls(在文中进一步称为CC)与Bookmarks 一起使用。接下来,您将需要控制一个事件,该事件将检查用户是否在任何ContentControl 内进行选择。如果是这样,我们将显示消息和/或将选择移到保护区之外。
第 1 步。您的每个书签都应包含在 RichText ContentControl 中。您可以为选定的书签手动执行此操作,也可以运行以下简单代码为活动文档中的所有书签执行此操作。
(重要假设!您的文档中没有任何其他ContentControls!)
Sub Add_Bookmark_CC()
Dim bookM As Bookmark
For Each bookM In ActiveDocument.Bookmarks
ActiveDocument.ContentControls.add wdContentControlRichText, bookM.Range
Next
End Sub
第二步。我们将控制一个事件:Document_ContentControlOnEnter。转到 Document VBAProject 中的ThisDocument 模块并创建以下事件(请参阅代码中的一些 cmets):
Private Sub Document_ContentControlOnEnter(ByVal ContentControl As ContentControl)
Debug.Print Now, ContentControl.Range.Bookmarks.Count
If ContentControl.Range.Bookmarks.Count > 0 Then
'Optional message box for user
MsgBox "There is bookmark inside this area which you should not change. " & _
vbNewLine & "You will be moved out of this range"
'optionam selection change right after CC area
Dim newPos As Long
newPos = ContentControl.Range.End + 2
ActiveDocument.Range(newPos, newPos).Select
End If
End Sub
第 1 步和第 2 步的替代方案。如果您不想使用 CC 事件,您可以将 CC 添加到每个带有 CC 内容保护的书签。在这种情况下,您只需要第一步和以下子:
Sub Add_Bookmark_CC_Protected()
Dim bookM As Bookmark
Dim CC As ContentControl
For Each bookM In ActiveDocument.Bookmarks
Set CC = ActiveDocument.ContentControls.add(wdContentControlRichText, bookM.Range)
CC.LockContents = True
Next
End Sub
最终!如您所见,第 1 步和第 2 步还有更多可能的组合。
如果您需要任何初始测试,以下代码允许您删除所有 CC:
Sub Remove_All_CC()
Dim CC As ContentControl
For Each CC In ActiveDocument.ContentControls
CC.Delete
Next CC
End Sub