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

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

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

具体我用的是第一个更新

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 returns一个对象:

<xlwings.main.Macro at 0x92d3198>

我的宏不是 运行 Excel。

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

的 sheet 等中添加一些公式

我确定我在这里遗漏了一些基本的东西。

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

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

这 returns 与 wb.app.macro('your_macro'):

相同
<xlwings.main.Macro at 0x92d05888>

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

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

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

也许您正面临与此处所述类似的情况:

由于某些原因,当宏没有接收到某些参数时,它们无法 运行 正确设置。即使 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.')

我将 xlwings 更新到 0.9+ 版本时遇到问题。对于带有 xlwings 的 运行 vba 宏,我使用了下面为个人工作簿 (PERSONAL.XLSB) 中的 运行ning 宏编写的代码。 Felix 的更新代码 2 对我不起作用,因为个人工作簿中的宏。

import xlwings as xw

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()

希望对您有所帮助。