限制/锁定书签以进行单词编辑

问题描述 投票:13回答:2

我有很多带有大量书签的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代码。有人也可以看到我可以使用它吗?

再次感谢。

编辑:office 2007/2010。

vba ms-word word-vba bookmarks restriction
2个回答
13
投票

针对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模块并创建以下事件(请参阅代码中的一些注释):

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

4
投票

使用保护您的整个文档

'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 (not tested)

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

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

要么

ThisDocument.Bookmarks("myBookmark").Range.Editors.Add "[email protected]"
© www.soinside.com 2019 - 2024. All rights reserved.