2008-12-06 13 views
2

J'ai besoin d'invoquer une macro VBA dans un classeur Excel à partir d'un script python. Quelqu'un d'autre a fourni le classeur Excel avec la macro. La macro récupère les valeurs mises à jour à partir d'une base de données externe et effectue un massage assez complexe des données. J'ai besoin des résultats de ce massage, et je ne veux pas vraiment le dupliquer dans mon script Python, si je peux l'éviter. Donc, ce serait génial si je pouvais simplement invoquer la macro de mon script, et récupérer les résultats massés.Besoin d'un code squelette pour appeler Excel VBA à partir de PythonWin

Tout ce que je sais sur COM J'ai appris de "Programmation Python sur Win32". Bon livre, mais pas assez pour ma tâche. J'ai cherché, mais je n'ai pas trouvé de bons exemples sur la façon de le faire. Est-ce que quelqu'un a de bons exemples, ou peut-être un code squelette de la façon d'aborder/invoquer la macro VBA? Une référence générale (livre, lien web, etc) sur les interfaces COM Excel serait également utile ici. Merci.

Répondre

0

Je suis désolé, je ne connais pas assez Python. Cependant, ce qui suit devrait aider.

L'objet Application d'Excel a une méthode Run qui prend le nom de la macro avec ses arguments.

Supposons que le classeur comporte une macro nommée test.

 

Sub test(ByVal i As Integer) 
MsgBox "hello world " & i 
End Sub 
 

Vous pouvez appeler cela en utilisant Application.Run "test", 1234

Ceci appellera la macro et de montrer le messagebox avec "bonjour le monde 1234".

+0

Merci. Cela aide certains. Du côté de pywin32, je cherche toujours quelque chose qui montre les étapes initiales pour l'ouverture du fichier, et référençant l'interface complète. PyWin32 montre plusieurs parties de la hiérarchie de l'interface qui supportent la méthode Run. – jbrogdon

6

OK, j'ai compris! Merci pour l'aide sur la méthode Application.Run. Cette information, plus le "Référence Visual Basic Microsoft Excel": http://msdn.microsoft.com/en-us/library/aa209782(office.10).aspx - comme recommandé par Hammond & Robinson dans "Programmation Python sur Win32" - était ce qui était nécessaire.

Voici le code squelette:

import win32com.client 
xl=win32com.client.Dispatch("Excel.Application") 
xl.Workbooks.Open(Filename="<your Excel File>",ReadOnly=1) 
xl.Application.Run("<your macro name>") 
#...access spreadsheet data... 
xl.Workbooks(1).Close(SaveChanges=0) 
xl.Application.Quit() 
xl=0