GetObject(xxx).Application无法识别已保存的打开Excel文件问题
问题原因分析
核心逻辑:GetObject的匹配规则差异
当Excel工作簿未保存时,Excel会用默认临时名称(如Book1、Book2)作为该工作簿的内部标识,此时GetObject("Book1")可以直接匹配到这个未保存的工作簿实例。
但一旦工作簿保存后,Excel会将该工作簿的标识与完整文件路径绑定,不再使用默认的BookN名称。此时:
- 仅传入
Book1或Book1.xlsm无法匹配,因为GetObject会将这类字符串视为要打开的文件名(而非已打开实例的标识),它会在系统默认路径中查找该文件,而非匹配已打开的工作簿。 - 即使文件已经打开,
GetObject如果只传文件名,仍会尝试重新打开该文件,而非绑定到已运行的实例。
对应测试现象的解释
- 未保存的Book1:
GetObject("Book1")匹配到Excel内部的临时标识,成功获取实例,返回False。 - 未保存的Book2:若此时Book1仍处于打开状态,代码依然能找到Book1实例,因此返回
False。 - 保存后的Book2:Book2的标识已变为完整路径,
GetObject("Book1")找不到对应实例,返回True。 - 保存后的Book1:无论用
Book1还是Book1.xlsm,都无法匹配到已绑定路径的实例,返回True。 - 重新打开已保存文件:文件标识依然是完整路径,
GetObject无法通过文件名匹配,返回True。
解决方案:遍历已打开工作簿匹配
要准确找到已打开的工作簿(无论是否保存),应该遍历Excel实例的Workbooks集合,通过工作簿的Name或FullName属性匹配:
Private Sub document_open() Dim xlApp As Excel.Application Dim targetWB As Excel.Workbook Dim isFound As Boolean isFound = False '尝试获取正在运行的Excel实例 On Error Resume Next Set xlApp = GetObject(, "Excel.Application") On Error GoTo 0 If Not xlApp Is Nothing Then '遍历所有打开的工作簿 For Each targetWB In xlApp.Workbooks '匹配目标工作簿的名称(支持未保存/已保存的名称) If targetWB.Name = "Book1" Or targetWB.Name = "Book1.xlsm" Then isFound = True targetWB.Application.Visible = True Exit For End If Next targetWB End If '输出是否找到(对应原代码的MsgBox) MsgBox Not isFound End Sub
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

