2014-01-16 2 views
12

У меня есть много словный документ с большим количеством закладок. Я использую код 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: офис 2007/2010.

ответ

12

Следующая идея проверяется на 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 
+0

Спасибо за ваш ответ, придется проверить это на другой день. Но вернусь к тебе. – Mana

+0

+1 очень хороший ответ KazJaw –

+0

Я собираюсь для вашего решения с самого его подробностей, и я узнаю выделение кода, и это выглядит многообещающим. Я чувствую, что это сработает. Не было до сегодняшнего дня, чтобы проверить вещи. – Mana

3

Защитите весь документ с помощью

'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]" 
+0

Ваша первая часть не то, что я хочу, даже если она может пригодиться когда-нибудь. Ваша вторая часть выглядит многообещающей. Тестирование прямо сейчас, какое решение соответствует моей проблеме. – Mana

+0

Невозможно заблокировать свои закладки своим решением. Закладки по-прежнему доступны для редактирования. ваш второй альтернативный метод дает мне ошибку времени выполнения 5941 – Mana

+0

Используете ли вы 'wdAllowReadOnly'? – Manu

Смежные вопросы