Access 2013 VBA自动关闭Excel窗口

Access 2013 VBA自动关闭Excel窗口,excel,ms-access,vba,office-automation,Excel,Ms Access,Vba,Office Automation,我正在支持一个已投入生产多年的Access应用程序,它的Excel自动化部分已停止与我们的Office 2013升级和从.mdb到.accdb的转换一起工作 Access数据库包含对Microsoft Excel 15.0对象库的引用 Excel对象声明为: Public objXLApp As Excel.Application Public objXLBook As Excel.Workbook 并设置: Set objXLBook = GetObject(strRe

我正在支持一个已投入生产多年的Access应用程序,它的Excel自动化部分已停止与我们的Office 2013升级和从.mdb到.accdb的转换一起工作

Access数据库包含对Microsoft Excel 15.0对象库的引用

Excel对象声明为:

Public objXLApp As Excel.Application       
Public objXLBook As Excel.Workbook    
并设置:

Set objXLBook = GetObject(strReportPath & strTitle & ".xls")
DoEvents
Set objXLApp = objXLBook.Parent
此时,
objXLApp.visible
=false。另外,
objXLApp.Windows.Count
=1,这是正确的。 如果在即时窗口中我设置了
objXLApp.visible
=true,那么我将丢失我的窗口:
objXLApp.windows.Count
=0,并且对预期窗口的引用返回“下标超出范围”错误

从.mdb文件运行它会产生相同的行为

有什么想法吗


同样,这段代码是几年前由其他人编写的,因此,如果有更好的方法来设置工作簿,我愿意接受建议

汉瑟普,我可以试试你的建议。你能举个例子吗?如果行得通,我会把你的答案记为正确的

Gene,是的,原始文件是.xls格式的,它们还没有升级到.xlsx

Comintern,代码在代码的最后一行停止执行,然后我使用立即窗口检查值,更改visible属性并再次检查值


汉瑟普,这就解决了。我将代码更改为:

Set objXLApp = New Excel.Application
DoEvents
Set objXLBook = objXLApp.Workbooks.Open(strReportPath & strTitle & ".xls")
如果你发一个答案,我会把你的标记为正确


现在,我只需在代码中的其他地方更改它…

我的建议是,首先直接设置objXLApp变量,然后使用其
工作簿,看看是否可以消除此问题。Open
方法打开Excel工作簿文件:

Set objXLApp=New Excel.Application
设置objXLBook=objXLApp.Workbooks.Open(strReportPath&strTitle&“.xls”)
同时,您测试了该方法并发现它有效。但是,我不确定这是最终的解决方案,因为您的对象变量的作用域是在模块级别

Public objXLApp作为Excel.Application
作为Excel.工作簿的公共objXLBook
如果重复调用代码,可能会在其他地方仍然需要这些对象引用时更改这些对象引用。另一方面,如果您不想重复运行代码,我看不出有什么理由关心
objXLApp.Windows.Count


我只是不知道这里会发生什么;我避免使用全局变量。

代码使用早期绑定,但打开工作簿时却像后期绑定一样,这有什么原因吗?如果您先直接设置
objXLApp
,然后使用其
工作簿,它是否能正常工作。Open
方法打开文件?如果您使用的是office 2013,您的excel工作表是“.xls”还是“.xlsx”?运行代码时工作簿是打开的,还是运行代码会打开工作簿?是的,我也会避免它们,但希望将更改最小化。我添加了一个全局公共子包来包装这两行代码,并更改了其他16个引用。用户熟悉错误如果他们重新运行报告,他们必须先关闭一个实例,然后再打开另一个实例。这可能就是你所指的,但我会等他们询问后再做更多的修改。顺便说一句,对象变量的作用域是全局级别的。