2016-10-23 1 views
2

J'ai un problème pour obtenir xlwings pour exécuter une macro à partir de Python. Malgré le code de la documentation de xlwings, je ne peux pas obtenir xlwings pour exécuter une macro Excel. Par exemple, dans le classeur Excel nommé "Book.xlsm":Bug possible? xlwings ne peut pas exécuter une macro Excel?

' in Excel workbook Book.xlsm 
Sub Test() 
    Set ws = Worksheets("ABC") 
    ws.Range("A1").Value = 10 
End Sub 

Cette macro s'exécute dans Excel. Mais lorsque j'essaie d'appeler ce module à partir de Python, il échoue:

# in Python 
import xlwings 

wb = xlwings.Book('C:\\Book.xlsm') 
wb.macro('Test') 
print('done.') 

Aucun message d'erreur. Le code Python s'exécute juste et se termine, en imprimant le message "terminé". mais quand je vérifie la feuille de travail ABC, rien n'est écrit. Veuillez noter que je suis capable de me connecter à ce classeur et de changer les valeurs des cellules en utilisant xlwings. Je ne peux pas l'obtenir pour exécuter la macro Test.

Notez également que j'ai utilisé un xlwings beaucoup plus ancien (avant 0.7.0, je pense) avant et il fonctionne mes macros sans problèmes. J'utilise la version 0.10.0 maintenant.

+0

Êtes-vous d'enregistrer le classeur après avoir exécuté la macro à partir de Python? La macro est-elle dans l'espace de noms de la feuille de calcul "ABC" ou dans l'espace de nom du classeur? – cco

+0

est-ce que c'est dans un module VBA ou non? –

+0

Oui, le sous-programme de test est dans un module VBA. J'espère avoir raison. J'ouvre l'éditeur VBA, puis choisissez Insérer un module sous le nom du classeur. La sous-routine de test est dans le Module1, pas dans n'importe quelle feuille de calcul. Je essayé d'utiliser un nom de sous-programme inexistant (comme « XYZ ») en Python, tels que: wb.macro (XYZ) mais mon code fonctionne toujours et sort sans aucun message d'erreur. – Chris

Répondre

1

les opérations suivantes:

Dans VBA:

Sub Test(number) 
    Set ws = Worksheets("Hoja1") 
    ws.Range("A1").Value = number 
End Sub 

En python:

import xlwings as xw 
wb1 = xw.Book('Libro1.xlsm')  
macro=wb1.macro('Test') 
macro(10) 
print('done.') 
+0

Pouvez-vous expliquer votre réponse au lieu de simplement jeter du code ici? – Robert

+0

Le code est si simple qu'il est explicite. Chris a raison de dire que sa macro ne s'exécute pas et n'imprime pas la valeur 10 dans la cellule 'A1'. Ce que je veux dire c'est que la macro s'exécute mais quand elle reçoit la valeur en paramètre. – Armando

+0

@Armando. Travaux! L'inconvénient est dans mon sous-programme réel (qui n'a pas d'arguments), je dois ajouter un argument factice/inutilisé, de sorte que xlwings est capable d'exécuter ma macro en passant une valeur en argument. Mais c'est une question triviale dans ma demande. Merci encore. – Chris