用于运行ms-Access模块​​子例程的Python代码

我是编程新手,这是我在*上的第一个问题.我试图让python打开一个.accdb文件并运行一个已经在Access中定义的子程序.我设法使用此代码使用Excel执行此操作:

import win32com.client
xl=win32com.client.Dispatch("Excel.Application")
xl.Visible=True
xl.Workbooks.Open(Filename="<mydirectory>\\open",ReadOnly=1)
xl.Application.Run("TestMe")
#...access spreadsheet data...
xl.Workbooks(1).Close(SaveChanges=0)
xl.Application.Quit()
xl=0

Sub TestMe看起来像这样:

Sub TestMe()
MsgBox "Hi there"
End Sub

运行Python代码会启动Excel,打开文件open.xlsm并显示一个消息框.到现在为止还挺好.谢谢:Need skeleton code to call Excel VBA from PythonWin

我已经修改了代码以尝试使用Access实现相同的功能.我创建了一个名为“testdb”的新的.accdb文件,并将上面的子程序“TestMe”复制到VBA模块中.修改后的python代码如下所示:

import win32com.client
xl=win32com.client.Dispatch("Access.Application")
xl.Visible=True
xl.OpenCurrentDatabase("<mydirectory>\\testdb.accdb")
xl.Application.Run("TestMe")
#...access spreadsheet data...
xl.Workbooks(1).Close(SaveChanges=0)
xl.Application.Quit()
xl=0

主要的变化是“Workbooks.Open”已更改为“OpenCurrentDatabase”.我首先尝试找到更类似的东西,比如“Databases.Open”,但没有运气.运行新代码启动Access并打开文件testdb.accdb,但就是这样,不会出现任何消​​息框.我唯一感兴趣的唯一控制台输出是:

xl.Application.Run("TestMe")
File "<COMObject <unknown>>", line 14, in Run

result = self._oleobj_.InvokeTypes(*(dispid, LCID, wFlags, retType,        argTypes) + args)
pywintypes.com_error: (-2147352567, 'Exception occurred.', (0, None, None, None, 0, -2147352562), None)

我很茫然.任何帮助将不胜感激!

解决方法:

考虑使用RunCode操作创建一个新的Access宏对象,该操作调用模块中的函数.然后,使用DoCmd.RunMacro方法在Python的Windows COM API中调用宏.

MACRO

Macro
RunCode: TestMe()

注意:除非您创建调用子例程的VBA模块函数,否则只能使用RunCode而不是子例程引用函数:Call SubroutineName:

Python

import win32com.client
ac = win32com.client.Dispatch("Access.Application")
ac.Visible=True
ac.OpenCurrentDatabase("<mydirectory>\\testdb.accdb")
ac.DoCmd.RunMacro('MacroName')

ac.DoCmd.CloseDatabase
ac = None
上一篇:错误xlPrimary在Python win32com中没有定义


下一篇:python – Windows身份验证代码现在不再有效