为啥我的 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 会关闭/重新打开

Access 2010 VBA - 查询开始时打开的对话框,查询完成后关闭

在 Access VBA 中添加附件

为啥值没有从报告中导出 - Access 2007