如何使用xlwings v0.10调用Excel VBA脚本

时间:2016-10-14 13:12:20

标签: python xlwings

我曾经使用这个问题中的信息运行一个VBA脚本,在运行我的python代码后执行一些基本的格式化。

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

具体来说,我使用了第一次更新。

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

现在我正在使用xlwings的v0.10.0,这段代码不再有效。

当我尝试为v0.10.0建议的新代码时:

wb.app.macro('your_macro')

Python返回一个对象:

<xlwings.main.Macro at 0x92d3198>

我的宏不能在Excel中运行。

文档(http://docs.xlwings.org/en/stable/api.html#xlwings.App.macro)有一个自定义函数示例,但我有一个脚本可以在Excel中执行多项操作(格式化我从python输出的数据,在工作表中添加一些公式等)我想跑。

我确定我错过了一些基本的东西。

更新 根据Felix Zumstein的建议,我试过:

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

这会返回与wb.app.macro相同的内容(&#39; your_macro&#39;):

<xlwings.main.Macro at 0x92d05888>

并且没有在Excel中运行VBA脚本。

3 个答案:

答案 0 :(得分:3)

您需要使用Book.macro。正如您对文档的链接所说,App.macro仅适用于不属于工作簿的宏(即插件)。所以使用:

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

答案 1 :(得分:0)

也许您面临的情况类似于此处所述:Possible bug? xlwings cannot run an Excel macro?

由于某些原因,当宏没有收到某些参数时,它们无法正常运行。即使VBA宏中未使用此参数,也需要参数。

示例:以下VBA和python代码可能无法运行:

Sub Test()
   Set ws = Worksheets("Hoja1")
   ws.Range("A1").Value = 10
End Sub

Python代码:

import xlwings as xw
wb1 = xw.Book('Libro1.xlsm')    
macro=wb1.macro('Test')
print('done.')

所以你必须做适当的改变。

VBA代码:

Sub Test(number)
 Set ws = Worksheets("Hoja1")
 ws.Range("A1").Value = 10
End Sub

Python代码:

import xlwings as xw
wb1 = xw.Book('Libro1.xlsm')    
macro=wb1.macro('Test')
macro(10)   #here value 10 is the dummy parameter sended to the vba macro
print('done.')

答案 2 :(得分:0)

当我将xlwings更新为0.9+版本时,我遇到了问题。要使用xlwings运行vba宏,我使用下面编写的代码在个人工作簿(PERSONAL.XLSB)中运行宏。对于我来说,Felix的更新代码no2并不适用于个人工作簿中的宏。

import xlwings

wb = xw.Book(excel_file_path)
app = wb.app
# into brackets, the path of the macro
macro_vba = app.macro("'PERSONAL.XLSB'!my_macro") 
macro_vba()

希望它会有所帮助。