IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Recherche recursive puis recherche dans des fichiers texte contenus dans des zip/7z


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2016
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2016
    Messages : 71
    Par défaut Recherche recursive puis recherche dans des fichiers texte contenus dans des zip/7z
    Bonjour à tous,

    Voila une nouvelle macro de démarrée.
    Il s'agit d'une recherche dans un dossier donnée avec tous ses sous dossiers.

    On cherche tous les .txt qui sont soit dans les dossiers directement, soit contenus dans des zip/7z

    et je souhaiterais analyser si la première ligne de ces .txt contient "123" ou non pour pouvoir lister uniquement les .txt qui contiennent "123" sur cette 1ere ligne.

    -------------------------------------------
    Ma macro fonctionne pour lister les dossiers, fichiers, et l’intérieur des zip, mais bloque à l'ouverture d'un fichier dans une archive à la ligne Open MyFile For Input As #1

    Ci-dessous la macro + le fichier excel

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
    Sub Tester()
        ListZipContents Range("B2").Value
    End Sub
     
    Function ListZipContents(zipFilePath As Variant)
     
        Dim oApp As Object, colFolders As New Collection, itm As Object, fld As Object
        Dim isTxt As Integer, isfff As Integer, row As Integer
        row = 2
        Range("C2:C100000").Clear
     
        Set oApp = CreateObject("Shell.Application")
        colFolders.Add oApp.Namespace(zipFilePath).self
     
        Do While colFolders.Count > 0
        isTxt = 0
            Set fld = colFolders(1)     'obtenir le premier dossier
            colFolders.Remove 1         'et l'enlever de la collection...
            For Each itm In oApp.Namespace(fld.Path).Items
                If itm.isfolder Then
                    colFolders.Add itm   'sauvegarde le chemin du dossier pour listing
                Else
                    isTxt = InStr(itm.Path, ".txt")
                    If isTxt > 0 Then
                        Debug.Print GetFirstLine(itm.Path)
                        If InStr(1, GetFirstLine(itm.Path), Range("A2").Value, vbTextCompare) > 0 Then
                            Range("C" & row + 1).Value = itm.Path
                            row = row + 1
     
                        End If
                    End If
     
                    Debug.Print itm.Path 'liste le chemin du fichier
     
                End If
            Next
        Loop
    End Function
     
    Function GetFirstLine(MyFile As String) As String
        If Dir(MyFile) <> "" Then
            Open MyFile For Input As #1
                Line Input #1, GetFirstLine
            Close
        End If
    End Function
    Merci d'avance pour votre aide.
    recherche_in_zip_vba.xlsm

  2. #2
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 246
    Par défaut
    Hello,
    cela risque d'être difficile d'ouvrir les fichiers zip sans utiliser une bibliothèque de compression et ton code fonctionne-t-il avec des fichier 7z (sevenzip) ? avec excel-dna et du c# en utilisant l'assemblage sharpcompress cela serait possible.
    Ami calmant, J.P

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2016
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2016
    Messages : 71
    Par défaut
    Bonjour Jurrasic,

    2 variables ont été rajoutées pour savoir si il s'agit d'un zip ou d'un 7z :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    iszip = InStr(itm.Path, ".zip") >0
     
    is7z = InStr(itm.Path, ".7z") >0
    Comme ca je peux différencier si le fichier est une archive, et ainsi mettre une condition If iszip Then .... End If


    trouvé également sur internet un code pour extraire dans le dossier Temporaire de Windows un fichier spécifique d'une archive zip, mais au niveau performance, cela m'a l'air horrible de crawler à chaque fichier dans tout le zip pour pouvoir l'extraire.
    Du coup pour cette application, je ne sais pas trop ... :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    Sub GetData()
    Dim iRow As Integer 'row counter
    Dim iCol As Integer 'column counter
    Dim savePath As String 'place to save the extracted files
    Dim fileContents As String 'contents of the file
    Dim fso As FileSystemObject 'FileSystemObject to work with files
    iRow = 1 'start at first row
    iCol = 1 'start at frist column
    'set the save path to the temp folder
    savePath = Environ("TEMP")
    'create the filesystem object
    Set fso = New FileSystemObject
     
    Do While ActiveSheet.Cells(iRow, iCol).Value <> ""
        fileContents = fso.OpenTextFile(UnzipFile(savePath, ActiveSheet.Cells(iRow, iCol).Value, "md5.txt"), ForReading).ReadAll
        ActiveSheet.Cells(iRow, iCol + 1).Value = fileContents
        iRow = iRow + 1
    Loop
     
     
    'free the memory
    Set fso = Nothing
    End Sub
     
     
     
    Function UnzipFile(savePath As String, zipName As String, fileName As String) As String
    Dim oApp As Shell
    Dim strFile As String
    'get a shell object
    Set oApp = CreateObject("Shell.Application")
        'check to see if the zip contains items
        If oApp.Namespace(zipName).Items.Count > 0 Then
            Dim i As Integer
            'loop through all the items in the zip file
            For i = 0 To oApp.Namespace(zipName).Items.Count - 1
                'check to see if it is the txt file
                If UCase(oApp.Namespace(zipName).Items.Item(i)) = UCase(filename) Then
                    'save the files to the new location
                    oApp.Namespace(savePath).CopyHere oApp.Namespace(zipName).Items.Item(i)
                    'set the location of the file
                    UnzipFile = savePath & "\" & fileName
                    'exit the function
                    Exit Function
                End If
            Next i
        End If
    'free memory
    Set oApp = Nothing
     
    End Function

  4. #4
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2016
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2016
    Messages : 71
    Par défaut
    Je veux bien utiliser des librairies mais je ne sais pas vers où chercher (que ca soit zip ou 7z)

  5. #5
    Rédacteur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2013
    Messages
    1 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Août 2013
    Messages : 1 035
    Par défaut
    Citation Envoyé par neflerine Voir le message
    Je veux bien utiliser des librairies mais je ne sais pas vers où chercher (que ca soit zip ou 7z)
    Bonjour,
    pour Zip il y a déjà cette documentation : https://laurent-ott.developpez.com/t...s/Windows-ZIP/

  6. #6
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 246
    Par défaut
    Hello,
    L'arme secrète sous Windows : Powershell :
    PS D:\tmp\zips> $zips = (Get-ChildItem "D:\tmp\testRecherche" -Recurse -Include *.zip,*.7z).fullname
    PS D:\tmp\zips> $zips
    D:\tmp\testRecherche\sousDossier\machines1.7z
    D:\tmp\testRecherche\sousDossier\machines2.zip
    PS D:\tmp\zips> foreach ($zip in $zips) {Expand-7Zip -ArchiveFileName $zip -TargetPath 'D:\tmp\TestRecherche\zips'}
    PS D:\tmp\zips> Get-ChildItem -Path "D:\Tmp\TestRecherche\*.txt" -Recurse -Depth 1|
    >> Select-String -Pattern "123" |
    >> Select LineNumber, Filename, Path


    LineNumber Filename Path
    ---------- -------- ----
    1 machines.txt D:\Tmp\TestRecherche\sousDossier\machines.txt
    1 machines1.txt D:\Tmp\TestRecherche\zips\machines1.txt
    1 machines2.txt D:\Tmp\TestRecherche\zips\machines2.txt
    1 ext_json.txt D:\Tmp\TestRecherche\ext_json.txt
    1 LetThemEatCake01NC.txt D:\Tmp\TestRecherche\LetThemEatCake01NC.txt
    5 LetThemEatCake01NC.txt D:\Tmp\TestRecherche\LetThemEatCake01NC.txt




    PS D:\tmp\zips>
    A noter qu'il faut installer le module 7Zip4PowerShell dans PowerShell pour pouvoir utiliser les archives 7z (Expand-7zip pour décompresser).
    Voici ce que cela donne en VBA avec ma Dll expérimentale qui permet d'interfacer le PowerShell avec le VBA.

    Nom : PowerShellVBA.png
Affichages : 135
Taille : 44,6 Ko

    Ami calmant, J.P

Discussions similaires

  1. Recherche lignes colonnes fichier texte
    Par gd74ad dans le forum C++/CLI
    Réponses: 3
    Dernier message: 07/12/2015, 12h30
  2. Recherche d'un fichier text puis copie de son contenu dans Excel
    Par DavOak12 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 28/02/2012, 19h56
  3. Réponses: 4
    Dernier message: 09/10/2011, 16h17
  4. [PHP 5.0] Recherche aléatoire des variables dans un fichier texte
    Par schats dans le forum Langage
    Réponses: 8
    Dernier message: 22/05/2010, 13h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo