【问题标题】:How do I call an Excel VBA script using xlwings v0.10如何使用 xlwings v0.10 调用 Excel VBA 脚本
【发布时间】:2017-02-23 22:34:27
【问题描述】:

我曾经使用这个问题中的信息来运行一个 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")

现在我正在使用 v0.10.0 的 xlwings 并且此代码不再有效。

当我尝试 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('your_macro') 相同的内容:

<xlwings.main.Macro at 0x92d05888>

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

【问题讨论】:

    标签: python xlwings


    【解决方案1】:

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

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

    【讨论】:

    • 当我使用 wb.macro('your_macro) 时得到相同的结果。
    • 你可以给我发一份样本工作簿(电子邮件在 GitHub 上),我会调查一下。
    • 我更新了示例以包含宏的映射和调用
    【解决方案2】:

    当我将 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()
    

    希望它会有所帮助。

    【讨论】:

      【解决方案3】:

      也许您正面临与此处所述类似的情况: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.')
      

      【讨论】:

      • 根据我对另一个问题的其他评论:这不应该是必要的。请在 GH 上打开一个 issue 以正确解决它。
      猜你喜欢
      • 1970-01-01
      • 2013-08-10
      • 1970-01-01
      • 2012-10-19
      • 2014-01-14
      • 2015-05-09
      • 2020-05-24
      • 1970-01-01
      • 2011-06-01
      相关资源
      最近更新 更多