是否可以设置一个宏,每次打开word文档时都会触发,并检查它是否有编辑限制。如果是这样,请从密码列表中尝试密码(硬编码)。如果一个密码成功,请将其保留在内存中,删除限制,并在关闭文档时重新应用限制。
通过这种方式,如果我总是对我使用和限制的文档使用相同的密码,我可以在我的计算机上打开它们,就像没有限制一样,但限制仍然适用于其他用户。
注意:Private Sub Document_Open()中的宏需要触发我只从计算机打开的所有文档。文档必须是.docx而不是.docm。
谢谢。
答案 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