ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > E问E答 > Excel VBA > 如何用vba代码批量根据已有密码表尝试打开并删除选定目录下excel文件密码?

如何用vba代码批量根据已有密码表尝试打开并删除选定目录下excel文件密码?

作者:绿色风 分类: 时间:2022-08-17 浏览:145
楼主
kevinchengcw
Q: 如何用vba代码批量根据已有密码表尝试打开并删除选定目录下excel文件密码?
A: 代码如下:
  1. Sub test()
  2. Dim mPath, ExApp As Object, WB As Workbook, PSW, FN$, N%, Str$, OK As Boolean
  3. PSW = Array("", "258", "369")   '建立密码数组(包含无密码的情况,由程序依次测试)
  4. Set mPath = Application.FileDialog(msoFileDialogFolderPicker)  '设置文件夹选择框
  5. If mPath.Show = -1 Then  '如果显示了选择框并选择了文件夹,则
  6.     CreateObject("wscript.shell").Run Environ("comspec") & " /c dir /s/b """ & mPath.SelectedItems(1) & "\*.xls?"">""" & ThisWorkbook.Path & "\list.txt""", 0, 1  '利用命令行得到该文件夹下含子文件夹的全部excel文件列表并等待列表生成完毕
  7.     Set ExApp = CreateObject("excel.application")  '创建一个excel进程用于尝试打开文件
  8.     With ExApp
  9.         .Visible = False  '进程为不可见且不显示警告信息
  10.         .DisplayAlerts = False
  11.     End With
  12.     On Error Resume Next  '出错时继续执行
  13.     Str = ""  '初始化记录未能修改密码的文件的变量为空值
  14.     With CreateObject("scripting.filesystemobject")  '创建FSO项目用于操作列表文件
  15.             With .opentextfile(ThisWorkbook.Path & "\list.txt")  '利用FSO项目打开列表文件
  16.                 Do While Not .atendofstream  '当未达到列表文件末端时继续循环
  17.                     FN = .readline  '读取一行内容
  18.                     If Trim(FN) <> "" And FN <> ThisWorkbook.FullName Then  '如果内容有效,且不是当前工作簿的全路径(防止选择当前文件所在目录或上层目录后导致重复打开的问题)
  19.                         OK = False  '初始化完成变量为假
  20.                         For N = LBound(PSW) To UBound(PSW)  '循环各个密码(从空密码开始,尝试利用各个密码打开文件)
  21.                             Set WB = ExApp.Workbooks.Open(FN, Password:=PSW(N))  '利用当前循环到的密码尝试打开文件
  22.                             If Not WB Is Nothing Then  '未能打开文件,则文件变量是nothing,如果不是nothing及说明打开了,则
  23.                                 If PSW(N) = "" Then  '如果是用空密码打开的,则直接关闭不保存
  24.                                     WB.Close False
  25.                                 Else  '否则将密码设置成无,然后保存并关闭
  26.                                     WB.Password = ""
  27.                                     WB.Close True
  28.                                 End If
  29.                                 OK = True  '完成变量设置为真
  30.                                 Set WB = Nothing   '将工作簿变量置为nothing,防止将当前内容带入下一循环
  31.                                 Exit For  '退出当前循环
  32.                             End If
  33.                         Next N  '循环到下一密码
  34.                     End If
  35.                     If OK = False Then Str = Str & vbNewLine & FN   '如果循环结束完成变量仍为假,则将当前工作簿名以换行符串接到变量中
  36.                 Loop  '循环到列表下一行
  37.         End With
  38.     End With
  39.     ExApp.Quit  '全部执行完毕后退出创建的excel进程
  40.     Set WB = Nothing  '清空创建的项目
  41.     Set ExApp = Nothing  
  42.     Kill ThisWorkbook.Path & "\list.txt"   '删除列表文件
  43. End If
  44. If Str <> "" Then  '如果记录未完成密码修改的变量内容不为空,则显示记录的未修改的文件清单
  45.     MsgBox "如下文件密码未清除" & Str
  46. Else  '否则显示提示信息
  47.     MsgBox "全部完成"
  48. End If
  49. End Sub
详见素材源帖.
2楼
い卋玑┾宝珼
向K版学习VBA代码

免责声明

有感于原ExcelTip.Net留存知识的价值及部分知识具有的时间限定性因素, 经与ExcelTip.Net站长Apolloh商议并征得其同意, 现将原属ExcelTip.Net的知识帖采集资料于本站点进行展示, 供有需要的人士查询使用,也慰缅曾经的论坛时代。 所示各个帖子的原作者如对版权有异议, 可与本人沟通提出,或于本站点留言,我们会尽快处理。 在此,感谢ExcelTip.Net站长Apolloh的支持,感谢本站点所有人**绿色风(QQ:79664738)**的支持与奉献,特此鸣谢!
------本人网名**KevinChengCW(QQ:1210618015)**原ExcelTip.Net总版主之一

评论列表
sitemap