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