我被要求更新一些Excel 2003宏,但是VBA项目有密码保护,而且似乎缺少文档。。。没有人知道密码
有没有办法删除或破解VBA项目上的密码
您可以尝试这种不需要十六进制编辑的直接VBA
方法。它适用于任何文件(*.xls、*.xlsm、*.xlam…)
在以下方面进行测试和工作:
Excel 2007
Excel 2010
Excel 2013-32位版本
Excel 2016-32位版本
寻找64位版本?看到这个答案了吗
工作原理
我会尽力解释它是如何工作的-请原谅我的英语
- VBE将调用系统函数来创建密码对话框
- 如果用户输入正确的密码并单击“确定”,则此函数返回1。如果用户输入错误的密码或单击“取消”,此函数将返回0
- 对话框关闭后,VBE将检查系统函数的返回值
- 如果该值为1,VBE将“认为”密码正确,因此将打开锁定的VBA项目
- 下面的代码将用于显示密码对话框的原始函数的内存与用户定义的函数交换,该函数在被调用时始终返回1
使用代码
请先备份您的文件
- 打开包含锁定VBA项目的文件
-
创建新的xlsm文件并将此代码存储在模块1中
代码归于越南开发商Siwtom(昵称)
选项显式 Private Const PAGE_EXECUTE_READWRITE=&;H40 私有声明子移动内存库“kernel32”别名“rtlmovemory”_ (目标长度为,源长度为,ByVal长度为) 私有声明函数VirtualProtect Lib“kernel32”(lpAddress尽可能长_ ByVal dwSize尽可能长,ByVal flNewProtect尽可能长,LPFLOLPROTECT尽可能长 私有声明函数GetModuleHandleA Lib“kernel32”(ByVal lpModuleName作为字符串)的长度为 私有声明函数GetProcAddress Lib“kernel32”(ByVal hModule,只要_ ByVal lpProcName(作为字符串)长度相同 专用声明函数DialogBoxParam Lib“user32”别名“DialogBoxParamA”(ByVal hInstance,长度为_ ByVal pTemplateName为长,ByVal hWndParent为长_ ByVal lpDialogFunc为长,ByVal dwInitParam为长)为整数 Dim HOOK字节(0到5)作为字节 Dim OriginBytes(0到5)作为字节 变暗pFunc为长 将标志变暗为布尔值 私有函数GetPtr(ByVal值为Long)为Long GetPtr=值 端函数 公共子字节() If标志然后移动内存ByVal pFunc,ByVal VarPtr(OriginBytes(0)),6 端接头 作为布尔值的公共函数Hook() 将TmpBytes(0到5)调整为字节 变暗p为长 朦胧的原汁原味 Hook=False pFunc=GetProcAddress(GetModuleHandleA(“user32.dll”),“DialogBoxParamA”) 如果是VirtualProtect(ByVal pFunc,6,第_执行_读写,原始保护)<&燃气轮机;0那么 移动内存ByVal VarPtr(TmpBytes(0)),ByVal pFunc,6 如果TmpBytes(0)<&燃气轮机&;那么H68 移动内存ByVal VarPtr(OriginBytes(0)),ByVal pFunc,6 p=GetPtr(MyDialogBoxParam的地址) HookBytes(0)=&;H68 移动内存ByVal VarPtr(HookBytes(1)),ByVal VarPtr(p),4 HookBytes(5)=&;氯化氢 移动内存ByVal pFunc,ByVal VarPtr(HookBytes(0)),6 Flag=True Hook=True 如果结束 如果结束 端函数 私有函数MyDialogBoxParam(ByVal)长度_ ByVal pTemplateName为长,ByVal hWndParent为长_ ByVal lpDialogFunc为长,ByVal dwInitParam为长)为整数 如果pTemplateName=4070,则 MyDialogBoxParam=1 其他的 恢复字节 MyDialogBoxParam=DialogBoxParam(hInstance,pTemplateName_ hWndParent、lpDialogFunc、dwInitParam) 钩 如果结束 端函数
-
将此代码粘贴到模块1中的上述代码下,然后运行它
子未受保护() 如果钩那么 MsgBox“VBA项目未受保护!”,vbInformation,***** 如果结束 端接头
-
回到您的VBA项目并享受