1

下面是我的功能,由于某种原因它不起作用。如果我在最后一个 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
4

2 回答 2

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如果您看不到开发人员选项卡,那么我建议您通过此链接

在此处输入图像描述

单击Sample宏中的宏Macro Dialog Box,您就完成了。

在此处输入图像描述

如果您检查 VBA 编辑器,您会注意到 Book2 的 VBA 编辑器现在已解锁/可访问。

根据您对它的使用,Sendkeys 是不可靠的。如果您正确使用它,那么这非常可靠:)

还有另一种解锁 VBA 密码的方法,但这非常复杂,需要调用 FindWindow 等 API。

于 2012-07-03T08:19:38.027 回答
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 项目,它似乎是唯一的解决方案。

希望能帮助到你!

于 2012-07-03T08:02:07.833 回答