2

最近两天我一直在解决这个问题。我在这个主题上找到的大部分内容都没有解决我遇到的问题,所以我希望这里有人可以帮助我。

我一直在研究一些从“主记分卡”工作簿中执行以下操作的代码:

  1. 获取工作簿中的每个“学生”工作表并将工作表复制到新工作簿中,
  2. 对新工作簿进行一些小的操作,
  3. 将代码模块导入新工作簿,
  4. 向新工作簿添加一个Workbook_Open事件和一个事件(根据访问级别制作某些工作表),Workbook_BeforeClosexlVeryHidden
  5. 从新导入的模块运行子过程,
  6. 保存并关闭工作簿。

每个记分卡都使用代码来确保只有记分卡上有姓名的人才能访问它。我已经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执行代码时没有激活正确的项目。我曾希望激活正确的工作簿可以解决问题,但似乎没有帮助。

4

2 回答 2

1

好的,所以在网上搜索了几个小时以寻找实现目标的替代方法后,我偶然发现了这篇文章

我创建了一个模板工作簿(其中已包含事件代码ThisWorkbook),对项目进行了密码保护,并修改了我的代码以将模板工作簿用于每个新工作表。现在,当创建工作表时,项目已经被锁定以供查看,并且需要密码。虽然我意识到这种方法的安全性不是很安全,但正如他们所说,它将有助于“让诚实的人保持诚实”。

对于那些偶然发现这篇文章并仍然希望以编程方式锁定/解锁他们的 VBA 项目的人,请参阅以下资源:

这个 SO post
这个博客

两者都是很好的资源,可以在 VBA 中完成。

于 2013-07-22T04:45:30.567 回答
0

要为最初在此处发布的其他精美代码添加细微差别:如果您在 VBE 中更改工作簿的项目名称,则需要将一行代码更改为:

   .VBE.CommandBars("Menu Bar").Controls("Tools") _
        .Controls(VBP.Name & " Properties...").Execute

(叹)

于 2013-10-31T22:52:07.307 回答