如何修复批量解锁指定路径Excel工作簿、刷新连接后再保护的VBA代码
VBA代码问题排查及修正方案
原有代码核心错误
- 变量定义错误:
wb被错误声明为Workbooks(工作簿集合类型),单个工作簿对象应使用Workbook类型;同时path为字符串格式的路径,无法直接遍历得到工作簿对象。 - 遍历逻辑错误:
For Each wb In path语法不成立,需要通过Dir函数匹配目标路径下的所有Excel文件,逐个打开后才能进行保护操作。 - 刷新逻辑错误:原有代码
ThisWorkbook.RefreshAll仅会刷新运行代码的当前工作簿,不会作用于路径下的其他目标工作簿。 - 缺少文件操作步骤:操作外部工作簿必须执行打开、保存、关闭流程,否则所有修改不会生效。
修复后可运行代码
Sub Unlock_Refresh() Dim path As String, pass As String, fileName As String Dim wb As Workbook, ws As Worksheet ' 配置参数 pass = "1519" path = Worksheets("Sheet2").Range("A1").Value ' 处理路径末尾的反斜杠 If Right(path, 1) <> "\" Then path = path & "\" ' 关闭屏幕更新提升运行速度 Application.ScreenUpdating = False Application.DisplayAlerts = False ' 遍历路径下所有Excel文件 fileName = Dir(path & "*.xls*") Do While fileName <> "" ' 跳过当前运行代码的工作簿 If fileName <> ThisWorkbook.Name Then ' 打开工作簿,如果文件本身设置了打开密码就保留Password参数,否则删除即可 Set wb = Workbooks.Open(Filename:=path & fileName, Password:=pass) ' --- 解除保护段:如果是解除工作簿结构保护保留下面一行 If wb.ProtectStructure Then wb.Unprotect Password:=pass ' --- 如果是要解除所有工作表保护,替换上面一行为下面3行 ' For Each ws In wb.Worksheets ' If ws.ProtectContents Then ws.Unprotect Password:=pass ' Next ws ' 刷新当前工作簿所有连接 wb.RefreshAll ' 等待刷新完成 Application.Wait Now + TimeValue("00:00:10") ' --- 重新加保护段:工作簿结构保护保留下面一行 wb.Protect Password:=pass, Structure:=True ' --- 如果是要保护所有工作表,替换上面一行为下面3行 ' For Each ws In wb.Worksheets ' ws.Protect Password:=pass ' Next ws ' 保存修改并关闭工作簿 wb.Save wb.Close End If ' 匹配下一个文件 fileName = Dir Loop ' 恢复系统设置 Application.ScreenUpdating = True Application.DisplayAlerts = True MsgBox "批量操作完成!" End Sub
注意事项
运行前确认Sheet2的A1单元格填写的路径格式正确,例如C:\Users\XXX\Desktop\目标Excel文件夹\,根据你的保护是工作簿级别还是工作表级别,按照代码注释替换对应段落即可。
内容的提问来源于stack exchange,提问作者Dhakshna Moorthy
相关产品推荐
相关产品推荐

