Следующая идея проверяется на 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
. Перейти к 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
Final! Как вы можете видеть, что есть еще некоторые возможные комбинации шагов 1 и 2. Следующий код позволяет удалить все CC, если вам нужно для любых начальных испытаний:
Sub Remove_All_CC()
Dim CC As ContentControl
For Each CC In ActiveDocument.ContentControls
CC.Delete
Next CC
End Sub
Спасибо за ваш ответ, придется проверить это на другой день. Но вернусь к тебе. – Mana
+1 очень хороший ответ KazJaw –
Я собираюсь для вашего решения с самого его подробностей, и я узнаю выделение кода, и это выглядит многообещающим. Я чувствую, что это сработает. Не было до сегодняшнего дня, чтобы проверить вещи. – Mana