L'exécution d'une macro Excel via Python?
Je suis en train de lancer une macro via python, mais je ne suis pas sûr de savoir comment le faire fonctionner...
J'ai le code suivant jusqu'à présent, mais cela ne fonctionne pas.
import win32com.client
xl=win32com.client.Dispatch("Excel.Application")
xl.Workbooks.Open(Filename="C:\test.xlsm",ReadOnly=1)
xl.Application.Run("macrohere")
xl.Workbooks(1).Close(SaveChanges=0)
xl.Application.Quit()
xl=0
J'ai le traceback:
Traceback (most recent call last):
File "C:\test.py", line 4, in <module>
xl.Application.Run("macrohere")
File "<COMObject <unknown>>", line 14, in Run
File "C:\Python27\lib\site-packages\win32com\client\dynamic.py", line 282, in _ApplyTypes_
result = self._oleobj_.InvokeTypes(*(dispid, LCID, wFlags, retType, argTypes) + args)
com_error: (-2147352567, 'Exception occurred.', (0, u'Microsoft Excel', u"Cannot run the macro 'macrohere'. The macro may not be available in this workbook or all macros may be disabled.", u'xlmain11.chm', 0, -2146827284), None)
MODIFIER
import win32com.client
xl=win32com.client.Dispatch("Excel.Application")
xl.Workbooks.Open(Filename="C:\test.xlsm",ReadOnly=1)
try:
xl.Application.Run("test.xlsm!testmacro.testmacro")
# It does run like this... but we get the following error:
# Traceback (most recent call last):
# File "C:\test.py", line 7, in <module>
# xl.Workbooks(1).Close(SaveChanges=0)
# File "C:\Python27\lib\site-packages\win32com\client\dynamic.py", line 192, in __call__
# return self._get_good_object_(self._oleobj_.Invoke(*allArgs),self._olerepr_.defaultDispatchName,None)
# com_error: (-2147352567, 'Exception occurred.', (0, None, None, None, 0, -2147352565), None)
except:
# Except isn't catching the above error... :(
xl.Workbooks(1).Close(SaveChanges=0)
xl.Application.Quit()
xl=0
- Peut-être ne pas utiliser le même nom pour le module et la méthode.
- Quelle est la définition de la macro? est ce qu'il a déclaré comme
Public sub testMacro
ouPrivate
? - Avez-vous besoin pour exécuter la macro à partir de Python? Peut facilement faire la même chose en Python de toute façon. Également utiliser quelque chose comme
del xl
plutôt quexl=0
pour bien se débarrasser de la référence à l'objet. - élaborer?
- Aucun des deux, C'est juste
Sub testMacro
- Ma feuille excel, les importations de données dans excel, pistes de 50+ formules sur elle, convertit des valeurs et de sorties au format CSV... je vais utiliser
del xl
aswell bien qu'. - ceci est similaire à ma question stackoverflow.com/questions/17446807/...
Vous devez vous connecter pour publier un commentaire.
Je m'attends à ce que l'erreur est de le faire avec la macro que vous êtes d'appel, essayez le code suivant:
Code
xls
et laxlsm
fichier, tout comme vous le feriez lorsque vous ouvrez un document excel manuellement..mais je n'ai pas essayéJ'ai fait quelques modification à la SMNALLY du code de sorte qu'il peut fonctionner en Python 3.5.2. C'est mon résultat:
Je soupçonne que vous n'avez pas autoriser votre Excel de l'installation pour exécuter une macro à partir d'un fichier Excel automatisé. C'est une protection de sécurité par défaut à l'installation. Pour changer cela:
Hmm, j'avais un peu de mal avec la partie (oui encore xD):
xl.Application.Run("excelsheet.xlsm!macroname.macroname")
cos im pas à l'aide d'excel souvent (même avec vb ou des macros, mais j'en ai besoin pour utiliser femap avec python) donc j'ai enfin résolu vérification de la liste des macros:
Développeur -> les Macros:
là, j'ai vu que: ce
macroname.macroname
devrait êtresheet_name.macroname
comme dans les "Macros" à la liste.(je passe à quelque chose comme 30min-1h à essayer de le résoudre, de sorte qu'il peut être utile pour les noobs comme moi dans excel) xD
macroname
n'est pas nécessairement associé à une fiche spécifique. Mais êtes-vous essayer d'exécutermacroname
sur une feuille spécifique nommésheet_name
?J'ai essayé le win32com façon et xlwings façon, mais je n'ai pas eu de la chance. J'utilise PyCharm et de ne pas le voir le .Classeur option dans l'auto-complétion pour win32com.
J'ai eu la -2147352567 erreur quand j'ai essayé de passer un classeur en tant que variable.
Puis, j'ai trouvé un travail autour de l'utilisation de vba shell pour exécuter mon script Python.
Écrire quelque chose sur le fichier XLS que vous travaillez avec, quand tout est fait. De sorte que Excel sait qu'il est temps d'exécuter la macro VBA.
Mais l'Application vba.fonction d'attente peut prendre jusqu'à 100% de cpu qui est bizarre. Quelques personnes ont dit que l'aide de la fonction de mise en Veille de windows serait-il fixer.
attendre Python pour terminer son travail.
Une variation sur SMNALLY du code qui ne veut pas quitter Excel si vous l'avez déjà ouvert:
Juste une note rapide avec une xlsm avec des espaces.
Pour Python de 3,7 ou plus tard,(2018-10-10), j'ai de combiner les deux @Alejandro BR et SMNALLY réponse, coz @Alejandro oubliez pas de définir wincl.