Ограничить / заблокировать редактирование закладок в word
У меня есть много документов word с большим количеством закладок. Я использую код VBA для изменения этих закладок с данными из БД.
проблема в том, что иногда пользователям нужно редактировать эти документы, и они, как правило, случайно удаляют/изменяют мои закладки, что приводит к тому, что код VBA больше не распознает закладку.
Итак, в основном, мне интересно, как я могу ограничить пользователей от редактирования моих закладок в документе word.
Мне не нужен супер безопасное решение, достаточно защиты, чтобы пользователь знал, что "я не должен касаться этой части".
заранее спасибо за ваш ответ..
EDIT:
Я читал на разных форумах, и наткнулся на это,
какой вид делает то, что я хочу. но не смог реализовать / преобразовать его в код VBA. Может кто-нибудь также увидеть, как я могу его использовать?
еще раз спасибо.
изменить: office 2007 / 2010.
2 ответов
следующая идея протестирована для 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
защитите весь документ с помощью
'whole document readonly
ThisDocument.Protect Password:="password", NoReset:=False, Type:=wdAllowReadOnly
или
'only write in form fields (can't delete them, just fill them out)
ThisDocument.Protect Password:="mypassword", NoReset:=False, Type:=wdAllowOnlyFormFields
а теперь дайте некоторые части документа бесплатно для редактирования:
ThisDocument.Bookmarks("myBookmark").Range.Editors.Add wdEditorEveryone
Selection.Range.Editors.Add wdEditorEveryone
альтернатива (не тестировать)
Не защищайте весь документ, просто ограничьте закладки, которые вы хотите заблокировать
ThisDocument.Bookmarks("myBookmark").Range.Editors.Add wdEditorOwners
или
ThisDocument.Bookmarks("myBookmark").Range.Editors.Add "abc@test.com"