Hola.
Te damos la bienvenida al Foro y, por favor, no dejes de leer la
Guía de supervivencia.
Te adjunto un archivo que es el que utilizo para lo que comentas pero en
Windows y con
muchos menos archivos a leer.
El archivo contiene una macro que es la que se encarga de recorrer todos los archivos de la carpeta que se le indique y si el archivo tiene extensión "ODS" o "XLS" lee la
misma celda de la misma hoja de cada uno de los archivos encontrados y pega la información obtenida en un nuevo archivo ODS mediante un enlace tipo
En mi caso decirte que me funciona (como máximo tengo que leer unos 60 archivos y tarda unos 15 segundos aproximadamente), ahora bien, en tu caso y al ser tantos miles te aconsejo que primero hagas pruebas con 100 o 200 archivos para ver qué tal y el tiempo que emplea en leerlos.
Este es el código:
Código: Seleccionar todo
REM *** BASIC ***
Option Explicit
Sub LeerCeldaArchivoCalc()
'Lee la misma celda de la misma hoja de todos los archivos ODS / XLS
'que se encuentren en la carpeta que se le especifique, pegando la
'información obtenida en un nuevo archivo ODS mediante un enlace
'tipo ='file:///D:/CARPETA/ARCHIVO_PRUEBAS_01.ods'#$Hoja1.A1
Dim EsteDoc As Object
Dim EstaHoja As Object
Dim NuevoDoc As Object
Dim NuevaHoja As Object
Dim Carpeta As String
Dim NomHoja As String
Dim NomCelda As String
Dim FilaActual As Long
Dim Archivo As String
Dim Extension As String
On Error Goto TRATAR_ERROR
EsteDoc = ThisComponent
EstaHoja = EsteDoc.CurrentController.ActiveSheet
With EstaHoja
Carpeta = UCase(.getCellRangeByName("B5").String)
NomHoja = UCase(.getCellRangeByName("B8").String)
NomCelda = UCase(.getCellRangeByName("B11").String)
End With
' Comprobamos que no esté vacía la RUTA del archivo
If Trim(Carpeta) = "" Or IsNull(Carpeta) Then
MsgBox "La RUTA de la CARPETA no debe estar VACÍA", 16, "¡Atención!"
Exit Sub
End If
If Right(Carpeta, 1) <> "\" Then
Carpeta = Carpeta & "\"
End If
If Trim(NomHoja) = "" Or IsNull(NomHoja) Then
MsgBox "El NOMBRE de la HOJA no debe estar VACÍO", 16, "¡Atención!"
Exit Sub
End If
If Trim(NomCelda) = "" Or IsNull(NomCelda) Then
MsgBox "La CELDA no debe estar VACÍA", 16, "¡Atención!"
Exit Sub
End If
'Creamos nuevo documento Calc donde se volcarán los resultados
NuevoDoc = StarDesktop.loadComponentFromURL("private:factory/scalc", "_blank", 0, Array())
NuevaHoja = NuevoDoc.Sheets(0)
FilaActual = 0
With NuevaHoja
.getCellByPosition(0, FilaActual).String = "ARCHIVO"
.getCellByPosition(1, FilaActual).String = "VALOR"
Archivo = Dir(Carpeta)
Do While Archivo <> ""
Extension = UCase(Right(Archivo, 3))
If (Extension = "ODS") Or (Extension = "XLS") Then
FilaActual = FilaActual + 1
.getCellByPosition(0, FilaActual).String = Carpeta & Archivo
.getCellByPosition(1, FilaActual).Formula = "=" & Chr(39) & "file:///" & Replace(Carpeta, "\", "/") & _
Archivo & Chr(39) & "#$" & NomHoja & "." & NomCelda
End If
' Leer el siguiente archivo
Archivo = Dir()
Loop
End With
MsgBox "Macro finalizada", 64, "¡Atención!"
Exit Sub
TRATAR_ERROR:
' Por si hubiera que tratar los posibles errores
MsgBox "Se ha producido un ERROR en la ejecución de la macro", 16, "¡Atención!"
End Sub
Por cierto, si un enlace da como resultado
#¡REF! es porque, o bien la celda no existe, o bien la hoja no existe. Esto ocurre, por ejemplo, si intentamos leer en un archivo
XLS una columna superior a la IV (256) o una fila superior a 65536 o en un archivo
ODS una columna superior a la AMJ (1024) o una fila superior a 1048576.
Saludos cordiales.
LibreOffice 6.4.6. Windows 10. Java 8 rev. 261 (64 bits)
Por favor, utiliza el Foro para tus consultas, no los mensajes privados
Si usas OpenOffice/LibreOffice trabaja y guarda en ODT, ODS, ODP, ... Y haz copias de seguridad.