我如何从VB宏中取消保护我的VB项目?我发现了以下代码:
Sub UnprotectVBProject(ByRef WB As Workbook, ByVal Password As String)
Dim VBProj As Object
Set VBProj = WB.VBProject
Application.ScreenUpdating = False
'Ne peut procéder si le projet est non-protégé.
If VBProj.Protection <> 1 Then Exit Sub
Set Application.VBE.ActiveVBProject = VBProj
'Utilisation de "SendKeys" Pour envoyer le mot de passe.
SendKeys Password & "~"
SendKeys "~"
'MsgBox "Après Mot de passe"
Application.VBE.CommandBars(1).FindControl(ID:=2578, recursive:=True).Execute
Application.Wait (Now + TimeValue("0:00:1"))
End Sub
但是这个解决方案不适用于Excel 2007。它在我的IDE中显示身份验证窗口并打印密码。
然后,我的目标是取消保护我的VBproject,而不显示此窗口。
谢谢你的帮助
4条答案
按热度按时间imzjd6km1#
编辑:
已将其转换为VBA和VB.Net的BLOG post。
我从来不赞成
Sendkeys
。它们在某些情况下是可靠的,但并不总是如此。尽管如此,我对API有一个软角落。您想要的可以实现,但是您必须确保要取消保护VBA的工作簿必须在单独的Excel示例中打开。
这里有一个例子
假设我们有一个工作簿,其VBA工程目前看起来像这样。
逻辑:
1.使用
FindWindow
查找“VBAProject密码”窗口的句柄1.找到后,使用
FindWindowEx
在该窗口中找到编辑框的句柄1.找到编辑框的句柄后,只需使用
SendMessage
对其进行写入。1.使用
FindWindowEx
在该窗口中查找Buttons
的句柄1.找到
OK
按钮的句柄后,只需使用SendMessage
单击它。建议:
1.对于API的THIS是我可以推荐的最佳链接。
1.如果你想成为像
FindWindow
,FindWindowEx
和SendMessage
这样的API的高手,那么你可以使用一个工具,它可以为你提供系统进程,线程,窗口和窗口消息的图形视图。uuSpy或Spy++。这是什么间谍++将显示你的“VBAProject密码”窗口
测试:
打开一个新的Excel示例并将下面的代码粘贴到一个模块中。
编码:
我已经注解了代码,所以你应该不会有任何问题理解它。
bis0qfac2#
我知道你已经锁定了这个新的答案,但我有几个问题与上述代码,主要是我在Office 64位(VBA7)工作。然而,我也使它的代码将在Excel的当前示例中工作,并添加了更多的错误检查和格式化它粘贴到一个单独的模块,只有方法
UnlockProject
暴露。为了充分披露,我真的从这篇文章中的代码开始,尽管它是一个主题的变体。
代码还显示了条件编译常量,因此它应该同时兼容32位和64位版本的Excel。我使用this page来帮助我解决这个问题。
下面是代码,希望对大家有用:
6ojccjat3#
@James Macadie的答案(上图)是我找到的最好的(我正在运行32位Excel 365/2019)
注意:我发现你必须有
Application.ScreenUpdating = True
才能通过不同的sub或函数调用James的方法,否则你可能会得到Invalid procedure call or argument
错误(如果在调试模式之外运行)。此解决方案似乎上级以下两种解决方案:
smdncfj34#
对James MacAdie的奇妙解决方案的修改建议:
在
Function UnlockTimerProc
中,将代码pwd = Left(pwd, ...
替换为pwd = VBA.Left(pwd, ...
,否则它会在某些书籍中失败,这是我很难弄清楚的。谢谢。问候。