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

Excel Office 365 V1902工作簿对象引用被覆盖问题咨询

关于Office 365中Application.Workbooks.Open对象引用覆盖的已知问题及修复情况

这确实是**Office 365 Version 1902(Build 11328.20420)**版本里的一个已知BUG,不少开发者都反馈过这个Excel对象模型的异常行为。

问题背景

在这个特定版本中,当重复运行通过Application.Workbooks.Open创建Workbook对象的代码时,Excel的对象引用管理出现了逻辑错误:第一次运行时两个Workbook变量能正确指向对应文件,但第二次及之后运行时,第一个变量的引用会被后续打开的文件覆盖,最终导致两个变量指向同一个Workbook实例。而Office 2016的对象模型没有这个缺陷,所以运行相同代码完全正常。

修复情况

好消息是,这个BUG在后续的Office 365月度更新中已经被修复了。从Version 1903及之后的正式版本开始,微软修正了Workbook对象引用的管理逻辑,确保每次调用Application.Workbooks.Open都会返回对应文件的独立对象引用,不会再出现引用覆盖的问题。如果你的Office 365还停留在1902版本,建议尽快更新到最新版本来解决这个问题。

临时解决方案(若无法立即升级)

如果你暂时无法升级Office版本,可以用以下两种方法规避这个问题:

  • 方法一:运行代码前关闭已打开的目标工作簿
    通过提前检查并关闭同名工作簿,避免引用冲突:
    Option Explicit
    Sub Main()
    On Error GoTo err_handler
    Dim Book1 As Workbook
    Dim Book2 As Workbook
    
    ' 提前关闭已打开的目标文件
    CloseTargetWorkbook "Book1.xlsx"
    CloseTargetWorkbook "Book2.xlsx"
    
    Set Book1 = Application.Workbooks.Open("C:\Test\Book1.xlsx")
    Set Book2 = Application.Workbooks.Open("C:\Test\Book2.xlsx")
    Debug.Print Book1.Name
    Debug.Print Book2.Name
    Exit Sub
    err_handler:
    MsgBox Err.Description
    End Sub
    
    ' 辅助子过程:关闭指定名称的工作簿
    Sub CloseTargetWorkbook(wbName As String)
        Dim wb As Workbook
        For Each wb In Application.Workbooks
            If wb.Name = wbName Then
                wb.Close SaveChanges:=False ' 根据需求调整是否保存
                Exit For
            End If
        Next wb
    End Sub
    
  • 方法二:使用GetObject函数替代(需注意场景)
    GetObject函数可以获取已打开文件的引用,若文件未打开则会打开它,在这个版本中能避免引用覆盖问题:
    Set Book1 = GetObject("C:\Test\Book1.xlsx")
    Set Book2 = GetObject("C:\Test\Book2.xlsx")
    
    但要注意:如果目标文件已经打开,GetObject会直接返回现有引用,不会创建新实例。如果你的业务需要每次都打开新的文件实例,还是结合方法一的关闭操作更稳妥。

内容的提问来源于stack exchange,提问作者Simon Cash

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:25:45