VBA:如何使用代码对模块进行密码保护?

VBA:如何使用代码对模块进行密码保护?,vba,excel,security,password-protection,Vba,Excel,Security,Password Protection,我有一个文件,它保存了自己的一个副本,以便发送给特定的收件人,因此您最终会得到许多只包含收件人特定信息的文件和包含所有信息的原始maste文件。创建特定于收件人的文件时,我的代码会删除除与该收件人相关的信息之外的所有内容,并使用以下函数使用随机创建的密码锁定工作簿和工作表: Function Pwd(iLength As Integer) As String Dim i As Integer, iTemp As Integer, bOK As Boolean, strTemp As String

我有一个文件,它保存了自己的一个副本,以便发送给特定的收件人,因此您最终会得到许多只包含收件人特定信息的文件和包含所有信息的原始maste文件。创建特定于收件人的文件时,我的代码会删除除与该收件人相关的信息之外的所有内容,并使用以下函数使用随机创建的密码锁定工作簿和工作表:

Function Pwd(iLength As Integer) As String
Dim i As Integer, iTemp As Integer, bOK As Boolean, strTemp As String
'48-57 = 0 To 9, 65-90 = A To Z, 97-122 = a To z
'amend For other characters If required
For i = 1 To iLength
    Do
        iTemp = Int((122 - 48 + 1) * Rnd + 48)
        Select Case iTemp
        Case 48 To 57, 65 To 90, 97 To 122: bOK = True
        Case Else: bOK = False
        End Select
    Loop Until bOK = True
    bOK = False
    strTemp = strTemp & Chr(iTemp)
Next i
Pwd = strTemp
End Function
是否也可以锁定模块,使其无法编辑?我想要的是Excel在VisualBasic中提供的相同功能,方法是转到工具->VBAPProject-项目属性->保护,但要通过代码来实现这一点,以便可以将其应用于每个特定于收件人的文件

我可以使用以下代码对图纸进行保护:

Sheets(1).Protect Password, True, True
和到工作簿,代码如下:

ActiveWorkbook.Protect Password, True, False

但是有什么东西可以用来锁定模块吗?

尽管已经对Excel密码/保护的安全性给出了很好的建议,并且卡尔·科林(Carl Colijn)链接了全面的(非SendKeys)解决方案,但我自己也成功地使用了脏SendKeys方法-见下面的示例,以及有关SendKeys的更多详细信息。YMMV等

注意:您必须在Excel Trust Center>宏设置中找到“信任VBA项目对象模型的访问权限”选项,或者在您的Excel版本中找到相应的选项

Sub UnprotectVBProj(ByRef WB As Workbook, ByVal Pwd As String)

    Dim vbProj As Object

    Set vbProj = WB.VBProject

    If vbProj.Protection <> 1 Then Exit Sub ' already unprotected

    Set Application.VBE.ActiveVBProject = vbProj

    SendKeys "%TE" & Pwd & "~~"

End Sub

Sub ProtectVBProj(ByRef WB As Workbook, ByVal Pwd As String)

    Dim vbProj As Object

    Set vbProj = WB.VBProject

    If vbProj.Protection = 1 Then Exit Sub ' already protected

    Set Application.VBE.ActiveVBProject = vbProj

    SendKeys "%TE+{TAB}{RIGHT}%V%P" & Pwd & "%C" & Pwd & "{TAB}{ENTER}"

End Sub
Sub UnprotectVBProj(ByRef WB作为工作簿,ByVal Pwd作为字符串)
作为对象的Dim vbProj
设置vbProj=WB.VBProject
如果vbProj.Protection 1,则退出子项“已不受保护”
设置Application.VBE.ActiveVBProject=vbProj
发送键“%TE”&Pwd&“~~”
端接头
子ProtectVBProj(ByRef WB作为工作簿,ByVal Pwd作为字符串)
作为对象的Dim vbProj
设置vbProj=WB.VBProject
如果vbProj.Protection=1,则退出子项“已受保护”
设置Application.VBE.ActiveVBProject=vbProj
发送键“%TE+{TAB}{RIGHT}%V%P”&Pwd&%C&Pwd&“{TAB}{ENTER}”
端接头

操纵VBA密码的唯一方法是作弊和使用SendKeys。Excel(或任何其他Office应用程序)没有公开的API。看:@BenSmith我不明白。您基本上是在客户端创建新文件,其中包含相关的可编辑数据,其他所有内容都已被删除。因此,您必须以某种方式将收件人发送回您的数据合并到主文件中。在这种情况下,是什么阻止您简单地让主文件生成具有任何给定收件人的所有相关选项卡的新的无代码文件,并发送该文件,而不是使用您不想显示的vba代码的主文件的编辑副本?@BenSmith甚至更好。我还是不明白你为什么需要发送一个经过删减的主文件?难道您不能拥有一个空白的template.xls文件,其中包含所有必要的结构(图纸、图表等)和严格要求的代码,以便方便地进行查看吗?任何时候你需要向收件人发送数据,复制模板,只复制相关数据并发送该文件。@BenSmith你显然需要在主文件中有必要的代码来自动创建新文件,我无法想象编写基本上是复制、粘贴和另存为操作的代码会太难,我非常怀疑这会比为每个收件人修剪一次主文件慢得多。是的,我知道你在问别的问题,但是你问的问题不容易做到,我甚至不知道如果没有一些极端的黑客,这是可能的,所以寻找解决办法总是明智的。代码真的必须在你分发的文件中吗?为什么你定制的主文件没有代码?将代码存储在不同的工作簿中,可能作为外接程序加载,然后在主文件上运行它。。。