Ограничить / заблокировать редактирование закладок в word

У меня есть много документов word с большим количеством закладок. Я использую код VBA для изменения этих закладок с данными из БД.

проблема в том, что иногда пользователям нужно редактировать эти документы, и они, как правило, случайно удаляют/изменяют мои закладки, что приводит к тому, что код VBA больше не распознает закладку.

Итак, в основном, мне интересно, как я могу ограничить пользователей от редактирования моих закладок в документе word.

Мне не нужен супер безопасное решение, достаточно защиты, чтобы пользователь знал, что "я не должен касаться этой части".

заранее спасибо за ваш ответ..

EDIT:

Я читал на разных форумах, и наткнулся на это,

http://social.msdn.microsoft.com/Forums/office/en-US/f70ca604-bbdb-4b5a-8363-f9e126105e91/writeprotection-of-bookmarks-in-word?forum=vsto

какой вид делает то, что я хочу. но не смог реализовать / преобразовать его в код 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"