基于xlam加载项创建关联xlwings UDF/宏的按钮的技术咨询
实现xlwings UDF关联的xlam加载项按钮方案
刚好之前做过类似的xlwings加载项开发,给你一套完整的落地方案,亲测能跑通:
1. 搭建xlam加载项基础
- 新建一个空白Excel工作簿,直接另存为Excel加载项(*.xlam),建议存到Excel默认的加载项文件夹(路径可通过
文件->选项->信任中心->信任中心设置->受信任位置查看,选其中的加载项文件夹,后续启用更方便)。 - 按
Alt+F11打开VBA编辑器,右键左侧工程窗口里的xlam工程,重命名成辨识度高的名字(比如XlwingsCustomAddin),避免和其他加载项混淆。
2. 导入xlwings核心VBA模块
要让xlam能调用Python函数,必须先把xlwings的VBA模块导入进来:
- 在VBA编辑器里,右键xlam工程,选择导入文件,找到你本地Python环境下的
xlwings.bas文件(一般路径是Lib/site-packages/xlwings/VBA/xlwings.bas,虚拟环境就去对应虚拟环境的site-packages里找)。 - 导入后,打开
xlwings模块,找到SetPythonPath函数,把里面的路径改成你本地的Python解释器路径——如果是虚拟环境,一定要填虚拟环境里的python.exe路径,比如:
Public Sub SetPythonPath() ' 修改成你的Python路径 PythonPath = "C:\MyVirtualEnv\Scripts\python.exe" End Sub
3. 编写关联Python函数的VBA宏
在xlam工程里新建一个标准模块(右键工程->插入->模块),命名为CustomMacros,然后写一个VBA宏,通过xlwings的RunPython方法调用你的Python函数:
Sub ExecuteMyPythonFunction() ' 可选:如果Python脚本和xlam不在同一路径,先切换到xlam所在目录 ChDir ThisWorkbook.Path ' 调用Python脚本里的函数,这里假设你的脚本叫my_python_functions.py,函数叫handle_excel_data RunPython "import my_python_functions; my_python_functions.handle_excel_data()" End Sub
注意:把你的Python脚本放到和xlam同目录下,或者确保脚本路径在Python的搜索路径里,不然会报导入错误。
4. 给加载项添加可点击的按钮
这里提供两种常用的按钮方案,选一种适合你的即可:
方案A:全局自定义工具栏按钮(所有Excel文件都能看到)
这种方案最实用,用户打开任何Excel都能在工具栏看到按钮:
- 先在VBA编辑器的工具->引用里,勾选
Microsoft Office xx.x Object Library(xx.x对应你的Office版本,比如2019就是16.0)。 - 新建一个标准模块
ToolbarManager,写代码创建和删除工具栏:
Sub CreateXlwingsToolbar() Dim customBar As CommandBar Dim runBtn As CommandBarButton ' 先删除已存在的同名工具栏,避免重复创建 On Error Resume Next CommandBars("Xlwings工具集").Delete On Error GoTo 0 ' 创建新的工具栏,位置放在顶部 Set customBar = CommandBars.Add(Name:="Xlwings工具集", Position:=msoBarTop, Temporary:=False) ' 添加第一个功能按钮 Set runBtn = customBar.Controls.Add(Type:=msoControlButton) With runBtn .Caption = "运行Python处理" ' 按钮上显示的文字 .FaceId = 100 ' 按钮图标ID,100是齿轮图标,你可以查Office图标ID换别的 .OnAction = "ExecuteMyPythonFunction" ' 关联到刚才写的VBA宏 .Style = msoButtonCaption ' 显示文字+图标,也可以选msoButtonIcon只显示图标 End With ' 让工具栏默认显示 customBar.Visible = True End Sub ' 卸载加载项时自动删除工具栏,避免残留 Sub RemoveXlwingsToolbar() On Error Resume Next CommandBars("Xlwings工具集").Delete On Error GoTo 0 End Sub
- 然后打开xlam的
ThisWorkbook模块,添加加载和卸载事件,自动触发工具栏的创建和删除:
Private Sub Workbook_Open() CreateXlwingsToolbar End Sub Private Sub Workbook_BeforeClose(Cancel As Boolean) RemoveXlwingsToolbar End Sub
方案B:加载项内部工作表按钮
如果只是在加载项的工作表里操作,可以用这种:
- 默认xlam的工作表是隐藏的,右键VBA工程里的工作表,选择取消隐藏,显示出工作表。
- 切换到Excel界面,点击开发工具->插入->按钮(窗体控件),在工作表上画一个按钮,松开鼠标后会弹出宏选择框,选
ExecuteMyPythonFunction,点击确定。 - 右键按钮,修改文字成你想要的,比如“运行Python脚本”。
5. 测试加载项
- 保存好xlam文件,打开Excel,通过
文件->选项->加载项->管理:Excel加载项->转到,勾选你刚才创建的xlam加载项,点击确定。 - 此时如果是方案A,顶部会出现自定义工具栏,点击按钮就能触发VBA宏,进而调用你的Python函数;如果是方案B,打开加载项的工作表点击按钮即可。
- 测试时如果报错,先检查Python路径是否正确,Python脚本是否在正确的路径,以及xlwings是否安装正常(可以在Python里运行
import xlwings验证)。
内容的提问来源于stack exchange,提问作者Chao Zhang
相关产品推荐
相关产品推荐

