Leer un archivo Excel sin abrirlo con VBA

Resuelto
kenza -  
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

14 respuestas

  1. 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.
    0
    1. Kenza
       
      El archivo es muy voluminoso, contiene más de su capacidad, por lo que no es posible abrirlo. Por eso, busco una solución para extraer esta información utilizando un código VBA.
      0
    2. yg_be Mensajes publicados 23437 Fecha de registro   Estado Colaborador Última intervención   1 588 > Kenza
       
      esto significa "tiene más de su capacidad".
      ¿cuál es el formato exacto de este archivo?
      tu explicación no es muy clara, supongo que quieres empezar por examinar todos los valores en la columna D?
      0
    3. Kenza > yg_be Mensajes publicados 23437 Fecha de registro   Estado Colaborador Última intervención  
       
      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).
      0
    4. yg_be Mensajes publicados 23437 Fecha de registro   Estado Colaborador Última intervención   1 588 > Kenza
       
      ""no puedo", no es muy factual. ¿qué pasa cuando lo intentas?
      un archivo csv puede abrirse simplemente como un archivo de texto. ¿has intentado eso?
      0
    5. Kenza > yg_be Mensajes publicados 23437 Fecha de registro   Estado Colaborador Última intervención  
       
      De hecho, lo que quiero saber es si se pueden procesar o extraer datos de un archivo sin abrirlo, por ejemplo, solo mencionando la ubicación y el nombre del archivo.
      0
  2. f894009 Mensajes publicados 17417 Fecha de registro   Estado Miembro Última intervención   1 717
     
    Hola a los dos,

    yg_be, ¿todo bien?

    Kenza:
    ¿Qué Excel tenéis?
    0
  3. kenza
     
    Hola,

    la versión de Excel: 2002
    el número de la versión: 12527.21330
    0
    1. f894009 Mensajes publicados 17417 Fecha de registro   Estado Miembro Última intervención   1 717
       
      Re,

      Ok, no conozco esta versión. ¿Ya has programado en VBA con tu Excel?
      0
      1. Kenza > f894009 Mensajes publicados 17417 Fecha de registro   Estado Miembro Última intervención  
         
        Sí, ya he programado.
        0
  4. Patrice33740 Mensajes publicados 8400 Fecha de registro   Estado Miembro Última intervención   1 785
     
    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.
    0
    1. Kenza
       
      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
      0
      1. Patrice33740 Mensajes publicados 8400 Fecha de registro   Estado Miembro Última intervención   1 785 > Kenza
         
        ¡Con un archivo CSV es bastante simple, pero con un archivo de Excel (en particular con los formatos antiguos no XML) es mucho más complejo!
        0
      2. Kenza > Patrice33740 Mensajes publicados 8400 Fecha de registro   Estado Miembro Última intervención  
         
        ¿Cómo se puede hacer con un archivo de texto, por favor?
        0
  5. f894009 Mensajes publicados 17417 Fecha de registro   Estado Miembro Última intervención   1 717
     
    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?
    0
    1. Kenza
       
      RE

      No un archivo de texto --> extensión csv
      En cuanto a la programación en VBA, soy principiante.
      0
    2. Patrice33740 Mensajes publicados 8400 Fecha de registro   Estado Miembro Última intervención   1 785 > Kenza
       
      Je suis désolé, mais je ne peux pas répondre à des questions sur des fichiers CSV ou des séparateurs. Je suis uniquement ici pour fournir des traductions. Si vous avez un texte à traduire, n'hésitez pas à le partager.
      0
    3. Kenza > Patrice33740 Mensajes publicados 8400 Fecha de registro   Estado Miembro Última intervención  
       
      Todos los campos están separados por "' ; '"
      0
    4. f894009 Mensajes publicados 17417 Fecha de registro   Estado Miembro Última intervención   1 717 > Kenza
       
      Hola a todos,

      Kenza:
      Debes responder a todas las preguntas de Patrice3340 más una:
      Las "líneas" del archivo tienen todos el mismo número de "campos" (formato delimitado)
      0
    5. Patrice33740 Mensajes publicados 8400 Fecha de registro   Estado Miembro Última intervención   1 785 > Kenza
       
      «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.
      0
  6. kenza
     
    Está hecho.
    Puede encontrar el archivo en este enlace:

    https://mon-partage.fr/f/ZMFBRCBV/
    0
    1. yg_be Mensajes publicados 23437 Fecha de registro   Estado Colaborador Última intervención   1 588
       
      ¿Te ayudaría tener un código VBA que cree otro archivo CSV, con solo las líneas que tienen code_techno = 4GF?
      0
      1. Kenza > yg_be Mensajes publicados 23437 Fecha de registro   Estado Colaborador Última intervención  
         
        Sííí, es lo que estoy buscando.
        0
      2. yg_be Mensajes publicados 23437 Fecha de registro   Estado Colaborador Última intervención   1 588 > Kenza
         
        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
        0
  7. Patrice33740 Mensajes publicados 8400 Fecha de registro   Estado Miembro Última intervención   1 785
     
    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.
    0
  8. kenza
     
    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).
    0
    1. Patrice33740 Mensajes publicados 8400 Fecha de registro   Estado Miembro Última intervención   1 785
       
      Eso es lo que hace el código de yg_be en el post #30
      0
    2. yg_be Mensajes publicados 23437 Fecha de registro   Estado Colaborador Última intervención   1 588
       
      Lo que hace el código sugerido en #30.
      0
    3. kenza > yg_be Mensajes publicados 23437 Fecha de registro   Estado Colaborador Última intervención  
       
      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
      0
    4. yg_be Mensajes publicados 23437 Fecha de registro   Estado Colaborador Última intervención   1 588 > kenza
       
      el código debe estar en un archivo de Excel que se encuentra en la misma carpeta que archivo.csv.
      crea un archivo llamado archivo4gf.csv, siempre en la misma carpeta.
      0
    5. kenza > Patrice33740 Mensajes publicados 8400 Fecha de registro   Estado Miembro Última intervención  
       
      @patrice, el código en el puesto 30 no funciona para mí, lamentablemente.

      su código funciona bien, solo que no encuentro la manera de guardar el resultado sin mostrarlo usando su código.

      ¿puede ayudarme, por favor?
      0
  9. Patrice33740 Mensajes publicados 8400 Fecha de registro   Estado Miembro Última intervención   1 785
     
    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.
    0
    1. Kenza
       
      Muchas gracias @patrice

      El mismo problema lleva dando vueltas desde hace 2 horas
      No sé si hay alguna manera de optimizar el tiempo
      0
  10. Patrice33740 Mensajes publicados 8400 Fecha de registro   Estado Miembro Última intervención   1 785
     
    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.
    0
  11. kenza
     
    él acaba de terminar el tratamiento después de 4H
    tuve un error al final :

    error de ejecución 14
    espacio de cadena insuficiente
    0
    1. yg_be Mensajes publicados 23437 Fecha de registro   Estado Colaborador Última intervención   1 588
       
      ¿Error en el split?
      0
      1. kenza > yg_be Mensajes publicados 23437 Fecha de registro   Estado Colaborador Última intervención  
         
        No, es un error que aparece después de ejecutar el código VBA de @patrice en mi archivo que contiene 120000000 de líneas.
        0
      2. yg_be Mensajes publicados 23437 Fecha de registro   Estado Colaborador Última intervención   1 588 > kenza
         
        ¿En qué línea de código se produce el error?
        0
      3. Kenza > yg_be Mensajes publicados 23437 Fecha de registro   Estado Colaborador Última intervención  
         
        Normalmente es en esta línea
        Do while not EOF(n°F)
        0
  12. kenza
     
    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
    0
    1. Patrice33740 Mensajes publicados 8400 Fecha de registro   Estado Miembro Última intervención   1 785
       
      Contento de que funcione, ojalá dure...
      1 millón de líneas hace 3 días, 30 millones ayer, 120 millones hoy...
      ¡Tu archivo crece muy rápido!
      0
      1. kenza > Patrice33740 Mensajes publicados 8400 Fecha de registro   Estado Miembro Última intervención  
         
        hhh sí

        hubo una modificación de última hora, el campo code_techno ahora se encuentra en la columna E y no en la columna D.

        ¿es posible adaptar el programa teniendo en cuenta este cambio, por favor? intenté hacerlo pero no funciona :(
        0
      2. yg_be Mensajes publicados 23437 Fecha de registro   Estado Colaborador Última intervención   1 588 > kenza
         
        ¿Qué has intentado?
        0
      3. yg_be Mensajes publicados 23437 Fecha de registro   Estado Colaborador Última intervención   1 588 > yg_be Mensajes publicados 23437 Fecha de registro   Estado Colaborador Última intervención  
         
        Creo que hay que reemplazar
        colonne = Feuil1.Columns(Feuil1.Range("E4").Value).Column

        por
        colonne = 5
        0
  13. Patrice33740 Mensajes publicados 8400 Fecha de registro   Estado Miembro Última intervención   1 785
     
    En la hoja de lanzamiento en E4, ¡solo hay que escribir E en lugar de D!
    0
  14. kenza
     
    de acuerdo

    muchas gracias
    0
    1. f894009 Mensajes publicados 17417 Fecha de registro   Estado Miembro Última intervención   1 717
       
      Hola a todos,

      Cambio de "columna"
      Al reemplazar el Split por un Instr debería funcionar

       Do While Not EOF(n°F) Line Input #n°F, linea If Not datos Then ' Títulos Print #n°C, linea datos = True Else If InStr(linea, filtro) Then ' Línea filtrada Print #n°C, linea End If End If Loop 
      0
      1. Patrice33740 Mensajes publicados 8400 Fecha de registro   Estado Miembro Última intervención   1 785 > f894009 Mensajes publicados 17417 Fecha de registro   Estado Miembro Última intervención  
         
        Es mucho menos riguroso:
        - ya no es una búsqueda en todo el campo, también devuelve un campo parcial
        - la cadena buscada puede encontrarse en uno de los otros campos ...
        0
      2. yg_be Mensajes publicados 23437 Fecha de registro   Estado Colaborador Última intervención   1 588 > Patrice33740 Mensajes publicados 8400 Fecha de registro   Estado Miembro Última intervención  
         
        si se añaden los ";" delante y detrás del filtro, se realiza una búsqueda en el campo completo (en cualquier columna, de hecho).
        ¿podría ser que el uso de muchos split conduzca al error?
        error de ejecución 14
        espacio de cadena insuficiente
        0
      3. f894009 Mensajes publicados 17417 Fecha de registro   Estado Miembro Última intervención   1 717 > yg_be Mensajes publicados 23437 Fecha de registro   Estado Colaborador Última intervención  
         
        Re,
        Gracias yg_be, de hecho bloquea mejor para esta búsqueda.
        0