我支持已经投入生产多年的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

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

10-06 16:07