python excel excel-vba xlwings vba

¿Cómo llamo a una macro de Excel desde Python usando xlwings?



excel-vba vba (3)

Leí los documentos de la API para xlwings y jugué con los objetos Libro y Hoja en el intérprete, pero no puedo entender cómo llamar a una macro desde Python.

¿Cómo uso xlwings para llamar a una macro de Excel desde Python?


Esto aún no está implementado, pero hay un problema abierto para eso, mira here . Mientras tanto, puede solucionarlo de esta manera (esto es para Windows, pero la versión para Mac funciona en consecuencia, vea nuevamente en el here ):

from xlwings import Workbook wb = Workbook(...) wb.application.xl_app.Run("your_macro")

actualización : para versiones más recientes, debe hacer:

from xlwings import Workbook, Application wb = Workbook(...) Application(wb).xl_app.Run("your_macro")

Actualización 2 : esta funcionalidad ahora es compatible de forma nativa desde> = v0.7.1. Supongamos que hay una función VBA YourMacro que resume dos números:

>>> import xlwings as xw >>> wb = xw.Book(r''C:/path/to/mybook.xlsm'') >>> your_macro = wb.macro(''YourMacro'') >>> your_macro(1, 2) 3.0


Sé que es una respuesta tardía, pero todas las formas publicadas anteriormente no funcionaron para mí. Pero he encontrado otra forma, utilizando la impresionante interfaz api proporcionada por xlwings.

Aquí está mi código que solía ejecutar una macro:

xlApp = xw.App(visible=False) wb= xw.books.open(''.//Path//To//File.xlsm'') a = xlApp.api.Application.Run("macroTest")

Mi macro abrió un MsgBox y devolvió el valor 1 solo para prueba y funcionó muy bien. Aunque uno debe evitar usar MsgBox, ya que se abrió en segundo plano.

Por cierto. la interfaz api está disponible en muchos objetos (cuando no todos) y es realmente potente si está acostumbrado a la programación de VBA.


Tengo problemas cuando actualicé xlwings a la versión 0.9+. Para ejecutar vba macro con xlwings, utilicé el código escrito a continuación para ejecutar macros dentro del libro de trabajo personal (PERSONAL.XLSB). El código actualizado no2 de Felix no funcionó para mí, para macro dentro del libro de trabajo personal.

import xlwings wb = xw.Book(excel_file_path) app = wb.app # into brackets, the path of the macro macro_vba = app.macro("''PERSONAL.XLSB''!my_macro") macro_vba()

Espero que ayude.