【问题标题】:Restrict/Lock bookmarks from editing in word限制/锁定书签在 word 中编辑
【发布时间】:2014-02-05 11:35:30
【问题描述】:

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

问题是,有时用户需要编辑这些文档,他们往往会不小心删除/更改我的书签,从而导致 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。

【问题讨论】:

    标签: vba ms-word bookmarks restriction


    【解决方案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
    

    第二步。我们将控制一个事件:Document_ContentControlOnEnter。转到 Document VBAProject 中的ThisDocument 模块并创建以下事件(请参阅代码中的一些 cmets):

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

    Sub Remove_All_CC()
    
        Dim CC As ContentControl
        For Each CC In ActiveDocument.ContentControls
            CC.Delete
        Next CC
    End Sub
    

    【讨论】:

    • 感谢您的回答,改天测试一下。但会回到你身边。
    • 我正在寻找您的解决方案,因为它非常详细,而且我认识到代码的分配,而且看起来很有希望。我觉得它会起作用。今天之前还没有测试过的东西。
    • 我不确定是否需要书签和内容控件。如果可以更改代码以更新内容控件的内容而不是书签的内容。内容控件也可以映射到自定义 XML,这可能导致代码操作的更多选项。
    【解决方案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
    


    另类 (未测试)

    不要保护您的整个文档,只需限制要锁定的书签

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

    ThisDocument.Bookmarks("myBookmark").Range.Editors.Add "abc@test.com"
    

    【讨论】:

    • 你的第一部分不是我想要的,即使有一天它可能会派上用场。你的第二部分看起来很有希望。现在测试哪种解​​决方案适合我的问题。
    • 无法用您的解决方案锁定我的书签。书签仍可编辑。你的第二种替代方法给了我一个运行时错误 5941
    • 你用过wdAllowReadOnly吗?
    猜你喜欢
    • 1970-01-01
    • 2016-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-19
    • 2015-07-13
    相关资源
    最近更新 更多