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
相关产品推荐
相关产品推荐

