Access 2013 VBA自动化Excel丢失窗口

时间:2015-06-05 17:02:56

标签: excel vba ms-access 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(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")

如果您发布答案,我会将您的答案标记为正确。

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

1 个答案:

答案 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

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