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

VBA使用ADO连接已打开Excel工作簿报连接丢失错误如何解决?

问题结论

  1. ADO并非仅支持连接关闭状态的Excel工作簿,可正常读取已打开的文件,你遇到的报错是OLEDB驱动默认配置被打开文件的独占锁拦截导致,调整连接参数即可解决。

具体修复方案

现有代码缺少只读连接配置,无法绕过打开文件的独占锁校验,需修改连接字符串,同时建议新增对象释放逻辑避免残留文件句柄。
注:如果你的所有源工作簿的数据源都固定存放在Sheet1,现有查询语句无需修改;如果不同源工作簿的数据源工作表名不同,可新增参数传入源工作表名替换固定的[Sheet1$]即可

修正后完整代码

Sub callstuff()
    Call GetDataFromClosedFile("Movies1.xlsm", "sheet2", "Helper1")
    'Call GetDataFromClosedFile("Movies2.xlsm", "sheet3", "Helper2")
    'Call GetDataFromClosedFile("Movies3.xlsm", "sheet4", "Helper3")
    'Call GetDataFromClosedFile("Movies4.xlsm", "sheet5", "Helper4")
    'Call GetDataFromClosedFile("Movies5.xlsm", "sheet6", "Helper5")
    'Call GetDataFromClosedFile("Movies6.xlsm", "sheet7", "Helper6")
    'Call GetDataFromClosedFile("Movies7.xlsm", "sheet8", "Helper7")
    'Call GetDataFromClosedFile("Movies8.xlsm", "sheet9", "Helper8")
    'Call GetDataFromClosedFile("Movies8.xlsm", "sheet10", "Helper9")
    'Call GetDataFromClosedFile("Movies8.xlsm", "sheet11", "Helper10")
    'Call GetDataFromClosedFile("Movies8.xlsm", "sheet12", "Helper11")
    'Call GetDataFromClosedFile("Movies8.xlsm", "sheet13", "Helper12")
End Sub

Option Explicit

Sub GetDataFromClosedFile(WorkBookName As String, SheetName As String, TableName As String)
    Dim cn As ADODB.Connection
    Dim rs As ADODB.Recordset
    Dim path As String
    Dim rngTable As Range

    path = "C:\Users\dima\OneDrive - ort braude college of engineering\Desktop\New folder (5)\" '常量路径
    
    '清空目标区域
    Worksheets(SheetName).Range("j4").CurrentRegion.Clear
    
    Set cn = New ADODB.Connection
    '修改连接字符串,新增ReadOnly=1参数绕过锁校验,IMEX=1避免混合数据类型读取错误
    cn.ConnectionString = _
        "Provider=Microsoft.ACE.OLEDB.12.0;" & _
        "Data Source=" & path & WorkBookName & ";" & _
        "Extended Properties='Excel 12.0 Macro;HDR=YES;ReadOnly=1;IMEX=1';"
        
    cn.Mode = adModeRead
    cn.Open
    
    Set rs = New ADODB.Recordset
    rs.ActiveConnection = cn
    rs.Source = "SELECT * FROM [Sheet1$] "
    rs.Open
    
    '写入目标区域
    Worksheets(SheetName).Range("j4").CopyFromRecordset rs
    
    '释放对象,避免残留句柄占用文件
    rs.Close
    cn.Close
    Set rs = Nothing
    Set cn = Nothing
    
    '创建结构化表
    Set rngTable = Worksheets(SheetName).Range("j4").CurrentRegion
    Worksheets(SheetName).ListObjects.Add(xlSrcRange, rngTable, , xlNo).Name = TableName
End Sub

额外注意事项

  • 如果源文件是共享打开的状态,上述修改可以直接正常读取
  • 如果源文件是被其他用户以独占模式打开,仍然会遇到权限报错,这种场景下只能要求对方以共享模式打开文件,或者等文件关闭后再读取
  • ADO仅能读取源文件已保存的内容,未保存的修改不会被读取到

内容的提问来源于stack exchange,提问作者dima gorokh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 20:30:00