Как вызвать сценарий Excel VBA с помощью xlwings v0.10

Раньше я использовал информацию в этом вопросе для запуска сценария VBA, который выполняет базовое форматирование после запуска кода Python.

Как мне вызвать макрос Excel из Python с помощью xlwings?

В частности, я использовал первое обновление.

from xlwings import Workbook, Application
wb = Workbook(...)
Application(wb).xl_app.Run("your_macro")

Сейчас я использую v0.10.0 xlwings, и этот код больше не работает.

Когда я пробую предложенный новый код для версии 0.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, добавляет некоторые формулы в лист и т. д.), которые я хочу запустить.

Я уверен, что мне не хватает чего-то основного здесь.

Обновление По предложению Феликса Цумштейна я попытался:

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.


person Budd    schedule 14.10.2016    source источник


Ответы (3)


Вам нужно использовать Book.macro. Как говорится в вашей ссылке на документы, App.macro предназначен только для макросов, которые не являются частью рабочей книги (т.е. надстроек). Так что используйте:

your_macro = wb.macro('your_macro')  # this maps the VBA code
your_macro()  # only this executes the VBA code
person Felix Zumstein    schedule 15.10.2016
comment
Я получаю тот же результат, когда использую wb.macro('your_macro). - person Budd; 16.10.2016
comment
Вы можете отправить мне образец рабочей книги (электронная почта находится на GitHub), и я изучу ее. - person Felix Zumstein; 17.10.2016
comment
Я обновил образец, включив в него сопоставление и вызов макроса. - person Felix Zumstein; 07.11.2016

У меня возникли проблемы, когда я обновил xlwings до версии 0.9+. Чтобы запустить макрос vba с xlwings, я использовал код, написанный ниже для запуска макросов внутри личной книги (PERSONAL.XLSB). Обновленный код №2 Феликса у меня не работал, для макроса внутри личной книги.

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

Надеюсь, это поможет.

person kiki270    schedule 13.03.2018

Возможно, вы столкнулись с ситуацией, аналогичной указанной здесь: Возможна ошибка? xlwings не может запустить макрос Excel?

По какой-то причине макросы не работают должным образом, когда они не получают что-то в качестве параметра. Несмотря на то, что такой параметр не используется в макросе 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.')
person Armando    schedule 27.10.2016
comment
Согласно моему другому комментарию по другому вопросу: в этом нет необходимости. Пожалуйста, откройте вопрос на GH, чтобы решить его правильно. - person Felix Zumstein; 07.11.2016