Access 2013 VBA 自动化 Excel 丢失窗口

Posted

技术标签:

【中文标题】Access 2013 VBA 自动化 Excel 丢失窗口【英文标题】:Access 2013 VBA automating Excel losing windows 【发布时间】:2015-06-05 17:02:56 【问题描述】:

我正在支持一个已投入生产多年的 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 文件运行它会产生相同的行为。

有什么想法吗?


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

HansUp,我可以试试你的建议。你可以发布一个例子吗?如果有效,我会将您的答案标记为正确。

基因,是的,原文件是.xls格式的,还没有升级到.xlsx。

共产国际,代码在最后一行代码停止执行,然后我使用即时窗口检查值并更改可见属性并再次检查值。


HansUp,解决了它。我将代码更改为:

Set objXLApp = New Excel.Application
DoEvents
Set objXLBook = objXLApp.Workbooks.Open(strReportPath & strTitle & ".xls")

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

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

【问题讨论】:

是否有原因代码使用早期绑定,但打开工作簿就像是后期绑定一样? 直接设置objXLApp,然后使用WorkBooks.Open方法打开文件,是否可以正常工作? 如果您使用的是 Office 2013,您的 Excel 表是“.xls”还是“xlsx”? 代码运行时是打开工作簿,还是运行代码打开工作簿? 【参考方案1】:

我的建议是先直接设置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

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

【讨论】:

是的,我也避免使用它们,但想尽量减少更改。我添加了一个全局公共子来包装 2 行代码并更改了其他 16 个引用。用户在重新运行报表时熟悉错误,他们必须在打开另一个实例之前关闭一个实例。这可能就是您所指的,但我会等待他们提出要求,然后再进行更多更改。顺便说一句,对象变量的作用域是全局级别的。

以上是关于Access 2013 VBA 自动化 Excel 丢失窗口的主要内容,如果未能解决你的问题,请参考以下文章

使用自动化/VBA 填充 Excel 时,Access O365 崩溃

通过 VBA 将查询从 Access 导入 Excel 并删除单个单元格

VBA 函数连接access以及excel,同时自动版本

从 Access 2010 VBA 打开 Excel 2010 文件

从 Access 2010 VBA 控制 Excel 工作簿

使用 vba 将 MS Access 查询输出到 Excel