Appel de macros Excel / Excel Solver de Python over com

J'ai une macro dans un file xlsm 2007 qui, lorsqu'il est appelé, crée une configuration de résolution (cible, contraintes, …) et exécute la résolution sans aucune interaction de l'user. Lorsqu'il est exécuté manuellement à partir d'Excel, cela fonctionne bien.

Je veux maintenant faire un script de Python sur com. Toutefois, lorsque le code Python appelle la macro solveur:

app.Run("runSolver()") 

Il échoue avec:

foobar.xlsm n'a pas réussi à résoudre, message d'erreur: erreur dans le model. Vérifiez que toutes les cellules et toutes les contraintes sont valides.

Si je définis un point d'arrêt dans mon environnement Python à l'appel à Run() , puis exécutez la macro manuellement à partir d'Excel, cela fonctionne bien, de sorte que la configuration du solveur ne peut pas se tromper.

Le message d'erreur est répertorié sur le site de résolution, mais je ne pense pas que cela s'applique car la feuille résout l'erreur manuellement.

Cette page suggère que l'environnement solveur n'est pas encore configuré lors de l'appel via com. Toutefois, en ajoutant

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

Comme la première ligne de ma macro de résolution résulte en plus générique:

  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) 

Alors, qu'est ce qu'il faut faire?


Modifier:

Je l'ai isolé d'un cas de test reproductible:

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

Fichier Excel: http://dl.dropbox.com/u/3142953/testsolver.xlsm (vous pouvez l'ouvrir avec Macros désactivé et inspecter le sous simple dans module1 pour vérifier qu'il est sécurisé).

J'ai finalement trouvé une solution après avoir posté sur le forum MSDN Excel Developers . Et la solution était énormément sortingviale:

Au lieu de courir le solveur comme tel:

 app.Run("runsolver()") 

Vous devez apparemment laisser tomber les parenthèses et l'exécuter ainsi:

 app.Run("runsolver") 

Allez comprendre.