2012-07-03 66 views
1

下面是我的功能,由於某些原因,它不起作用。如果我在最後一條if語句中放置一個斷點並刪除發送「%{F11}」,它確實有效。所以我的猜測是「%F11」不起作用。有人有想法嗎?我無法用VBA解鎖vbaproject

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 
+1

1)改變' vbext_pp_locked'到'1' 2)從一個宏中調用上面的子宏,它是從宏工具欄中調用的,而不是從VBA編輯器調用的,它將起作用。我只是測試它,它的工作原理 –

+0

謝謝,你是什麼意思與Nr 2,即時通訊新的VBA所以請多解釋一下:) – Merni

+0

你使用哪個Excel版本? –

回答

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編輯器,您會注意到它受密碼保護。您還會注意到它是活動工作簿。通過點擊View Tab | Switch Workbooks | Book1

enter image description here

現在在Developer tab | Macros單擊如果您看不到開發工具選項卡,然後我會建議通過這個link去激活Book1

enter image description here

點擊在Macro Dialog Box的的Sample宏和你做。

enter image description here

如果檢查VBA編輯器,你會發現,在VBA編輯器第二冊,現在被解鎖/訪問。

根據您的使用情況,Sendkeys不可靠。如果你正確地使用它則是非常可靠的:)

有解鎖VBA密碼另一種方式,但是這是非常複雜的,涉及調用像FindWindow函數等的API ...

+0

謝謝你,我真的很感激它 – Merni

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項目,它似乎是唯一的解決方案。

希望它能幫助!