我已经阅读了 xlwings 的 API 文档,并在解释器中使用了 Workbook 和 Sheet 对象,但我不知道如何从 Python 调用宏。
如何使用 xlwings 从 Python 调用 Excel 宏?
这尚未实现,但有一个未解决的问题,请参阅此处。同时,您可以像这样解决它(这是针对 Windows 的,但 Mac 版本也可以相应地工作,请再次参见 issue):
from xlwings import Workbook
wb = Workbook(...)
wb.application.xl_app.Run("your_macro")
更新:对于更新的版本,您必须执行以下操作:
from xlwings import Workbook, Application
wb = Workbook(...)
Application(wb).xl_app.Run("your_macro")
更新 2:现在从 >=v0.7.1 开始原生支持此功能。假设有一个 VBA 函数
YourMacro
可以对两个数字进行求和:
>>> import xlwings as xw
>>> wb = xw.Book(r'C:\path\to\mybook.xlsm')
>>> your_macro = wb.macro('YourMacro')
>>> your_macro(1, 2)
3.0
我将 xlwings 更新到 0.9+ 版本时遇到问题。 为了使用 xlwings 运行 vba 宏,我使用下面编写的代码在个人工作簿 (PERSONAL.XLSB) 中运行宏。 Felix 的更新代码 no2 对我来说不起作用,对于个人工作簿中的宏。
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()
希望能有所帮助。
我知道这是一个迟到的答案,但上面发布的所有方法都不适合我。 但我找到了另一种方法,使用 xlwings 提供的很棒的 api 接口。
这是我用来运行宏的代码:
xlApp = xw.App(visible=False)
wb= xw.books.open('.\\Path\\To\\File.xlsm')
a = xlApp.api.Application.Run("macroTest")
我的宏打开了一个 MsgBox 并返回值 1 只是为了测试,它运行得很好。 尽管应该避免使用 MsgBox,因为它是在后台打开的。
顺便说一句。 api 接口可用于许多(如果不是全部)对象,如果您习惯 VBA 编程,它真的很强大。
如果您已经打开了 Excel,还有另一种简单的方法。
xw.apps.active.macro('yourMacro')(1, 2)
在此处扩展@Felix Zumstein 的答案和所有其他答案,请确保您已禁用宏设置,因为稍后您可能会遇到 COM 问题。
您可以在下面进行更改,
文件 > 选项 > 信任中心 > 信任中心设置 > 宏设置 > 启用所有宏(不推荐...)
快速附加问题。 Felix Zumstein 的“Update2”答案对我有用。我可以使用“wb.macro('MyMacro')”调用 Excel 宏。但是,只有当 Excel 中的模块名称为“Module1”时,它才适用于我。如果我修改模块名称,然后尝试“wb.macro('MyModule.MyMacro')”,它不起作用,即使我发现的文献说我应该能够做到这一点(https:/ /docs.xlwings.org/en/latest/api/book.html#xlwings.Book.macro)。有什么想法吗?