VBA Word:在打开时删除编辑限制,在关闭时再次限制

时间:2017-10-21 10:59:40

标签: vba ms-word

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

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

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

谢谢。

1 个答案:

答案 0 :(得分:0)

不是代码编写服务,但我有点像这样的想法,所以这里;这应该让你有一个良好的开端。

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

注2:如果您打开1个以上的doc,因为只存储了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