我正在支持多年来一直在生产的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文件运行它会产生相同的行为。
有什么想法吗?
Comintern,代码是几年前由其他人编写的,所以如果有更好的方法来设置工作簿,我愿意接受建议。
HansUp,我可以试试你的建议。你能发一个例子吗?如果它有效,我会将你的答案标记为正确。
Gene,是的,原始文件是.xls格式,它们尚未升级到.xlsx。
Comintern,代码在最后一行代码处停止执行,然后我使用立即窗口检查值并更改visible属性并再次检查值。
HansUp,修复了它。我将代码更改为:
Set objXLApp = New Excel.Application
DoEvents
Set objXLBook = objXLApp.Workbooks.Open(strReportPath & strTitle & ".xls")
如果您发布答案,我会将您的答案标记为正确。
现在我只需要在代码中的其他地方更改它......
答案 0 :(得分:3)
我的建议是看看是否可以通过直接设置 objXLApp 变量,然后使用其WorkBooks.Open
方法打开Excel工作簿文件来消除问题:
Set objXLApp = New Excel.Application
Set objXLBook = objXLApp.Workbooks.Open(strReportPath & strTitle & ".xls")
与此同时,您测试了这种方法并发现它有效。但是,我不确定这是最终的解决方案,因为您的对象变量的范围是模块级别的......
Public objXLApp As Excel.Application
Public objXLBook As Excel.Workbook
如果您将反复调用代码,那么当其他地方可能仍需要这些对象引用时,您最终可能会更改这些对象引用。另一方面,如果您不会重复运行代码,我认为没有理由关心objXLApp.Windows.Count
。
我只是不知道这里会发生什么;我避免使用全局变量。