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