[英]VBA Project Password-Protect with SendKeys not Working Correctly
我花了最后兩天的時間來解決這個問題。 我在該主題上找到的大多數內容都無法解決我遇到的問題,因此我希望這里有人可以幫助我。
我一直在研究一些代碼,這些代碼可以從“主記分卡”工作簿中執行以下操作:
Workbook_Open
事件和Workbook_BeforeClose
事件添加到新工作簿中(根據訪問級別將某些工作表設為xlVeryHidden
), 每個計分卡都使用代碼來確保只有名稱在計分卡上的人才能訪問它。 我已經在工作簿事件中使用Environ("username")
來確保安全性,但是眾所周知,如果一個人知道如何運行宏,他/她只能打開VBEditor
並取消隱藏工作簿中的xlVeryHidden
工作表。容易。
因此,我的想法是以編程方式用密碼保護新工作簿的VBAProject
(請參見上文:第五步)。 我在線上找到了一些有關如何使用SendKeys
實現此目標的資源(請參閱下文),但是SendKeys
不夠可靠(充其量),並且與我的代碼不配合。 如果我自己運行該代碼,則它的工作方式就像一個Run Macro:="filename!macroname"
,但是如果我使用Run Macro:="filename!macroname"
從另一個項目中調用它,則不會設置保護。 運行代碼並創建所有工作簿后,先前代碼中的VBAProject
屬性窗口將全部打開,並嘗試同時執行,這會使Excel崩潰。
Sub LockVBAProject()
Const VBAProjectPassword As String = "123"
Dim VBP As VBProject, openWin As VBIDE.Window
Dim wbActive As Workbook
Dim i As Integer
Set wbActive = ActiveWorkbook
Set VBP = wbActive.VBProject
Application.ScreenUpdating = False
' close any code windows to ensure we hit the right project
For Each openWin In VBP.VBE.Windows
If InStr(openWin.Caption, "(") > 0 Then openWin.Close
Next openWin
wbActive.Activate
With Application
'//execute the controls to lock the project\\
.VBE.CommandBars("Menu Bar").Controls("Tools") _
.Controls("VBAProject Properties...").Execute
'//activate 'protection'\\
.SendKeys "^{TAB}"
'//CAUTION: this either checks OR UNchecks the\\
'//"Lock Project for Viewing" checkbox, if it's already\\
'//been locked for viewing, then this will UNlock it\\
.SendKeys "{ }"
'//enter password\\
.SendKeys "{TAB}" & VBAProjectPassword
'//confirm password\\
.SendKeys "{TAB}" & VBAProjectPassword
'//scroll down to OK key\\
.SendKeys "{TAB}"
'//click OK key\\
.SendKeys "{ENTER}"
'the project is now locked - this takes effect
'the very next time the book's opened...
End With
ThisWorkbook.SaveAs Filename:=Sheets(Sheets.Count).Name, FileFormat:=xlOpenXMLWorkbookMacroEnabled
Debug.Print "It Worked " & Now()
End Sub
我不確定為什么會這樣。 就像我說的那樣,代碼單獨運行時效果很好。 我找到了這篇文章 ,其中概述了與非SendKeys
方法的鏈接 ,但是它是幾年前編寫的,由於我從未在VB6中編寫過代碼,因此我不確定出於我的目的需要對其進行修改。 。
關於為什么在代碼已經運行之后而不是在代碼執行期間應該執行的情況下,為什么SendKeys
方法會堆積起來,是否有任何想法? 我應該放棄SendKeys
來支持其他方法嗎? 我很茫然,所以任何幫助將不勝感激!
編輯:我認為代碼不起作用的原因是因為執行SendKeys
代碼時未激活正確的項目。 我曾希望激活適當的工作簿能夠解決此問題,但似乎沒有幫助。
要為原本發布在此處的精美代碼增加一些細微差別:如果您在VBE中更改工作簿的項目名稱,則需要將一行代碼更改為:
.VBE.CommandBars("Menu Bar").Controls("Tools") _
.Controls(VBP.Name & " Properties...").Execute
(嘆)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.