如何用xlwings或pywin32添加宏按钮?解决Buttons.Add无属性错误
使用xlwings为Excel宏添加按钮的问题与解决
问题说明
已通过Shape对象实现为宏添加按钮(调用test("shape")可正常运行),但尝试通过sheet1.api.Buttons.Add添加按钮时触发“无属性”错误,对应代码中button分支的三行标注FIXME的代码均无法执行。
原参考手动录制的VBA代码:
ActiveSheet.Buttons.Add(288, 44.25, 151.5, 32.25).Select
原因与修正方案
在Excel对象模型中,表单控件按钮属于Shapes集合的一部分,xlwings封装的Worksheet COM对象并未直接暴露Buttons属性,因此直接调用sheet1.api.Buttons会报错。正确做法是通过Shapes添加表单控件按钮(类型为xlButtonControl,枚举值为12),并通过对应属性设置宏关联与按钮文字。
修正后的完整代码:
import xlwings as xw def test_button(obj_type): wb = xw.books.add() wb.save("test.xlsm") sheet1 = wb.sheets["Sheet1"] if obj_type == "shape": # 保留原有效Shape按钮逻辑 sheet1.api.Shapes.AddShape(1, 100, 50, 150, 30) shape_names = [] for shape in sheet1.shapes: if shape.name not in shape_names: shape_names.append(shape.name) shape.characters.api.Text = f"Shape Name = {shape.name}" shape.api.OnAction = "sample_sub" print("shape names list:") print(shape_names) elif obj_type == "button": # 修正:通过Shapes添加表单控件按钮 button = sheet1.api.Shapes.AddFormControl(12, 288, 44.25, 151.5, 32.25) # 12对应xlButtonControl button.OnAction = "sample_sub" button.OLEFormat.Object.Caption = "sample button" else: raise ValueError(f"Invalid obj_type : {obj_type}") return wb # 关联的宏函数 @xw.sub def sample_sub(): wb = xw.Book.caller() sheet1 = wb.sheets["Sheet1"] sheet1.range("A1").value = "This is a test message."
关键修正点
- 替换
sheet1.api.Buttons.Add为sheet1.api.Shapes.AddFormControl(12, ...),12是Excel表单控件按钮的枚举值 - 设置按钮文字时,使用
button.OLEFormat.Object.Caption而非button.api.Text - 无需额外调用
.api,因为button本身已是Excel的COM Shape对象
内容的提问来源于stack exchange,提问作者renormalization
相关产品推荐
相关产品推荐

