如何从Python调用带参数的MS Access子程序/函数?
如何从Python直接调用带参数的Access VBA子程序/函数?
我已实现通过Python运行MS Access宏(宏会调用VBA函数),但Access宏不支持传递参数。想确认是否能直接从Python调用Access的VBA子程序或函数并传递参数,我尝试过用application.run但未成功。
现有代码示例
VBA代码
Public Function doNothing() MsgBox "Test" End Function
Access宏说明
Macro3:专门用于运行上述doNothing函数
Python代码
import win32api from win32com.client import Dispatch objAccess = Dispatch("Access.Application") objAccess.Visible = True objAccess.OpenCurrentDatabase(destinationName) # 通过宏调用可行(但无法传参) objAccess.DoCmd.RunMacro('Macro3') # 直接调用函数不可行 #objAccess.Run('doNothing') # 以下方式也不可行: #objDB = objAccess.CurrentDb() #objDB.Run('doNothing') objAccess.Application.Quit()
可行解决方案
要直接从Python调用Access的VBA函数并传递参数,需遵循以下规则:
- 确保VBA函数/子程序为Public(公共)权限,且存放于标准模块中(不能放在窗体、报表模块内)
- 使用
objAccess.Run时,若函数属于特定模块,需添加模块名前缀,格式为模块名.函数名 - 传递参数直接在
Run方法后按顺序追加即可
修正后的Python调用示例
假设doNothing函数位于名为Module1的标准模块中,修改Python代码如下:
import win32api from win32com.client import Dispatch objAccess = Dispatch("Access.Application") objAccess.Visible = True objAccess.OpenCurrentDatabase(destinationName) # 正确调用公共VBA函数 objAccess.Run("Module1.doNothing") # 若调用带参数的函数,比如Public Function greet(name As String) # objAccess.Run("Module1.greet", "张三") objAccess.Quit()
内容的提问来源于stack exchange,提问作者meisterhell
相关产品推荐
相关产品推荐

