Using Python to program MS Office macros?

Posted on

Question :

Using Python to program MS Office macros?

I’ve recently taken it as a project to teach myself how to program in Python. Overall, I must say that I’m impressed with it.

In the past I’ve typically stuck to programming in VBA mostly for MS Excel (but also a bit in MS Access and Word) and have struggled to find ways to make it do things that Python can easily do with a single command.

I was wondering if there were a reasonable way to harness the programming power and ease of Python while at the same time make use of the various tools in Office (mostly Excel)?

Asked By: Jesse


Answer #1:

There is a set of cross platform Python utilities – called xlrd, xlwt, and xlutils – for reading & writing Excel files. There are some limitations (e.g. I don’t think they can process macros), but they do allow you to work with Excel files on non-Windows platforms, if that’s of use to you. See:

Also, there are SO questions already dealing with this sort of topic, including this:
Is there a better way (besides COM) to remote-control Excel?

Answered By: GreenMatt

Answer #2:

Yes, absolutely. You want to use win32com module, which is part of pywin32 (get it here).

I’ve found you can really simplify Python integration by writing a macro in VBA for Python to use, and then just have Python call the macro. It will look something like this:

from win32com.client import Dispatch as comDispatch

xl = comDispatch('Excel.Application')
xl.Workbooks.Open("Macros.xls", False, True)

I’m sure there are plently of examples on SO… Like this one.

Answered By: Jason Coon

Answer #3:

Or have a look at IronPython. IPy is a native .NET implementation of Python 2.6, you can find it at

We have used it for several projects. You can use it “from the outside” using COM or – as we do – write a Excel AddIn with a ScriptHost, which calls out to IronPython code giving you an environment similar to VBA.

Being a .NET dll, IPy integrates extremely well into the modern Windows .NET stack.

Answered By: raindog

Answer #4:

The xlrd, xlwt, and xlutils packages mentioned above can only read and write .xls files which have size limitations of 65,000 rows and 256 columns. Aside from that it is a good tool.

But I have moved on to another python-excel package, OpenPyXL, which can read and write .xlsx files. Also I find it easy to use and the documentation is good.


Answered By: sequoia

Answer #5:

here is a useful link:

  1. Try Pyvot – A Python to/from Excel Connector from Microsoft:

I also really like PTVS from the same dev. team, which provides best debugging in Python that I experienced so far.


What you can do with VBA + Python is following:

Compile your py scripts that take inputs and generate outputs as text files or from console. Then VBA will prepare input for py, call the pre-compiled py script and read back its output.


Consider OpenOffice or LibreOffice which support Python scripts.

This is assuming that available options with COM or MS script interfaces do not satisfy your needs.


This is not free approach, but worth mentioning (featured in Forbes and New York Times):


This is not free for commercial use:

PyXLL – Excel addin that enables functions written in Python to be called in Excel.

Answered By: denfromufa

Answer #6:

This is a question from a long time ago, but I’m putting it here so others can point to it in their search.

One option not discussed here, which I use all the time, is to create a COM server from Python and call it from VBA in any Office application. There is a good tutorial of doing COM server with Python at:

What you end up with is a COM server (don’t forget to make it In Process) that can be created by a call to CreateObject() in VBA. You then call the methods on it as you do with an COM object created with CreateObject(). You can’t single step in your Python script, but you can intercept logging with win32traceutil from Pywin32 distribution. Works flawlessly.

Answered By: user7969

Leave a Reply

Your email address will not be published. Required fields are marked *