Ответ 1
Следующая идея тестируется на 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
2-й шаг. Мы будем контролировать одно событие: Document_ContentControlOnEnter
. Перейдите в модуль ThisDocument
в документе VBAProject и создайте следующее событие (см. Некоторые комментарии внутри кода):
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. В этой ситуации вам нужен только 1-й шаг и следующий подраздел:
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