下面是我的功能,由于某种原因它不起作用。如果我在最后一个if语句中放置一个断点并删除发送“%{F11}”它确实有效。所以我的猜测是“%F11”无效。有没有人有想法?
Sub UnprotecPassword(wb As Workbook, ByVal projectPassword As String)
Dim currentActiveWb As Workbook
If wb.VBProject.Protection <> vbext_pp_locked Then
Exit Sub
End If
Set currentActiveWb = ActiveWorkbook
wb.Activate
SendKeys "%{F11}"
SendKeys "^r" ' Set focus to Explorer
SendKeys "{TAB}" ' Tab to locked project
SendKeys "~" ' Enter
SendKeys projectPassword
SendKeys "~" ' Enter
If (wb.VBProject.Protection = vbext_pp_locked) Then
MsgBox ("failed to unlock")
End If
currentActiveWb.Activate
End Sub
答案 0 :(得分:3)
为了测试这个,让我们创建一个名为Book2.xlsm
的新工作簿。
用于测试目的将此代码粘贴到Book2模块中。
Sub Book2Macro()
End Sub
使用密码说a
保护它,然后将其关闭。这对于锁定生效是必要的。
现在创建一个新的工作簿,说Book1,然后在模块中粘贴此代码。
Sub Sample()
UnprotecPassword Workbooks("Book2.xlsm"), "a"
End Sub
Sub UnprotecPassword(wb As Workbook, ByVal projectPassword As String)
Dim currentActiveWb As Workbook
If wb.VBProject.Protection <> 1 Then
Exit Sub
End If
Set currentActiveWb = ActiveWorkbook
wb.Activate
SendKeys "%{F11}"
SendKeys "^r" ' Set focus to Explorer
SendKeys "{TAB}" ' Tab to locked project
SendKeys "~" ' Enter
SendKeys projectPassword
SendKeys "~" ' Enter
If (wb.VBProject.Protection = vbext_pp_locked) Then
MsgBox ("failed to unlock")
End If
currentActiveWb.Activate
End Sub
现在打开我们创建的第一个工作簿; Book2.xlsm。检查Book2的VBA编辑器,您会发现它受密码保护。您还会注意到它是活动工作簿。点击Book1
View Tab | Switch Workbooks | Book1
现在点击Developer tab | Macros
如果您看不到开发人员标签,那么我建议您浏览link。
点击Sample
中的Macro Dialog Box
宏,您就完成了。
如果您检查VBA编辑器,您会注意到Book2的VBA编辑器现在已解锁/可访问。
Sendkeys根据您的使用情况而不可靠。如果你正确使用它那么非常可靠:)
还有一种解锁VBA密码的方法,但这非常复杂,涉及调用FindWindow等API ...
答案 1 :(得分:0)
查看这些帖子以获取代码示例:
http://www.mrexcel.com/archive/VBA/29825.html
http://www.vbaexpress.com/forum/showthread.php?t=30687
这些帖子仅供参考:
http://www.excelforum.com/excel-programming/490883-why-doesnt-sendkeys-work-consistently.html
http://www.ozgrid.com/forum/showthread.php?t=13006
他们讨论了为什么在多任务处理环境中使用Sendkeys不是很可靠,许多人不鼓励将其用于商业目的。 但是,对于取消保护VBA项目,它似乎是唯一的解决方案。
希望它有所帮助!