使用 SendKeys 无法正常工作的 VBA 项目密码保护

标签 vba excel password-protection sendkeys

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

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

  • 获取工作簿中的每个“学生”工作表并将工作表复制到新工作簿中,
  • 对新工作簿进行一些小的操作,
  • 将代码模块导入新工作簿
  • 添加 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/

    相关文章:

    linux - 检测 .doc 文件在 Linux 上是否受密码保护

    arrays - 无法使用数组成员变量分配数组

    excel - 使用 VBA 将字段从另一个数据源添加到数据透视表

    vba - excel:更改高级过滤器中的日期格式

    excel - 适用于 Windows 的 Oracle ODBC 驱动程序

    excel - VBA 将数据从多个工作簿复制到 Mastercopy excel

    excel - 填充空白字段

    c# - 加密密码的最佳方法是什么?

    php - 在 MYSQL 中存储密码的正确代码过程

    excel - 如果单元格的值等于另一列的任何值,则对单元格进行条件格式设置