我是编程新手,这是我在*上的第一个问题.我试图让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