最近两天我一直在解决这个问题。我在这个主题上找到的大部分内容都没有解决我遇到的问题,所以我希望这里有人可以帮助我。
我一直在研究一些从“主记分卡”工作簿中执行以下操作的代码:
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
我不确定为什么会这样;就像我说的,代码在单独运行时运行良好。我找到了this post在哪里 this link到非
SendKeys
概述了方法,但它是几年前编写的,我不确定我需要如何修改它以达到我的目的,因为我从未在 VB6 中编码......有什么想法为什么
SendKeys
方法在代码已经运行而不是在代码期间执行时聚集在一起?我应该放弃SendKeys
赞成这种其他方法?我很茫然,所以任何帮助将不胜感激!编辑:我认为代码不起作用的原因是因为在
SendKeys
时没有激活正确的项目。代码被执行。我曾希望激活正确的工作簿可以解决问题,但似乎没有帮助。
最佳答案
好的,在网上搜索了几个小时以寻找实现目标的替代方法后,我偶然发现了 this post .
我创建了一个模板工作簿(事件代码已经在 ThisWorkbook
中),对项目进行了密码保护,并修改了我的代码以将模板工作簿用于每个新工作表。现在,当创建工作表时,该项目已被锁定以供查看,并且需要密码。虽然我意识到这种方法的安全性不是很安全,但正如他们所说,它将有助于“让诚实的人保持诚实”。
对于那些偶然发现这篇文章并仍然希望以编程方式锁定/解锁他们的 VBA 项目的人,请参阅以下资源:
This SO post
This blog
两者都是很好的资源,可以在 VBA 中完成。
关于使用 SendKeys 无法正常工作的 VBA 项目密码保护,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17777770/