Convertir archivos .xls a .xlsx en lote: VBA, Python y Power Automate
Un miembro de la comunidad tiene un sistema que genera archivos en formato .xls (Excel 97-2003) en una carpeta, y necesita convertirlos a .xlsx automáticamente. La pregunta: ¿cuál es la mejor herramienta para hacerlo?
Se plantean tres enfoques según el nivel de automatización que se necesite:
Enfoque 1: VBA (ejecución manual)
Ideal si el proceso se lanza a demanda. Una macro recorre la carpeta, abre cada .xls y lo guarda como .xlsx:
``
Sub ConvertXlsToXlsx()
Dim folderPath As String
Dim fileName As String
Dim wb As Workbook
With Application.FileDialog(msoFileDialogFolderPicker)
.Title = "Selecciona la carpeta con los archivos .xls"
If .Show = -1 Then
folderPath = .SelectedItems(1) & "\"
Else
Exit Sub
End If
End With
Application.ScreenUpdating = False
Application.DisplayAlerts = False
fileName = Dir(folderPath & ".xls")
Do While fileName <> ""
If LCase(Right(fileName, 4)) = ".xls" Then
Set wb = Workbooks.Open(folderPath & fileName)
wb.SaveAs folderPath & Left(fileName, Len(fileName) - 4) & ".xlsx", _
FileFormat:=xlOpenXMLWorkbook
wb.Close SaveChanges:=False
Kill folderPath & fileName
End If
fileName = Dir
Loop
Application.DisplayAlerts = True
Application.ScreenUpdating = True
MsgBox "Conversión completada.", vbInformation
End Sub
`
Se puede fijar el path de la carpeta en vez de usar FileDialog, y comentar la línea Kill si se quiere conservar el .xls original.
Enfoque 2: Python con pandas (sin necesitar Excel instalado)
Para quienes prefieren Python o trabajan en entornos sin Excel (servidores Linux, por ejemplo). Usa xlrd para leer .xls y openpyxl para escribir .xlsx:
`
import pandas as pd
from pathlib import Path
carpeta = Path("C:/ruta/a/la/carpeta")
for xls in carpeta.glob(".xls"):
df = pd.read_excel(xls, engine="xlrd")
df.to_excel(xls.with_suffix(".xlsx"), index=False, engine="openpyxl")
xls.unlink() # elimina el .xls original
`
Requiere: pip install pandas xlrd openpyxl
Y si se quiere vigilar la carpeta en tiempo real (proceso desatendido), la librería watchdog detecta automáticamente nuevos archivos:
`
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
import pandas as pd
from pathlib import Path
import time
class XlsHandler(FileSystemEventHandler):
def on_created(self, event):
if event.src_path.endswith(".xls"):
time.sleep(1)
xls = Path(event.src_path)
df = pd.read_excel(xls, engine="xlrd")
df.to_excel(xls.with_suffix(".xlsx"), index=False)
xls.unlink()
observer = Observer()
observer.schedule(XlsHandler(), "C:/ruta/a/la/carpeta")
observer.start()
observer.join()
``
Enfoque 3: Power Automate (totalmente desatendido en Windows)
Para quien prefiera solución sin código: crear un flujo de escritorio en Power Automate que detecte nuevos ficheros .xls en la carpeta y use la acción "Guardar como" de Excel para convertirlos a .xlsx. Ventaja: se puede programar con el Programador de tareas de Windows y no requiere tener Excel abierto permanentemente.
¿Cuándo usar cada uno?
| Enfoque | Requiere Excel | Desatendido | Multiplataforma |
|---------|---------------|-------------|-----------------|
| VBA | Sí | No | No |
| Python (pandas) | No | Sí (watchdog) | Sí |
| Power Automate | Sí | Sí | No |
Si los .xls tienen macros, formatos complejos o múltiples hojas con vínculos, VBA o Power Automate son más fieles porque usan el motor de Excel real. Python con pandas es perfecto para archivos de datos "planos" y tiene la ventaja de funcionar sin licencia de Office.
El problema: convertir .xls a .xlsx en lote
Un miembro de la comunidad tiene un sistema que genera archivos en el formato antiguo .xls (Excel 97-2003) dentro de una carpeta, y necesita convertirlos a .xlsx de forma automática. La pregunta es directa: ¿cuál es la mejor herramienta para hacerlo? La respuesta depende de cuánta automatización necesites. La comunidad planteó tres caminos, desde la macro manual hasta el proceso totalmente desatendido.
Enfoque 1: VBA (ejecución a demanda)
Ideal si lanzas la conversión cuando te hace falta. Una macro recorre la carpeta, abre cada .xls y lo guarda como .xlsx:
``` Sub ConvertXlsToXlsx() Dim folderPath As String Dim fileName As String Dim wb As Workbook
With Application.FileDialog(msoFileDialogFolderPicker) .Title = "Selecciona la carpeta con los archivos .xls" If .Show = -1 Then folderPath = .SelectedItems(1) & "\" Else Exit Sub End If End With
Application.ScreenUpdating = False Application.DisplayAlerts = False
fileName = Dir(folderPath & "*.xls")
Do While fileName <> "" If LCase(Right(fileName, 4)) = ".xls" Then Set wb = Workbooks.Open(folderPath & fileName) wb.SaveAs folderPath & Left(fileName, Len(fileName) - 4) & ".xlsx", _ FileFormat:=xlOpenXMLWorkbook wb.Close SaveChanges:=False Kill folderPath & fileName End If fileName = Dir Loop
Application.DisplayAlerts = True Application.ScreenUpdating = True
MsgBox "Conversion completada.", vbInformation End Sub ```
Puedes fijar la ruta de la carpeta en vez de usar el selector, y comentar la línea Kill si quieres conservar el .xls original.
Enfoque 2: Python con pandas (sin necesitar Excel instalado)
Para quien prefiera Python o trabaje en entornos sin Excel (por ejemplo, servidores Linux). Lee el .xls con xlrd y escribe el .xlsx con openpyxl:
``` import pandas as pd from pathlib import Path
carpeta = Path("C:/ruta/a/la/carpeta")
for xls in carpeta.glob("*.xls"): df = pd.read_excel(xls, engine="xlrd") df.to_excel(xls.with_suffix(".xlsx"), index=False, engine="openpyxl") xls.unlink() ```
Instalación: pip install pandas xlrd openpyxl. Y si necesitas vigilar la carpeta en tiempo real (proceso desatendido), la librería watchdog detecta los archivos nuevos automáticamente y lanza la conversión en cuanto aparecen.
Enfoque 3: Power Automate (desatendido, sin código)
Para quien prefiera una solución sin programar: un flujo de escritorio en Power Automate que detecte los nuevos ficheros .xls en la carpeta y use la acción "Guardar como" de Excel para convertirlos. La ventaja es que se puede programar con el Programador de tareas de Windows y no requiere tener Excel abierto de forma permanente.
¿Cuándo usar cada uno?
| Enfoque | Requiere Excel | Desatendido | Multiplataforma | |---|---|---|---| | VBA | Sí | No | No | | Python (pandas) | No | Sí (watchdog) | Sí | | Power Automate | Sí | Sí | No |
Conclusión
Si los .xls tienen macros, formatos complejos o varias hojas con vínculos, VBA o Power Automate son más fieles porque usan el motor real de Excel. Python con pandas brilla con archivos de datos planos y tiene la gran ventaja de funcionar sin licencia de Office, perfecto para automatizar en un servidor. No hay una única respuesta correcta: depende de si buscas ejecutar a demanda, vigilar la carpeta o montar un proceso totalmente autónomo. Este tipo de debates prácticos, con varias herramientas comparadas, es lo que hace tan útil la comunidad de Influexcel.
Más contenido de Excel en InflueXcel
- Cuenta clientes y cervezas en Excel 🍺 Caso "La Taberna: El Poney Pisador" (Nivel 1) Tutorial🍺 Noche cerrada en Bree. Frodo, Sam, Merry y Pippin cruzan la puerta de El Poney Pisador huyendo de los Jinetes Negros: la sala está a reven
- SUMAR.SI.CONJUNTO en acción con El Señor de los Anillos 🃏 El 21 de La Comarca TutorialLo que practicamos en este caso: • Contar cartas por palo con CONTAR.SI • Sumar valores con condiciones (SUMAR.SI / SUMAR.SI.CONJUNTO) • Apl
- Reto de Excel: El cumpleaños de Bilbo 🎂 | CONTAR.SI y SUMAR.SI desde cero (Nivel 1) TutorialEn La Comarca se celebra el cumpleaños número 111 de Bilbo Bolsón: cerveza, pasteles, fuegos artificiales… y algún curioso escondido tras el
- ¡Excel PowerQuery Hack! Conexiones con rutas relativas en 10 minutos! Tutorial¿Harto de ajustar las conexiones en PowerQuery cada vez que compartes tu archivo de Excel? 🙄 Convierte las conexiones de PowerQuery con ruta
- Mejora un 90% el rendimiento de Power Query con SQLite TutorialPower Query es una herramienta potente para consolidar, combinar y calcular datos, pero cuando trabajamos con millones de registros y calcul
- Reorganizar tablas mensuales: cruzar por persona buscando en vertical y en horizontal CasoNuevo caso interesante de la comunidad. Juan tenía varias tablas mensuales (a veces más de una en el mismo mes) y quería reorganizarlas por
- Un dato de todas las hojas, escrito una sola vez CasoEsta semana surgió en la comunidad un reto muy habitual cuando un libro tiene muchas hojas: mostrar el valor de la celda B3 de cada hoja, in
- Un índice de hojas que se genera solo: HYPERLINK en rangos desbordados CasoEsta semana surgió en la comunidad un pequeño "expediente X". Un miembro llegó tras ver un vídeo con una idea clara en la cabeza: montar una
- Reformatear un código alfanumérico al teclear: de NN1234567 a NN-12345-67 CasoEsta semana surgió en la comunidad una duda muy práctica: cómo conseguir que al escribir un código tipo NN1234567 (dos letras seguidas de si
- Reclasificación contable: duplicar cada fila con una conversión distinta por columna, en un único bloque CasoInteresante reto contable planteado esta semana por un miembro de la comunidad. Juan parte de una tabla de apuntes contables (rango C7:P10)