Следующая идея тестируется для 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
в вашем Document 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
person
Kazimierz Jawor
schedule
21.01.2014