¿Usar Python para programar macros de MS Office?
excel vba (6)
Esta es una pregunta de hace mucho tiempo, pero la estoy planteando aquí para que otros puedan señalarla en su búsqueda.
Una opción no discutida aquí, que uso todo el tiempo, es crear un servidor COM de Python y llamarlo desde VBA en cualquier aplicación de Office. Hay un buen tutorial sobre cómo hacer un servidor COM con Python en: http://timgolden.me.uk/pywin32-docs/html/com/win32com/HTML/QuickStartServerCom.html
Lo que termina es un servidor COM (no olvide hacerlo en proceso) que puede crearse mediante una llamada a CreateObject()
en VBA. A continuación, llama a los métodos como lo hace con un objeto COM creado con CreateObject()
. No puede hacer un solo paso en su script de Python, pero puede interceptar el registro con win32traceutil desde la distribución de Pywin32. Funciona perfectamente.
Recientemente lo tomé como un proyecto para enseñarme cómo programar en Python. En general, debo decir que estoy impresionado con eso.
En el pasado, normalmente me he limitado a la programación en VBA principalmente para MS Excel (pero también un poco en MS Access y Word) y he tenido problemas para encontrar formas de hacer las cosas que Python puede hacer fácilmente con un solo comando.
Me preguntaba si existía una forma razonable de aprovechar la potencia de programación y la facilidad de Python, al mismo tiempo que utilizaba varias herramientas en Office (principalmente Excel).
Existe un conjunto de utilidades de Python multiplataforma, llamadas xlrd, xlwt y xlutils, para leer y escribir archivos de Excel. Existen algunas limitaciones (por ejemplo, no creo que puedan procesar macros), pero sí le permiten trabajar con archivos de Excel en plataformas que no son de Windows, si eso le sirve. Ver: http://www.python-excel.org/
Además, ya hay algunas preguntas que se ocupan de este tipo de temas, incluida esta: ¿existe una forma mejor (además de COM) de controlar de forma remota Excel?
Los paquetes xlrd, xlwt y xlutils mencionados anteriormente solo pueden leer y escribir archivos .xls que tienen limitaciones de tamaño de 65,000 filas y 256 columnas. Aparte de eso, es una buena herramienta.
Pero he pasado a otro paquete python-excel, OpenPyXL, que puede leer y escribir archivos .xlsx. También me resulta fácil de usar y la documentación es buena.
O echa un vistazo a IronPython. IPy es una implementación .NET nativa de Python 2.6, puedes encontrarla en http://www.codeplex.com/ironpython .
Lo hemos usado para varios proyectos. Puedes usarlo "desde afuera" usando COM o, como hacemos, escribir un AddIn de Excel con ScriptHost, que llama al código de IronPython para darte un entorno similar a VBA.
Al ser un dll de .NET, IPy se integra muy bien en la moderna pila .NET de Windows.
aquí hay un enlace útil:
http://continuum.io/using-excel
Pruebe Pyvot: un Python para / desde Excel Connector de Microsoft:
http://pytools.codeplex.com/wikipage?title=Pyvot
También me gusta mucho PTVS del mismo desarrollador. equipo, que proporciona la mejor depuración en Python que he experimentado hasta ahora.
2.
Lo que puedes hacer con VBA + Python es lo siguiente:
Compile sus scripts py que toman entradas y generan salidas como archivos de texto o desde la consola. Luego, VBA preparará la entrada para py, llamará al script py precompilado y leerá su resultado.
3.
Considere OpenOffice o LibreOffice que admiten scripts de Python.
Esto supone que las opciones disponibles con las interfaces de script COM o MS no satisfacen sus necesidades.
4.
Este no es un enfoque libre, pero vale la pena mencionarlo (presentado en Forbes y New York Times):
5.
Esto no es gratis para uso comercial:
PyXLL: complemento de Excel que permite llamar a las funciones escritas en Python en Excel.
Si, absolutamente. Desea utilizar el módulo win32com
, que es parte de pywin32 (obténgalo aquí ).
Descubrí que puedes simplificar la integración de Python al escribir una macro en VBA para que Python la use, y luego hacer que Python llame a la macro. Se verá algo como esto:
from win32com.client import Dispatch as comDispatch
xl = comDispatch(''Excel.Application'')
xl.Workbooks.Open("Macros.xls", False, True)
xl.Run("Macros.xls!Macro_1")
Estoy seguro de que hay muchos ejemplos en SO ... como este .