为啥我的 VBA 函数没有正确关闭 Access?
Posted
技术标签:
【中文标题】为啥我的 VBA 函数没有正确关闭 Access?【英文标题】:Why doesn't my VBA function shut down Access properly?为什么我的 VBA 函数没有正确关闭 Access? 【发布时间】:2015-09-22 11:37:52 【问题描述】:这个问题与我之前在这里找到的问题有关:Python code for running ms-Access Module Subroutine
为了解释我的问题,我将简要描述我正在尝试做的事情:
我使用 python 和 tkinter 制作了一个 GUI,允许用户选择不同的搜索条件,然后将这些条件打印到 .txt 文件中。然后,python 代码使用以下代码启动 Access 实例:
objAccess = win32com.client.Dispatch("Access.application")
objAccess.Visible = True
objAccess.OpenCurrentDatabase(filepath)
objAccess.DoCmd.RunMacro("Macro1")
该宏是一个简单的“RunCode”命令,函数名称为 My_Function()。 My_Function() 读取 .txt 文件,对数据库执行查询,生成报告并将报告以 pdf 格式保存在当前文件夹中,然后使用以下命令关闭 Access:
DoCmd.Quit
我很确定这一切都按预期工作,直到我将文件(python 脚本和 Access 数据库)移动到一个新文件夹。移动后,一切都像以前一样运行,即 Access 打开一个窗口,根据用户输入生成报告,然后关闭。但与我移动文件之前不同,python 控制台(我正在使用带有 Python 2.7 的 Spyder)报告以下异常:
Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Python27\lib\lib-tk\Tkinter.py", line 1532, in __call__
return self.func(*args)
File "C:/Users/nx71/ProsjektreferanserPython/Test_final/GUI_02_norsk.py",
line 269, in buttonclick2
objAccess.DoCmd.RunMacro("Macro1")
File "<COMObject <unknown>>", line 3, in RunMacro
com_error: (-2147352567, 'Exception occurred.', (0, None, u'The | action was canceled.
', None, -1, -2146825787), None)
另外,运行脚本后,我无法通过双击图标打开任何Access数据库,除非我进入任务管理器,选择单个Access后台进程并“结束任务”。
简而言之:脚本+宏+函数做了我想要它做的事情,但是在我移动文件之后,控制台报告了一个异常并且一个 Access 后台进程徘徊并阻止我打开一个新的 Access 实例。
Ps:我使用的是 Windows 10 和 MS Office 2013。
任何帮助将不胜感激!
【问题讨论】:
COM 对象使用后是否正确释放?据我的谷歌搜索告诉我,这是在 Python 中通过设置 objAccess = None 来完成的。 【参考方案1】:感谢 DanL 的评论。它让我走上了正确的道路。我认为问题是由于 VBA 函数使用 DoCmd.Quit 关闭 Access 而 objAccess 在 python 脚本中仍然“活动”引起的(请原谅我缺乏正确的术语,因为我对编程很陌生)。
从 VBA 函数的末尾删除 DoCmd.Quit 并在 python 代码中的 RunMacro 之后添加 objAccess.Quit() 反而给了我想要的结果。
在我移动文件之前,我开始怀疑它是否能正常工作。
再次感谢 DanL。
【讨论】:
以上是关于为啥我的 VBA 函数没有正确关闭 Access?的主要内容,如果未能解决你的问题,请参考以下文章
Access 2010 VBA:为啥这个表单打开和关闭序列不起作用?
使用宏或 VBA 正确关闭 access 2003 中的隐藏窗口?
执行 vba DoCmd.OutputTo 命令以创建报告的 PDF 时,为啥 Access 会关闭/重新打开