Budd Budd - 1 year ago 149
Python Question

How do I call an Excel VBA script using xlwings v0.10

I used to use the info in this question to run a VBA script that does some basic formatting after I run my python code.

How do I call an Excel macro from Python using xlwings?

Specifically I used the first update.

from xlwings import Workbook, Application
wb = Workbook(...)
Application(wb).xl_app.Run("your_macro")


Now I'm using v0.10.0 of xlwings and this code no longer works.

When I try the suggested new code for v0.10.0:

wb.app.macro('your_macro')


Python returns an object:

<xlwings.main.Macro at 0x92d3198>


and my macro isn't run in Excel.

The documentation (http://docs.xlwings.org/en/stable/api.html#xlwings.App.macro) has an example that is a custom function but I have a script that does several things in Excel (formats the data I output from python, adds some formulas in the sheet, etc.) that I want to run.

I'm sure I'm missing something basic here.

Update
Based on Felix Zumstein's suggestion, I tried:

import xlwings as xw
xlfile = 'model.xlsm'
wb = xw.Book(xlfile)
wb.macro('your_macro')


This returns the same thing as wb.app.macro('your_macro'):

<xlwings.main.Macro at 0x92d05888>


and no VBA script run inside Excel.

Answer Source

You need to use Book.macro. As your link to the docs says, App.macro is only for macros that are not part of a workbook (i.e. addins). So use:

your_macro = wb.macro('your_macro')  # this maps the VBA code
your_macro()  # only this executes the VBA code