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

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

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

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

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

Заранее благодарим за ваш ответ.

EDIT:

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

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

Какой вид делает то, что я хочу. но не смог реализовать/преобразовать его в код VBA. Может ли кто-то увидеть, как я могу его использовать?

Еще раз спасибо.

EDIT: office 2007/2010.

Ответ 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

Ответ 2

Защитите весь документ, используя

'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


Alternative (не проверено)

не защищайте весь документ, просто ограничьте закладки, которые вы хотите заблокировать.

ThisDocument.Bookmarks("myBookmark").Range.Editors.Add wdEditorOwners

или

ThisDocument.Bookmarks("myBookmark").Range.Editors.Add "[email protected]"