在VBA中以编程方式锁定项目

时间:2018-11-15 16:16:59

标签: excel vba excel-vba

在工作中,我们使用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

此代码的问题在于,有时工作得很好,有时却行不通。我对这种“不确定性”行为感到困惑。有人可以阐明这个问题吗?

谢谢!

1 个答案:

答案 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

另一种方法是将报告的过程分为两部分,将代码保存在单独的工作簿中。我认为不寻常的是,将继续创建包含代码的新报告/工作簿。