如何使用Python调用Excel UserForm对象中嵌入的VBA宏
解决Python调用Excel内嵌VBA宏报错的方案
报错的核心原因是:控件的点击事件过程默认是私有(Private)的,且属于窗体/工作表等类模块的成员,不属于全局可直接访问的公共宏,同时调用路径规则和普通模块的宏不同,可根据你的控件所属场景选择对应方案:
场景1:按钮是嵌在工作表上的ActiveX控件
- 方案1(修改VBA代码适配调用):
打开对应工作表的代码页,将Private Sub CommandButton1_Click()修改为Public Sub CommandButton1_Click(),Python侧调用语法为:# 替换Sheet1为你的按钮实际所在的工作表名称 wb.macro("Sheet1.CommandButton1_Click")() - 方案2(无需修改VBA代码,模拟点击):
直接通过COM对象模拟按钮点击动作,不需要修改过程的私有属性:# 替换Sheet1为你的按钮实际所在的工作表名称 wb.api.Sheets("Sheet1").CommandButton1.Value = True
场景2:按钮是放在UserForm窗体里的控件
方案A:新增VBA公共调用入口(兼容性最好,无需修改Excel信任设置)
- 打开VBA编辑器,找到
UserForm1的代码页,将Private Sub CommandButton1_Click()前的Private修饰符删除,改为Public Sub CommandButton1_Click() - 插入一个标准模块(不要使用工作表/窗体/工作簿模块),添加如下公共过程:
Public Sub RunUserFormBtnClick() Dim frm As New UserForm1 ' 不需要显示窗体可直接调用方法,需要先显示窗体再触发则加一行frm.Show frm.CommandButton1_Click Set frm = Nothing End Sub - Python侧直接调用这个公共宏即可:
wb.macro("RunUserFormBtnClick")()
方案B:Python直接操作VBA对象模型(无需修改原有VBA代码)
需要先在Excel宏设置中勾选信任对VBA工程对象模型的访问(你之前的截图中未勾选该选项,这是必要前提),之后用如下Python代码调用:
from pywintypes import com_error from xlwings import App if __name__ == '__main__': excel_app = App(visible=True) wb = excel_app.books.open(r'C:\Users\kakkrah\Downloads\test.xlsm') try: # 获取窗体设计器对象,直接调用点击事件 form = wb.api.VBProject.VBComponents("UserForm1").Designer form.CommandButton1_Click() except com_error as ex: print(ex) wb.save() wb.close()
内容的提问来源于stack exchange,提问作者dev
相关产品推荐
相关产品推荐

