我曾经使用这个问题中的信息运行一个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脚本。
答案 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()
希望它会有所帮助。