簡體   English   中英

帶有SendKeys的VBA項目密碼保護無法正常工作

[英]VBA Project Password-Protect with SendKeys not Working Correctly

我花了最后兩天的時間來解決這個問題。 我在該主題上找到的大多數內容都無法解決我遇到的問題,因此我希望這里有人可以幫助我。

我一直在研究一些代碼,這些代碼可以從“主記分卡”工作簿中執行以下操作:

  1. 獲取工作簿中的每個“學生”工作表,然后將其復制到新的工作簿中,
  2. 對新工作簿做了一些小的操作,
  3. 將代碼模塊導入新工作簿中,
  4. Workbook_Open事件和Workbook_BeforeClose事件添加到新工作簿中(根據訪問級別將某些工作表設為xlVeryHidden ),
  5. 從新導入的模塊運行子過程,
  6. 保存並關閉工作簿。

每個計分卡都使用代碼來確保只有名稱在計分卡上的人才能訪問它。 我已經在工作簿事件中使用Environ("username")來確保安全性,但是眾所周知,如果一個人知道如何運行宏,他/她只能打開VBEditor並取消隱藏工作簿中的xlVeryHidden工作表。容易。

因此,我的想法是以編程方式用密碼保護新工作簿的VBAProject (請參見上文:第五步)。 我在線上找到了一些有關如何使用SendKeys實現此目標的資源(請參閱下文),但是SendKeys不夠可靠(充其量),並且與我的代碼不配合。 如果我自己運行該代碼,則它的工作方式就像一個Run Macro:="filename!macroname" ,但是如果我使用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代碼時未激活正確的項目。 我曾希望激活適當的工作簿能夠解決此問題,但似乎沒有幫助。

好的,因此在經過兩個小時的網絡搜索以實現我的目標的替代方法之后,我偶然發現了這篇文章

我創建了一個模板工作簿(事件代碼已經在ThisWorkbook ),用密碼保護了該項目,並修改了我的代碼以將模板工作簿用於每個新工作表。 現在,在創建圖紙后,該項目已被鎖定以供查看,並且需要密碼。 盡管我意識到這種方法下的安全性不是很安全,但可以幫助他們“誠實地誠實”。

對於那些偶然發現這篇文章但仍希望以編程方式鎖定/解鎖其VBA項目的人,請參閱以下資源:

這樣的帖子
這個博客

兩者都是很好的資源,它們都介紹了在VBA中進行操作的方法。

要為原本發布在此處的精美代碼增加一些細微差別:如果您在VBE中更改工作簿的項目名稱,則需要將一行代碼更改為:

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

(嘆)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM