You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

指定路径Excel工作簿取消保护刷新连接后重新保护的报错解决

问题解决方案

核心原因

  • Power Query 无法直接读取设置了工作簿结构保护的文件,会误判文件损坏抛出[DataFormat.Error] File contains corrupted data.报错,取消保护后读取逻辑即可恢复正常。
  • 你当前编写的VBA逻辑存在偏差:代码仅对每个子工作簿执行自身内部连接的刷新操作,没有触发主表的Power Query汇总刷新,无法匹配你的使用需求。

修正后执行逻辑

批量解锁所有子工作簿 → 触发主表Power Query全部刷新 → 批量重新给子工作簿加保护

Option Explicit
Sub Unlock_Refresh_Master()
    Dim wb As Workbook, ws As Worksheet
    Dim Filepath As String, Filename As String
    Dim n As Long
    Const pass = "1519"
    
    ' 读取子工作簿所在路径
    Filepath = Worksheets("Sheet2").Range("A1").Value
    If Right(Filepath, 1) <> "\" Then Filepath = Filepath & "\"
    
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    
    ' ----------------------
    ' 第一步:批量解锁子工作簿
    ' ----------------------
    Filename = Dir(Filepath & "*.xls*")
    Do While Filename <> ""
        ' 跳过主表自身,避免误操作
        If Filename <> ThisWorkbook.Name Then
            Set wb = Workbooks.Open(Filepath & Filename, Password:=pass)
            With wb
                .Unprotect Password:=pass
                ' 若子工作簿设置了工作表保护,可取消下方注释解锁对应工作表
                ' For Each ws In .Worksheets
                '     ws.Unprotect Password:=pass
                ' Next
                .Save
                .Close
            End With
            n = n + 1
        End If
        Filename = Dir
    Loop
    
    ' ----------------------
    ' 第二步:刷新主表Power Query
    ' ----------------------
    ThisWorkbook.RefreshAll
    ' 等待刷新完成,执行代码前请先关闭所有查询的后台刷新选项
    Do While ThisWorkbook.Connections.Count > 0
        If Not ThisWorkbook.Connections(1).OLEDBConnection.Refreshing Then Exit Do
        DoEvents
    Loop
    
    ' ----------------------
    ' 第三步:批量重新加保护
    ' ----------------------
    n = 0
    Filename = Dir(Filepath & "*.xls*")
    Do While Filename <> ""
        If Filename <> ThisWorkbook.Name Then
            Set wb = Workbooks.Open(Filepath & Filename, Password:=pass)
            With wb
                .Protect Password:=pass
                ' 若之前解锁了工作表,可取消下方注释重新加保护
                ' For Each ws In .Worksheets
                '     ws.Protect Password:=pass
                ' Next
                .Save
                .Close
            End With
            n = n + 1
        End If
        Filename = Dir
    Loop
    
    Application.ScreenUpdating = True
    Application.DisplayAlerts = True
    MsgBox n & " 个工作簿已完成保护设置,主表数据刷新完成", vbInformation
End Sub

注意事项

  • 执行代码前请先关闭所有Power Query的后台刷新:操作路径为「数据」→「查询和连接」→ 右键每个查询→「属性」→ 取消勾选「允许后台刷新」,确保刷新完成后再执行后续加锁操作。
  • 请确保Sheet2的A1单元格填写的是4个子工作簿所在的完整文件夹路径,不要填写主表自身的存储路径。

内容的提问来源于stack exchange,提问作者Dhakshna Moorthy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 05:54:01