Leer un archivo Excel sin abrirlo con VBA
Resuelto
kenza
-
f894009 Mensajes publicados 17417 Fecha de registro Estado Miembro Última intervención -
f894009 Mensajes publicados 17417 Fecha de registro Estado Miembro Última intervención -
Hola,
deseo extraer los datos de un archivo Excel muy voluminoso (leer el archivo sin abrirlo).
los datos que quiero extraer contienen la siguiente información:
las celdas del campo código-tecno = '4GF'. --> [este campo se encuentra en la columna D]
¿Es posible ayudarme a encontrar una solución con VBA, por favor?
Agradezco de antemano su ayuda.
Atentamente,
Kenza
deseo extraer los datos de un archivo Excel muy voluminoso (leer el archivo sin abrirlo).
los datos que quiero extraer contienen la siguiente información:
las celdas del campo código-tecno = '4GF'. --> [este campo se encuentra en la columna D]
¿Es posible ayudarme a encontrar una solución con VBA, por favor?
Agradezco de antemano su ayuda.
Atentamente,
Kenza
14 respuestas
-
yg_be Mensajes publicados 23437 Fecha de registro Estado Colaborador Última intervención Embajador 1 588
Hola,
no veo muy bien cómo es posible sin abrirlo.-
-
-
Un archivo que tiene más de 1,000,000 de líneas, cuando intento abrirlo no puedo, así que es necesario usar un split para dividirlo. No quiero usar el split, por eso estoy buscando una forma de procesar este archivo.
En cuanto al formato del archivo, es la extensión csv.
Respecto a tu tercera pregunta, sí, hay que examinar toda la columna D y buscar la palabra '4GF', luego extraer las líneas completas (copiarlas en otro archivo de Excel, por ejemplo). -
-
-
-
Hola a los dos,
yg_be, ¿todo bien?
Kenza:
¿Qué Excel tenéis? -
-
Hola,
¡Siempre estamos obligados a abrir un archivo para acceder a su contenido!
Pretender que se puede acceder a un archivo cerrado es un error de lenguaje.
Se puede acceder a un archivo sin necesidad de cargarlo en una aplicación (a diferencia de Excel o de un editor de texto), por ejemplo, accediendo directamente al contenido con Open pathname For ... o abriendo un flujo con ADODB.Stream.
Entonces se puede usar una lectura línea por línea para extraer solo lo que se desea.
Tu solicitud es un poco vaga, ¿qué deseas extraer exactamente?
¿Solo los datos de un campo, varios campos, registros completos?
¿Cuáles son los criterios: igual a, que contiene, ...?
Dicho esto, CSV no es un formato estandarizado, es necesario precisar:
- el separador de registros (de líneas)
- el separador de campos (de celdas)
- el identificador de texto (para el caso en que un texto contenga uno de los separadores anteriores).
- el separador decimal (punto o coma)
- el separador de miles si se utiliza.
Atentamente
Patrice
Nadie puede poseer todo el saber, por eso lo compartimos.-
Sí, tienes toda la razón, solo que no he expresado bien mi problema.
Yo quiero extraer datos de un archivo de Excel sin tener que cargar el libro. Solo quiero hacer tratamientos en este archivo y recuperar datos sin abrirlo.
Respecto a los datos que quiero extraer:
Existe un campo que se llama code_techno, este campo se encuentra en la columna D y contiene varias informaciones; yo quiero aplicar un filtro sobre este campo y dejar solo la información "4GF". Después, quiero copiar todas las demás columnas y pegarlas en otro archivo de Excel.
Gracias por tu ayuda @patrice :D
-
-
Re hola a todos
Kenza:
dades de un archivo excel
Es un archivo csv (texto) o Excel porque cambian entre los dos según el momento
¿Conocen la programación VBA?-
-
-
-
-
«Todos los campos están separados por "' ; '" »
Esto confirma que este archivo "csv" no está en formato "clásico", csv significa en francés, valores separados por comas.
Por lo tanto, es importante responder a todas las preguntas, incluida la de f894009.
En general, las reglas son las siguientes:
- el separador de líneas es el par CR LF (13 10 o en hexadecimal 0D 0A) pero puede ser simplemente CR o LF.
- el separador de campos es la coma, pero en medio francófono a menudo es el punto y coma, especialmente cuando la coma se utiliza como separador decimal.
- el identificador de texto es la comilla inglesa (" ) pero a veces es el apóstrofo ('). No siempre se utiliza. Es obligatorio cuando un campo contiene un separador de líneas y/o un separador de campos, en este caso si el campo contiene un identificador de texto este se dobla. A veces se coloca sistemáticamente en todos los campos.
- el separador decimal es el punto, pero cuando el separador de campos es el punto y coma, el separador decimal suele ser la coma.
- el separador de miles es el apóstrofo (') pero no siempre se utiliza y cuando el separador decimal es la coma, el separador de miles es el espacio.
- algunos csv pasan a la siguiente grabación (a la línea) cuando todos los campos siguientes están vacíos, de ahí la pregunta de f894009 sobre el número de campos en cada línea.
Como puedes ver, no hay un csv estándar, de ahí la importancia de conocer con precisión la estructura de tu archivo. Esto requiere analizar el archivo con un editor de texto y de código hexadecimal.
Por otra parte, para extraer las líneas, es necesario conocer con precisión los criterios de extracción.
Edit: CR significa retorno de carro y LF línea siguiente, como en las antiguas máquinas de escribir.
-
-
-
¿Te ayudaría tener un código VBA que cree otro archivo CSV, con solo las líneas que tienen code_techno = 4GF?
- sugerencia:
Option Explicit Sub kenza4gf() Dim archivo_origen As String Dim archivo_destino As String Dim numin As Long, numout As Long, valss() As String, linea As String archivo_origen = ThisWorkbook.Path + "\archivo.csv" archivo_destino = ThisWorkbook.Path + "\archivo4gf.csv" numin = FreeFile 'abre el archivo en lectura Open archivo_origen For Input As #numin numout = FreeFile Open archivo_destino For Output As #numout 'bucle mientras no se haya alcanzado el final del archivo While Not EOF(numin) Line Input #numin, linea valss = Split(linea, ";", 5) If UBound(valss) > 2 Then If valss(3) = "4GF" Then Print #numout, linea End If End If Wend Close #numin 'cierre Close #numout End Sub
-
-
Bonjour
Un exemple avec un flux :
https://mon-partage.fr/f/6rAx7eFH/
Le code :'———————————————————————————————————————————————————————————————————————————————————————————————————————————————— ' Module : mImportCsvFiltre ' Objet : Lecture et filtrage ligne à ligne d'un gros fichier cvs UTF8 '———————————————————————————————————————————————————————————————————————————————————————————————————————————————— ' 21/12/2020 Patrice33740 V1-0-00 Création ' ' Établir la référence à ADODB : Microsoft ActiveX Data Objects 6.1 Library ' Option Explicit ' ' Séparateurs Const sepL$ = vbCrLf 'séparateur de lignes Const sepV$ = ";" 'séparateur de valeurs Const idTxt$ = """" 'identificateur de texte chr(34) ' Sub Lire_csv_UTF8_filtre() ' Choix et lecture du fichier csv en filtrant ' Dim wbk As Workbook Dim nomComplet As Variant, colonne As Long, filtre As Variant On Error Resume Next colonne = Feuil1.Columns(Feuil1.Range("E4").Value).Column If Err <> 0 Then MsgBox "Colonne erronée", vbCritical: Exit Sub On Error GoTo 0 If Feuil1.Range("E5").Text = "" Then MsgBox "Préciser la valeur à filtrer", vbExclamation: Exit Sub filtre = Feuil1.Range("E5").Value ' Choix fichier nomComplet = ChoisirFichier(".csv", ThisWorkbook.Path & "\") If nomComplet = "" Then Exit Sub Set wbk = Lire_Filtrer_csv_UTF8(nomComplet, colonne, filtre) wbk.Saved = True End Sub Private Function Lire_Filtrer_csv_UTF8(ByVal nomCompletFichier As String, col As Long, filtre As Variant) As Workbook ' Lecture et filtrage ligne à ligne d'un [très gros] fichier au format csv encodé UTF8 (avec ou sans BOM) ' Dim fUtf8 As ADODB.Stream Dim wbk As Excel.Workbook Dim cel As Range Dim txt As String Dim lgn As String Dim lgr As Long Application.ScreenUpdating = False Application.Calculation = xlCalculationManual Set wbk = Application.Workbooks.Add(xlWBATWorksheet) Set cel = wbk.Worksheets(1).Range("A1") Set fUtf8 = New Stream With fUtf8 .Charset = "utf-8" .Mode = adModeReadWrite .Type = adTypeText .LineSeparator = adCRLF .Open .LoadFromFile nomCompletFichier Do Until .EOS lgn = .ReadText(-2) '-2 = une ligne If cel.Row = 1 Then Call EcrireLigneCSV(lgn, cel) Else Call FiltrerLigneCSV(lgn, cel, col, filtre) End If Loop .Close End With Set fUtf8 = Nothing wbk.Worksheets(1).Columns.AutoFit wbk.Worksheets(1).Rows.AutoFit Application.Calculation = xlCalculationAutomatic Application.ScreenUpdating = True Set Lire_Filtrer_csv_UTF8 = wbk End Function Private Sub FiltrerLigneCSV(lgn As String, cel As Range, col As Long, filtre As Variant) ' Filtrage et écriture d'une ligne d'un fichier au format csv ' Dim txt As String Dim frm As String Dim lgr As Long Dim nbC As Long Dim t As Variant Dim i As Long If lgn = "" Then Exit Sub t = Split(lgn, sepV) If t(col - 1) = filtre Then For i = LBound(t) To UBound(t) cel.Offset(0, nbC).FormulaLocal = t(i) nbC = nbC + 1 Next i Set cel = cel.Offset(1) End If End Sub Private Sub EcrireLigneCSV(lgn As String, cel As Range) ' Ecriture d'une ligne d'un fichier au format csv ' Dim txt As String Dim frm As String Dim lgr As Long Dim nbC As Long Dim t As Variant Dim i As Long If lgn = "" Then Exit Sub t = Split(lgn, sepV) For i = LBound(t) To UBound(t) cel.Offset(0, nbC).FormulaLocal = t(i) nbC = nbC + 1 Next i Set cel = cel.Offset(1) End Sub Private Function ChoisirFichier(ByVal strExtension As String, Optional ByVal strChemin As String = "") As String ' Choix d'un fichier ' Dim dlgParcourir As FileDialog If strChemin = "" Then strChemin = ThisWorkbook.Path Set dlgParcourir = Application.FileDialog(msoFileDialogFilePicker) With dlgParcourir .InitialFileName = strChemin .Title = "Sélectionner un fichier " & strExtension & " :" .AllowMultiSelect = False .InitialView = msoFileDialogViewDetails .ButtonName = "Sélection fichier" If .Filters.Count > 0 Then .Filters.Delete .Filters.Add "Fichiers " & strExtension, "*" & strExtension, 1 If .Show = -1 Then ChoisirFichier = .SelectedItems(1) Else ChoisirFichier = "" End With Set dlgParcourir = Nothing End Function
--
Cordialement
Patrice
Personne ne peut détenir tout le savoir, c'est pour ça qu'on le partage. -
muchas gracias por este código, funciona pero no para mi archivo que tiene aproximadamente 30000000 líneas. Cuando ejecuté la macro con este archivo, se detuvo; creo que es normal porque excede la capacidad de un archivo de Excel (logra llenar un millón de líneas y después el código se detiene)
no hay forma de guardar directamente el resultado (el filtro) sin mostrarlo en el libro?
o bien añadir una condición (si supera el número máximo de una hoja, crea otra hoja, por ejemplo).-
Eso es lo que hace el código de yg_be en el post #30
-
-
muchas gracias por su ayuda, pero el código sugerido en #30 no funciona para mí.
¿Puedo pedirles, por favor, que lo suban al sitio de compartir con mi ejemplo? Tal vez sea yo quien se ha equivocado en algún punto. Y me gustaría que me dijeran si es posible hacer los cambios necesarios para que el código funcione en mi caso.
Disculpen todas estas preguntas, realmente soy principiante y no logro entender bien este código.
Gracias una vez más por su rapidez (@patrice y @yg_be) :D -
-
-
-
Re,
Aquí hay una adaptación del código de yg_be :
https://mon-partage.fr/f/io41NRNu/
--
Cordialmente
Patrice
Nadie puede poseer todo el conocimiento, por eso lo compartimos. -
Es necesario dividir el archivo en archivos más pequeños.
En mi caso, para 2 millones de líneas, tarda 12 segundos.
15 x 12 = 3 minutos
--
Atentamente
Patrice
Nadie puede poseer todo el conocimiento, por eso lo compartimos. -
él acaba de terminar el tratamiento después de 4H
tuve un error al final :
error de ejecución 14
espacio de cadena insuficiente -
efectivamente, en un archivo de 10 millones funciona súper bien (solo voy a dividir mis archivos en archivos más pequeños)
mil gracias a todos, son geniales.
problemas resueltos :D -
En la hoja de lanzamiento en E4, ¡solo hay que escribir E en lugar de D!
-