[英]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.