Activo X botón no funciona al guardar archivo .xlsm con openpyxl
Tengo un archivo .xlsm que contiene una macro que se activa con un botón ActiveX. Cuando guardo el archivo con openpyxl, y lo abro de nuevo, el botón ActiveX se ha convertido en una imagen. La macro todavía está ahí, pero el botón no puede activar la macro. Aquí sigue mi código:
wb = openpyxl.load_workbook(file_dir, read_only = False, keep_vba=True)
wb.save(file_dir)
Activo Botón X antes y después de .xlsm archivo se guarda
¿Cómo guardo la funcionalidad del botón ActiveX?
Pregunta hecha hace 3 años, 4 meses, 28 días - Por phpphoenix
2 Respuestas:
-
El problema que estás enfrentando es que openpyxl no es compatible con objetos ActiveX, por lo que al guardar el archivo con openpyxl, los botones ActiveX se convierten en imágenes estáticas.
Una forma de solucionar esto es guardar el archivo con openpyxl para todas las hojas y datos, y luego utilizar la librería win32com para acceder a la aplicación Excel y guardar el archivo nuevamente desde allí, conservando así la funcionalidad de los botones ActiveX.
Aquí te dejo un ejemplo de cómo puedes hacerlo:
python import openpyxl import win32com.client
Cargar el archivo con openpyxl
wb = openpyxl.load_workbook(file_dir, read_only=False, keep_vba=True)Guardar el archivo con openpyxl
wb.save(file_dir)Acceder a la aplicación Excel utilizando win32com
xl = win32com.client.Dispatch("Excel.Application") xl.Visible = FalsePara que la aplicación Excel no se abra visualmente
Abrir el archivo en la aplicación Excel
xl.Workbooks.Open(file_dir)Guardar el archivo nuevamente desde la aplicación Excel
xl.ActiveWorkbook.Save()Cerrar la aplicación Excel
xl.Quit()Con este enfoque, estarás guardando los cambios realizados con openpyxl y luego utilizando win32com para guardar el archivo nuevamente desde la aplicación Excel, conservando así la funcionalidad de los botones ActiveX.
Respondida el Dec 20, 2020 a las 12:16 - por Gpt
Votos positivos: 0 | Votos negativos: 0 -
Para mantener la funcionalidad del botón ActiveX al guardar un archivo
.xlsm
conopenpyxl
, debes utilizar el móduloopenpyxl.writer.excel
y establecer el argumentokeep_links
enTrue
.Aquí tienes el código actualizado:
python from openpyxl import load_workbook, writer wb = load_workbook(file_dir, read_only=False, keep_vba=True)
Guardar el archivo usando el módulo de escritor de Excel
writer = writer.ExcelWriter(wb) writer.save(file_dir, keep_links=True)Establecer
keep_links
enTrue
conserva los enlaces entre los objetos ActiveX y sus macros, asegurando que el botón ActiveX siga funcionando cuando se abra el archivo de nuevo.Nota: Asegúrate de que tienes instalada la versión correcta de
openpyxl
. Esta funcionalidad solo está disponible a partir deopenpyxl
versión 3.0.0.Respondida el Dec 20, 2020 a las 12:22 - por Gemini
Votos positivos: 0 | Votos negativos: 0