Вызов xlwings из функции Excel VBA вызывает ошибку

Вызов из EXCEL sub в python с использованием xlwings работает нормально, но при запуске этого же VBA через функцию VBA генерируется следующая ошибка:

    Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "c:\users\a112833\google drive\mytechtests\pulp\mymodule.py", line 13, in energySystemSimulator
    wb = Workbook.caller()
  File "C:\Python27\lib\site-packages\xlwings\main.py", line 233, in caller
    xl_app, xl_workbook = xlplatform.get_open_workbook(fullname, hwnd=sys.argv[4])
  File "C:\Python27\lib\site-packages\xlwings\_xlwindows.py", line 142, in get_open_workbook
    duplicate_fullnames = get_duplicate_fullnames()
  File "C:\Python27\lib\site-packages\xlwings\_xlwindows.py", line 124, in get_duplicate_fullnames
    for xl_app in get_xl_apps():
  File "C:\Python27\lib\site-packages\xlwings\_xlwindows.py", line 96, in get_xl_apps
    xl_app = get_xl_app_from_hwnd(hwnd)
  File "C:\Python27\lib\site-packages\xlwings\_xlwindows.py", line 73, in get_xl_app_from_hwnd
    return disp.Application
  File "C:\Python27\lib\site-packages\win32com\client\dynamic.py", line 522, in __getattr__
    raise AttributeError("%s.%s" % (self._username_, attr))
AttributeError: <unknown>.Application

Это работает:

Sub eSS()
    RunPython ("import mymodule; mymodule.eSS()")
End Sub

Это прерывает приведенную выше трассировку (игнорируйте fn. аргументы):

Function fnESS(x As Double, y As Double) As Double
    Call eSS
    fnESS = ActiveWorkbook.Sheets("Config").Range("T10")
End Function

Я проверил сигнатуру вызова, которая выглядит точно так же, используя подпрограмму VBA или вызов функции. Я не вижу, что вызывает ошибку.


person Chris Seeling    schedule 29.03.2016    source источник
comment
Я не понимаю, что вы подразумеваете под запуском VBA через функцию VBA. Можете ли вы добавить минимальный образец для воспроизведения этой проблемы?   -  person Felix Zumstein    schedule 29.03.2016
comment
@FelixZumstein Я добавил дополнительный вызывающий код VBA, также использую 64-разрядную версию Excel версии 15 - еще не уверен, что проблемы воспроизводятся для 32-разрядной версии.   -  person Chris Seeling    schedule 30.03.2016
comment
Вы звоните в fnESS с мобильного телефона?   -  person Felix Zumstein    schedule 30.03.2016
comment
@FelixZumstein Да, верно, ячейка содержит, например, =fnESS(2,4). Причиной такого подхода является использование функциональности DataTable в Excel.   -  person Chris Seeling    schedule 30.03.2016


Ответы (1)


Вы видите распространенную ловушку при написании пользовательских функций: Excel позволяет вам писать только в вызывающие ячейки, а не за их пределы. На самом деле это ограничение Excel.

xlwings может однажды предложить обходной путь, но на данный момент официальной поддержки для этого нет.

В качестве примечания: на самом деле вам может быть лучше писать UDF с помощью декораторов xlwings (по крайней мере, если вы используете только Windows), см. здесь.

person Felix Zumstein    schedule 30.03.2016