Python 为什么我的VBA功能不能正确关闭Access?

Python 为什么我的VBA功能不能正确关闭Access?,python,ms-access,vba,win32com,Python,Ms Access,Vba,Win32com,这个问题与我在这里发现的上一个问题有关: 为了解释我的问题,我将简要描述我正在尝试做的事情: 我使用python和tkinter制作了一个GUI,允许用户选择不同的搜索标准,然后将这些标准打印到一个.txt文件中。python代码然后使用以下代码启动Access实例: objAccess = win32com.client.Dispatch("Access.application") objAccess.Visible = True objAccess.OpenCurrentDatabase(f

这个问题与我在这里发现的上一个问题有关:

为了解释我的问题,我将简要描述我正在尝试做的事情:

我使用python和tkinter制作了一个GUI,允许用户选择不同的搜索标准,然后将这些标准打印到一个.txt文件中。python代码然后使用以下代码启动Access实例:

objAccess = win32com.client.Dispatch("Access.application")
objAccess.Visible = True
objAccess.OpenCurrentDatabase(filepath)
objAccess.DoCmd.RunMacro("Macro1")
宏是一个简单的运行码命令,函数名为My_Function。My_函数读取.txt文件,对数据库执行查询,生成报告并将报告以pdf格式保存在当前文件夹中,然后使用以下命令关闭Access:

DoCmd.Quit
我很确定这一切都按预期进行,直到我将python脚本和Access数据库中的文件移动到一个新文件夹。移动后,一切都会像以前一样运行,即Access打开一个窗口,根据用户输入生成报告,然后关闭。但与我移动文件之前不同的是,我在python 2.7中使用Spyder的python控制台报告了以下异常:

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数据库,除非我进入任务管理器,选择single Access后台进程并结束任务

简而言之:script+macro+函数执行我希望它执行的操作,但在我移动文件后,控制台会报告异常,Access bacground进程会延迟,并阻止我打开Access的新实例

Ps:我正在使用Windows 10和MS Office 2013


任何帮助都将不胜感激

谢谢你的评论,DanL。它让我走上了正确的道路。我认为这个问题是由于VBA函数在python脚本中objAccess仍然处于活动状态时关闭了DoCmd.Quit的Access造成的。请原谅我缺乏正确的术语,因为我对编程非常陌生

从VBA函数的末尾删除DoCmd.Quit,并在python代码中的RunMacro之后添加objAccess.Quit,得到了理想的结果

在我移动文件之前,我开始怀疑它是否正常工作


再次感谢你,DanL。

谢谢你,DanL,谢谢你的评论。它让我走上了正确的道路。我认为这个问题是由于VBA函数在python脚本中objAccess仍然处于活动状态时关闭了DoCmd.Quit的Access造成的。请原谅我缺乏正确的术语,因为我对编程非常陌生

从VBA函数的末尾删除DoCmd.Quit,并在python代码中的RunMacro之后添加objAccess.Quit,得到了理想的结果

在我移动文件之前,我开始怀疑它是否正常工作


再次感谢,DanL。

使用COM对象后,您是否正确地释放了它?据我的谷歌搜索告诉我,这是在Python中通过设置objAccess=None来完成的。使用COM对象后,您是否正确地释放了它?据我的谷歌搜索告诉我,这是在Python中通过设置objAccess=None来完成的。