繁体   English   中英

限制/锁定书签,以防止在单词中进行编辑

[英]Restrict/Lock bookmarks from editing in word

我有很多带有很多书签的Word文档。 我使用VBA代码通过数据库中的数据更改这些书签。

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

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

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

预先感谢您的答复。

编辑:

我在不同的论坛上阅读,发现了这一点,

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

我想要哪种。 但无法实现/将其转换为VBA代码。 有人还能看到我可能如何使用它吗?

再次感谢。

编辑:Office 2007/2010。

以下想法已针对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 转到文档VBAProject中的ThisDocument模块并创建以下事件(请参见代码内的一些注释):

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内容保护的每个书签中。 在这种情况下,您只需要第一步和以下子步骤:

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还有更多可能的组合。如果需要任何初始测试,以下代码可让您删除所有抄送:

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" 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM