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

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

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

В общем, мне интересно, как я могу запретить пользователям редактировать мои закладки в текстовом документе.

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

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

РЕДАКТИРОВАТЬ:

Читал разные форумы и наткнулся на это.

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

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

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

РЕДАКТИРОВАТЬ: офис 2007/2010.


person Mana    schedule 16.01.2014    source источник


Ответы (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 в вашем 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
comment
Спасибо за ваш ответ, нужно будет проверить это на днях. Но вернется к вам. - person Mana; 22.01.2014
comment
Я собираюсь использовать ваше решение, так как оно очень подробное, и я узнаю часть кода, и оно выглядит многообещающе. Я чувствую, что это сработает. Не было до сегодняшнего дня, чтобы проверить вещи. - person Mana; 28.01.2014
comment
Я не уверен, что нужны закладки и элементы управления контентом. Если бы код можно было изменить, чтобы обновить содержимое элемента управления содержимым вместо содержимого закладки. Элементы управления содержимым также могут быть сопоставлены с пользовательским XML, что может привести к дополнительным возможностям для манипулирования кодом. - person robartsd; 08.08.2014

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

'whole document readonly
ThisDocument.Protect Password:="password", NoReset:=False, Type:=wdAllowReadOnly

or

'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

or

ThisDocument.Bookmarks("myBookmark").Range.Editors.Add "[email protected]"
person Manuel Allenspach    schedule 27.01.2014
comment
Ваша первая часть не то, что мне нужно, хотя когда-нибудь она может пригодиться. Ваша вторая часть выглядит многообещающе. Прямо сейчас тестирую, какое решение подходит для моей проблемы. - person Mana; 28.01.2014
comment
не могу заблокировать мои закладки с вашим решением. Закладки по-прежнему доступны для редактирования. ваш второй альтернативный метод дает мне ошибку времени выполнения 5941 - person Mana; 28.01.2014
comment
Вы использовали wdAllowReadOnly? - person Manuel Allenspach; 28.01.2014