首页 文章

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

提问于
浏览
2

我曾经使用这个问题中的信息来运行一个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输出的数据,在工作表中添加一些公式等),我想运行它 .

我确定我在这里缺少一些基本的东西 .

Update 根据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>

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

3 回答

  • 0

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

    your_macro = wb.macro('your_macro')  # this maps the VBA code
    your_macro()  # only this executes the VBA code
    
  • 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.')
    
  • 3

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

    希望它会有所帮助 .

相关问题