Возможна ошибка? xlwings не может запустить макрос Excel?

У меня проблема с запуском xlwings макроса из Python. Несмотря на то, что я следую коду из документации xlwings, я не могу заставить xlwings выполнять макрос Excel. Например, в книге Excel с именем «Book.xlsm»:

' in Excel workbook Book.xlsm
Sub Test()
   Set ws = Worksheets("ABC")
   ws.Range("A1").Value = 10
End Sub

Этот макрос работает нормально в Excel. Но когда я пытаюсь вызвать этот модуль из Python, он терпит неудачу:

# in Python
import xlwings

wb = xlwings.Book('C:\\Book.xlsm')
wb.macro('Test')
print('done.')

Нет сообщений об ошибках. Код Python просто запускается и завершается, печатая сообщение «готово». но когда я проверяю рабочий лист ABC, ничего не пишется. Обратите внимание, что я могу подключиться к этой книге и изменить значения ячеек с помощью xlwings. Я просто не могу заставить его запустить тестовый макрос.

Также обратите внимание, что я использовал гораздо более старый xlwings (я думаю, до 0.7.0), и он запускает мои макросы без проблем. Сейчас я использую версию 0.10.0.


person cbsteh    schedule 23.10.2016    source источник
comment
Вы сохраняете книгу после запуска макроса из Python? Находится ли макрос в пространстве имен рабочего листа ABC или в пространстве имен рабочей книги?   -  person cco    schedule 23.10.2016
comment
то есть это в модуле VBA или нет?   -  person Felix Zumstein    schedule 23.10.2016
comment
Да, подпрограмма Test находится в модуле VBA. Надеюсь, я прав. Я открываю редактор VBA, затем выбираю «Вставить модуль» под именем книги. Подпрограмма Test находится в Module1, а не на каком-либо рабочем листе. Я попытался использовать несуществующее имя подпрограммы (например, «XYZ») в Python, например: wb.macro('XYZ'), но мой код все еще работает и завершается без каких-либо сообщений об ошибках.   -  person cbsteh    schedule 23.10.2016
comment
@Chris, ваша настоящая проблема в том, что wb.macro отображает только функцию/макрос VBA, вам нужно вызывать его отдельно: test = wb.macro('Test'), затем вызывать test()   -  person Felix Zumstein    schedule 07.11.2016
comment
@ФеликсЗумштейн. Отлично, спасибо. Об этом упоминалось в документации? Я не помню, чтобы в документации мы вызывали/выполняли такой макрос.   -  person cbsteh    schedule 18.11.2016


Ответы (1)


Попробуйте следующее:

В VBA:

Sub Test(number)
   Set ws = Worksheets("Hoja1")
   ws.Range("A1").Value = number
End Sub

В питоне:

import xlwings as xw
wb1 = xw.Book('Libro1.xlsm')    
macro=wb1.macro('Test')
macro(10)
print('done.')
person Armando    schedule 25.10.2016
comment
Можете ли вы объяснить свой ответ вместо того, чтобы просто сбрасывать сюда код? - person Robert; 25.10.2016
comment
Код настолько прост, что не требует пояснений. Крис прав, когда говорит, что его макрос не запускается и не печатает значение 10 в ячейке «А1». Я хочу сказать, что макрос запускается, но когда он получает значение в качестве параметра. - person Armando; 25.10.2016
comment
@Армандо. Работает! Недостатком моей настоящей подпрограммы (у которой нет аргументов) является добавление фиктивного/неиспользуемого аргумента, чтобы xlwings мог выполнить мой макрос, передав некоторое значение в качестве аргумента. Но это тривиальный вопрос в моем приложении. Спасибо еще раз. - person cbsteh; 26.10.2016
comment
@ Армандо, в этом нет необходимости. Не могли бы вы опубликовать образец книги в выпуске GitHub, чтобы мы могли решить эту проблему должным образом? Благодарность - person Felix Zumstein; 07.11.2016
comment
см.: github.com/ZoomerAnalytics/xlwings/issues/580 - person Felix Zumstein; 20.03.2019