Вызов макросов Excel / Excel Solver из Python через com - PullRequest
3 голосов
/ 18 июля 2011

У меня есть макрос внутри файла 2007 xlsm, который при вызове создает конфигурацию решателя (цель, ограничения, ...) и выполняет решение без какого-либо взаимодействия с пользователем.При запуске вручную из Excel это работает нормально.

Теперь я хочу написать скрипт из Python через com.Однако, когда код Python вызывает макрос решателя:

app.Run("runSolver()")

Сбой:

foobar.xlsm не удалось решить, сообщение об ошибке: Ошибка в модели.Убедитесь, что все ячейки и ограничения действительны.

Если я установил точку останова в своей среде Python при вызове Run(), а затем запустил макрос вручную из Excel, он работает нормально, поэтомуКонфигурация решателя не может быть неправильной.

Сообщение об ошибке указано на веб-сайте решателя , но я не думаю, что оно применимо, так как лист решает вручную.

На этой странице предлагается , что среда решения еще не настроена при вызове через com.Однако добавление

Application.Run "Solver.xla!Solver.Solver2.Auto_open"

в качестве первой строки моего решающего макроса приводит к более универсальному:

  File "c:\python26\lib\site-packages\win32com\gen_py\00020813-0000-0000-C000-000000000046x0x1x6.py", line 35061, in Run
    , Arg26, Arg27, Arg28, Arg29, Arg30
  File "c:\python26\lib\site-packages\win32com\client\__init__.py", line 456, in _ApplyTypes_
        self._oleobj_.InvokeTypes(dispid, 0, wFlags, retType, argTypes, *args),
com_error: (-2147352567, 'Exception occurred.', (0, None, None, None, 0, -2146827284), None)

Так что же нужно сделать?


Редактировать:

Я выделил его для воспроизводимого теста:

Код Python:

from win32com.client import Dispatch
if __name__ == '__main__':
    app = Dispatch("Excel.Application")
    app.Visible = True
    app.Workbooks.Open(r'C:\path\to\testsolver.xlsm')
    app.Run("runsolver()")

Файл Excel: http://dl.dropbox.com/u/3142953/testsolver.xlsm (вы можете открыть его с отключенными макросами и проверить простую подпрограмму в module1, чтобы убедиться, что она безопасна).

1 Ответ

4 голосов
/ 21 июля 2011

Я наконец-то нашел решение после публикации на форуме разработчиков MSDN .И решение было безумно тривиальным:

Вместо того, чтобы запускать решатель вот так:

app.Run("runsolver()")

Вы, очевидно, должны снять скобки и запустить его так:1010 * Иди с цифрой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...