我支持已经投入生产多年的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文件运行它会产生相同的行为。
有任何想法吗?
同样,Commintern,该代码是几年前由其他人编写的,因此,如果有更好的方法来设置工作簿,则欢迎提出建议。
HansUp,我可以尝试您的建议。你能举个例子吗?如果有效,我会将您的答案标记为正确。
Gene,是的,原始文件为.xls格式,尚未升级为.xlsx。
Comintern,代码在代码的最后一行停止执行,然后使用即时窗口检查值并更改visible属性,然后再次检查值。
HansUp,已解决问题。我将代码更改为:
Set objXLApp = New Excel.Application
DoEvents
Set objXLBook = objXLApp.Workbooks.Open(strReportPath & strTitle & ".xls")
如果您发布答案,我会标记为正确答案。
现在,我只需要在代码中的其他位置进行更改即可...
最佳答案
我的建议是看是否可以通过首先直接设置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
。我只是不知道这里会发生什么;我避免使用全局变量。