2011-08-23 175 views
3

假设我在Access中有一些使用excel的VBA代码,无论出于何种原因。有时我无法正确关闭文件。VBA关闭Excel文件

的代码(我认为)应该看起来有点像这样:

WBO.Close savechanges:=True 
Set WBO = Nothing 

XLO.Application.Quit 
Set XLO = Nothing 

rs.Close 
db.Close 

这里XLO是Excel对象,WBO是一个工作簿对象中,RS是DAO记录和DB是一个DAO数据库。即使物理excel文件关闭,我的系统上仍然存在“EXCEL.EXE”进程,这阻止了我连续运行两次程序。有谁知道为什么发生这种情况?

编辑

我拿出rs.Close然后db.Close线,因为我决定手动从Access到Excel导出我所用的数据(有超过有效太多的行和列,每个单元格复制)。但是,这并没有改变手头的问题。

谢谢

杰西Smothermon

+2

你是如何声明XLO的?你如何启动Excel实例? – Banjoe

+2

确保您按照与创建方式完全相反的顺序关闭并设置为Nothing。确保你之后没有任何剩余的工作簿引用;比如对工作表的散列引用或任何范围。 – transistor1

+0

'XLO.Quit'是要走的路。 –

回答

3

没有实际Excel对象。 Application是顶级对象,但Application对象具有Application属性,该属性实际上指向“指定对象的创建者”。所以试图退出XLO.Application不会做你认为应该的。

。假定XLOExcel.Application类型,然后尝试只是代替XLO.QuitXLO.Application.Quit

+0

我通常会执行'XLO.Quit'以及;然而,技术上不是'XLO.Application.Quit'是同样的事情吗?如果我执行'Debug.Print xlo是xlo.Application',我会得到'True'作为响应;这意味着xlo与'xlo.Application'是同一个对象。 – transistor1

+0

XLO是一个Excel.Application,但是XLO.Quit似乎没有完全关闭所有东西。我忘了提及,当我在Excel项目中遇到错误时(因为我认为某些参考仍处于打开状态),并且手动关闭了Excel文件,我可以选择不保存它。一旦我这样做,程序运行良好。这使我认为“WBO.Close savechanges:= True”行有问题,但我不确定。谢谢 –

+0

@ transistor1 - 我相信你是对的。 “Application”属性似乎适用于OLE对象 – barrowc

0

为什么不干脆:

application.displayalerts = false 
WBO.save (or saveas whatever it matters) 
WBO.close 
set WBO = nothing 

我没有看到与内存的问题......

0

参考这个答案。
It worked for me.

Dim sKill As String 

sKill = "TASKKILL /F /IM msaccess.exe" 
Shell sKill, vbHide 

如果这样的作品,标志着该链接的答案用^,不是我的。