2014-01-16 162 views
12

我有许多word文档有很多书签。 我使用VBA代码来更改这些书签与来自数据库的数据。限制/锁定书签在word中的编辑

问题是,有时用户需要编辑这些文档,而且他们往往会意外删除/更改我的书签,导致VBA代码无法识别书签。

所以基本上,我想知道的是我如何限制用户在Word文档中编辑我的书签。

我不需要一个超级安全的解决方案,只需足够的保护,以便用户知道,“我不应该触摸这部分”。

预先感谢您的回答..

编辑:

我在读不同的论坛和跨越这来了,

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

哪种类型的做什么,我想。但无法实现/将其转换为VBA代码。有人可以看到我可以使用它吗?

再次感谢。

编辑:办公室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 

第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 

替代了一步第一和第二。如果您不想使用CC事件,则可以将CC添加到具有CC内容保护的每个书签。在这种情况下,你只需要第一步和下面的子:

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 
+0

书签感谢您的回答,将不得不在今天进行测试。但会回来给你。 – Mana

+0

+1非常好的答案KazJaw – 2014-01-23 12:33:02

+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 


替代 (未测试)

不保护你的整个文件,只限制要锁定

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

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

你的第一部分不是我想要的,尽管它有一天可能会派上用场。你的第二部分前景看好。现在测试哪个解决方案适合我的问题。 – Mana

+0

无法锁定我的书签和解决方案。书签仍然可编辑。你的第二个替代方法给我一个运行时错误5941 – Mana

+0

你用过'wdAllowReadOnly'吗? – Manu