【问题标题】:VBA Word: remove editing restriction at opening and restrict again when closingVBA Word:打开时删除编辑限制,关闭时再次限制
【发布时间】:2017-10-22 18:56:07
【问题描述】:

是否可以设置一个宏,每次打开word文档时都会触发并检查它是否有编辑限制。如果是这样,请尝试从密码列表(硬编码)中输入密码。如果一个密码成功了,把它保存在内存中,取消限制,然后在我关闭文档时重新应用限制。

这样,如果我总是对我使用和限制的文档使用相同的密码,我可以在我的计算机上打开它们,就像没有限制一样,但限制仍然适用于其他用户。

注意:Private Sub Document_Open() 中的宏只需要在我从我的计算机上打开的所有文档上触发。文档必须是 .docx 而不是 .docm。

谢谢。

【问题讨论】:

    标签: vba ms-word


    【解决方案1】:

    不是代码编写服务,但我有点喜欢这个想法,所以就这样吧;这应该让您有一个良好的开端。

    注意 1:您需要将其放入 .dotm 文件中,并最终在您的 PC (google) 上另存为全局模板。

    注意 2:如果您打开超过 1 个文档,这将失败,因为只存储了 1 个密码 - 您可以将密码写为文档属性(您可以在保存和重新锁定之前检索并删除它)。

    取决于您是否愿意将代码添加到 Normal.dotm 模板(我个人不喜欢)将影响您如何执行此操作。

    如果不使用 Normal.dotm,那么您将需要设置一个全局模板并通过创建您自己的应用程序事件来触发代码,如下所述:https://wordmvp.com/FAQs/MacrosVBA/PseudoAutoMacros.htm

    如果使用 Normal.dotm 则在 ThisDocument 添加:

    Private Sub Document_Open()
        MsgBox ActiveDocument.Name
        Dim oDoc As Object
        Set oDoc = ActiveDocument
        unlocker oDoc
    End Sub
    

    并且(用于测试)在常规模块中添加以下内容(稍后您可能希望将其拆分为单独的代码单元):

    Sub unlocker(ByVal docToUnlock As Document)
        If Not docToUnlock.Type = wdTypeDocument Then
            ' this is a template, don't try anything
            MsgBox "Not a doc"
            GoTo endOfSub
            Else
            MsgBox "Is a doc"
        End If
    
    
        Dim passWords() As String
        passWords = Split("pw1,pw2,pw3", ",")
    
        Dim iLoop As Long
        iLoop = LBound(passWords)
    
        On Error GoTo err_Test:
    
        Do While Not ActiveDocument.ProtectionType = wdNoProtection
            If iLoop > UBound(passWords) Then Exit Do
    
            oldpassword = passWords(iLoop)
    
            ActiveDocument.Unprotect oldpassword
            iLoop = iLoop + 1
        Loop
    
        If Not ActiveDocument.ProtectionType = wdNoProtection Then
            ' unable to unlock document, quit
            oldpassword = vbNullString
            MsgBox "Failed to Unlock"
            GoTo endOfSub
        Else
            MsgBox "Unlocked"
        End If
    
        ' Do Stuff
    
        If Not oldpassword = vbNullString Then
            ActiveDocument.Protect wdAllowOnlyReading, Password:=oldpassword
        End If
    
    endOfSub:
        Exit Sub
    
    err_Test:
        If Err.Number = 5485 Then
            ' ignore error due to wrong password
            Err.Clear
            Resume Next
        Else
            ' handle unexpected error
        End If
    
    End Sub
    

    【讨论】:

    • 亲爱的SlowLearner,感谢您的回答。我将此代码放在 Normal.dotm 的 ThisDocument 中。我可以看到现在可以从所有 .docx 文档中访问此代码。我使用 word 2016。打开受限文档时,我必须单击查看、编辑文档。 Private Sub Document_Open() 不触发。如果我进入 vba 编辑器并按 F5,则 sub 可以正常工作并按预期删除保护。缺少什么?
    • 所以它适用于受保护的文档,但不适用于在受保护的视图中打开的文档(即从网络下载或打开?
    • 我在桌面上创建了 2 个新文档。第一个没有限制,第二个有限制。 Private Sub Document_Open() 仅在我打开不受限制的文档时触发。我还尝试在 Normal.dotm 的单独模块中创建Private Sub AutoExec()。它也没有触发。
    • 好的,我已经对代码进行了一些更改(如果您愿意,可以查看问题编辑历史以查看更改),基本上添加了消息框并更改了文档传递的方式 - 现在作为对象传递。已经用 Normal.dotm 进行了测试,似乎对我有用。请测试并告诉我:)
    • 当我打开不受限制的文档时,我看到了所有的 msgbox,但是当我打开受限制的文档时它仍然没有触发。在 Word 2016 中打开受限文档时,我可以看到文档内容,但无法对其进行编辑,并且功能区无法加载。只有文件、工具和视图可用。我需要单击查看,然后单击编辑文档才能打开文档并查看加载的功能区。可能是word 2016的问题?
    猜你喜欢
    • 1970-01-01
    • 2014-02-05
    • 2019-08-31
    • 2014-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多