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