最近两天我一直在解决这个问题。我在这个主题上找到的大部分内容都没有解决我遇到的问题,所以我希望这里有人可以帮助我。
我一直在研究一些从“主记分卡”工作簿中执行以下操作的代码:
- 获取工作簿中的每个“学生”工作表并将工作表复制到新工作簿中,
- 对新工作簿进行一些小的操作,
- 将代码模块导入新工作簿,
- 向新工作簿添加一个
Workbook_Open
事件和一个事件(根据访问级别制作某些工作表),Workbook_BeforeClose
xlVeryHidden
- 从新导入的模块运行子过程,
- 保存并关闭工作簿。
每个记分卡都使用代码来确保只有记分卡上有姓名的人才能访问它。我已经Environ("username")
在工作簿事件中使用以确保安全性,但众所周知,如果一个人了解如何运行宏,他/她只需打开VBEditor
和取消隐藏xlVeryHidden
工作簿中的工作表即可。
所以,我的想法是以VBAProject
编程方式保护新工作簿的密码(见上文:第五步)。我在网上找到了一些关于如何使用SendKeys
来实现这个目标的资源(见下文),但SendKeys
不可靠(充其量)并且不与我的代码合作。如果我自己运行代码,它就像一个魅力,但如果我从另一个项目中调用它,使用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
执行代码时没有激活正确的项目。我曾希望激活正确的工作簿可以解决问题,但似乎没有帮助。