在工作中,我们使用VBA,目前他们想锁定使用宏生成的报告。
我一直在尝试自动锁定项目(给定密码和工作簿名称),并且部分成功地获得了以下代码块(我在那里找到的混合代码以及在SO中的某些问题) 。可以通过某种方式手动进行操作(先访问vbaprojects属性,然后锁定)。
Sub LockVBAProject(nameWorkbookForMarket As String, pw As String)
With Workbooks(nameWorkbookForMarket).Application
'//execute the controls to lock the project\\
.VBE.CommandBars(1).FindControl(ID:=2578, recursive:=True).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\\
'//enter password (password is 123 in this example)\\
.SendKeys "{ }"
.SendKeys "{TAB}" & pw
'//confirm password\\
.SendKeys "{TAB}" & pw
'//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
End Sub
此代码的问题在于,有时工作得很好,有时却行不通。我对这种“不确定性”行为感到困惑。有人可以阐明这个问题吗?
谢谢!
答案 0 :(得分:1)
包括检查项目是否已经受保护/锁定的检查,如果已被锁定,请勿尝试锁定它
If Workbooks(nameWorkbookForMarket).VBProject.Protection = 1 Then Exit Sub
您还希望确保正确的项目处于活动状态,所以:
Set vbProj = Workbooks(nameWorkbookForMarket).VBProject
Set Application.VBE.ActiveVBProject = vbProj
If vbProj.Protection = 1 Then Exit Sub
' send keys
另一种方法是将报告的过程分为两部分,将代码保存在单独的工作簿中。我认为不寻常的是,将继续创建包含代码的新报告/工作簿。