VBA Excel - Recherche de fichiers

Signaler
Messages postés
4030
Date d'inscription
mardi 13 mai 2003
Statut
Modérateur
Dernière intervention
23 décembre 2008
-
archiifk
Messages postés
22
Date d'inscription
mardi 28 septembre 2004
Statut
Membre
Dernière intervention
13 septembre 2011
-
Bonjour à toutes et tous.







Je possède un dossier contenant un certain nombre de fichiers :

- Un fichier Visio (*.vsd)

- Un fichier Excel (*.xls)

- Un fichier Word (*.doc)

- Un fichier Texte (*.txt)

- Un fichier Image (*.bmp)

- Un fichier Zip (*.zip)



Etant sous Excel 2003 (sans DirListBox, sans FileListBox), j'utilise la méthode FileSearch de l'objet Application
pour lister les fichiers d'un répertoire donné. Et figurez-vous que çà
fonctionne ... presque. Je vois apparaître tous les fichiers dans ma
ListBox, sauf le fichier Zip.



Sub RechercheFichiers(sFolder As String)

' Cette procedure recherche tous les fichiers contenus dans un répertoire donné.

' Elle les affiche dans une ListBox (lstFiles ).

Dim NomFichier As String

Dim nbFiles As Long



NomFichier = "*.*"

lstFiles.Clear



With Application.FileSearch

.NewSearch

.LookIn = sFolder

.SearchSubFolders = True

.Filename = NomFichier

.FileType = msoFileTypeAllFiles

.MatchTextExactly = True

If .Execute(msoSortByNone) > 0 Then

For i = 1 To .FoundFiles.Count

lstFiles.AddItem .FoundFiles(i)

Next i

Else

MsgBox "Aucun fichier n'a été trouvé."

End If

End With

End Sub



' Et j'ai juste un bouton qui lance tout :



Private Sub CommandButton2_Click()

Dim sTSRFolder As String

sTSRFolder = "C:\tmp"

RechercheFichiers sTSRFolder

End Sub







ATTENTION : Je sais comment contourner ce problème par une autre méthode de recherche de fichiers.

Je voudrais juste avoir une explication pour ces fichiers Zip
que je ne vois pas. (Ce ne sont pas des fichiers cachés, ce ne sont pas
des zip vides). Le comportement de la méthode FileSearch me paraît douteux.










Manu

----------------------------------------------

Une question bien posée, c'est une chance de réponse bien adaptée.

8 réponses

Messages postés
7393
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
6 avril 2012
46
Salut,

Je viens d'essayer ton code sous Excel 2000, et je n'ai eu aucun probleme (excepté le "msoSortByNone" qui n'est pas reconnu sous 2000)

Je suis sûr que cela ne t'apporte rien de le savoir mais ca marche sous 2000.

Voila.
Ps: ce post est en grande partie là aussi pour suivre le déroulement du problème.
Messages postés
4030
Date d'inscription
mardi 13 mai 2003
Statut
Modérateur
Dernière intervention
23 décembre 2008
19
Détrompes-toi, çà m'aide.

Ca permet de valider le code, et de montrer que le problème est bien, comme je le pensais, du côté de la méthode FileSearch.



Manu

-------------------------------------------

Une question bien posée, c'est une chance de réponse bien adaptée.
Messages postés
4030
Date d'inscription
mardi 13 mai 2003
Statut
Modérateur
Dernière intervention
23 décembre 2008
19
Mais du coup, je cherche toujours l'explication

Manu

-------------------------------------------

Une question bien posée, c'est une chance de réponse bien adaptée.
Messages postés
2065
Date d'inscription
lundi 11 avril 2005
Statut
Membre
Dernière intervention
14 mars 2016
8
Bonsoir,

Je me suis intéressé à ton problème... et j'ai pas trouvé d'explication...

Pour ma part, ton code ne fonctionne pas. JE suis sous Excel 97 et Win ME.

Le blocage se fait à deux niveaux.

1. La ligne : .Filename = NomFichier
n'est pas reconnu avec "*.*", mais marche avec un "xls" par exemple. (j'ai regardé dans un livre sur VBA pour Excel 2003, justement...)

2. If .Execute(msoSortByNone) > 0 Then
ne semble pas accepter cette syntaxe, carrément...

J'AI donc repris ton code pour voir comment je pouvais faire pour faire la même chose... et ma solution c'est de chercher tous les types de fichiers au lieu d'utiliser *.*
Puis, l'instruction .Execute(msoSortByNone) qui semble éviter la recherche dans la fin d'un repertoire, j'ai utilisé On error resume next, pour poursuivre...

Voilà ce que cela donne :

With Application.FileSearch
.NewSearch
.LookIn = sFolder
.SearchSubFolders = True
.FileType = msoFileTypeAllFiles
.MatchTextExactly = True
.Execute msoSortByFileType
On Error Resume Next
For i = 1 To .FoundFiles.Count
UserForm1.ListBox1.AddItem .FoundFiles(i)
Next i
End With

et là, cela fonctionne alors... et les zip sont reconnus au même titre que les autres...

Réflexion ?!
En fait, je suis étonné d'être obligé de changer ton code pour que cela fonctionne sous Excel 97... SI tu essayes mon code, et que cela fonctionne, faut-il conclure que l'emploi de "*.*" pour .Filename est défaillante ? j'ai aussi remarquer (mais c'est peut être normal, bien que curieux) que si j'emploi .Filename "zip" (ou autre, comme "txt") , alors tous les noms de fichiers portant "zip" dans le nom ou dans l'extension sont recenssés... c'est pas super, à moins de faire une recherche ensuite sur l'extension...

Voilà, en espérant avoir peut-être un indice...

Amicalement,
Us.
Messages postés
1
Date d'inscription
mardi 29 juin 2004
Statut
Membre
Dernière intervention
16 août 2006

Bonjour,


sur Excel 97, pour faire marcher la commande de recherche de fichiers specifiques en utilisant Application.Filesearch.Filename, il faut ajouter le caractere "" dans la chaine de recherche et ne pas utiliser de "*".....  c'est  tres etrange


Exemple :

    With Application.FileSearch
        .NewSearch
        .FileName = "\.zip"
        .LookIn = "C:"
        .SearchSubFolders = False
        .MatchTextExactly = True
        .FileType = msoFileTypeAllFiles
        If .Execute() > 0 Then
            MsgBox "Ce dossier contient " & .FoundFiles.Count & _
                " fichier(s) répondant aux critères."
            For i = 1 To .FoundFiles.Count
                MsgBox .FoundFiles(i)
            Next i
        Else
            MsgBox "Aucun fichier n'a été trouvé."
        End If
    End With

Pour faire une recherche sur la chaine "*B*.zip" par exemple, il faut mettre

        .FileName = "\B.zip"
Lo logique est curieuse....

De plus sous Windows XP il faut desactiver le service qui lit les archives Zip en tant que repertoire

A+
DoctorO
Messages postés
5
Date d'inscription
vendredi 10 novembre 2006
Statut
Membre
Dernière intervention
7 mars 2007

bon on va continuer dans l'aberant

moi j'ai une macro qui fonctionne niquel sous Excel 2000 (et teste sous excel 2003) avec Windows 2000 pour la chose suivante :
recherche des fichiers qui s'appelle *.dat

Public Function FIND_DAT_FILE(ByVal Folder_DAT As String) As Integer
Dim I As Integer
Application.StatusBar = "Debut calcul nombre de fichier a traiter"
Set fs = Application.FileSearch
With fs
    .LookIn = Folder_DAT
    .FileName = "*.dat"
    If .Execute(SortBy:=msoSortByFileName, SortOrder:=msoSortOrderAscending) > 0 Then
        FIND_DAT_FILE = .FoundFiles.Count
        ReDim Dat_file_list(.FoundFiles.Count)
        ReDim Dat_file_scanner_name(.FoundFiles.Count)
        For I = 1 To .FoundFiles.Count
        Dat_file_list(I) = .FoundFiles(I)
            If InStr(1, Dat_file_list(I), GNIQ_Dat, vbTextCompare) <> 0 Then
            GNIQ_Pos = InStr(1, Dat_file_list(I), "GNIQ")
            Dot_Dat_Position = InStr(1, Dat_file_list(I), ".dat")
            Dat_file_scanner_name(I) = Mid(Dat_file_list(I), GNIQ_Pos + Len(GNIQ_Dat), Dot_Dat_Position - (GNIQ_Pos + Len(GNIQ_Dat)))
            Else
            Dat_file_scanner_name(I) = "Autres"
            End If
        Next I
    Else
        'MsgBox "There were no files found."
    End If
End With
Application.StatusBar = "Fin calcul nombre de fichier a traiter"
End Function

Si je la lance sous Excel 97 la ligne suivante
    .FileName = "*.dat"
ne marche pas avec erreur : Run-Time error '5' : Invalid procedure call or argument
suite a vos remarques, j'ai essaye de mettre la ligne     .FileName = "/.dat" et il met seulement ".dat" dans fs.filename (vu via la local windows) sans le / mais il ne trouve pas de fichier s'appelant .dat !!!!!

mais j'ai essaye plus tordu
j'ai essaye de remettre le *.dat dans le filename apres avoir mis la ligne /.dat et la plus d'errreur Run-Time error '5' : Invalid procedure call or argument et le filename prend bien le *.data (vu via la local windows)
mais il ne trouve toujours pas de fichier s'appelant .dat !!!!!

Pourquoi il ne trouve pas !!!
he he he j'ai compris
parce qu'il faut faire la chose suivante :

l'ordre que j'avais choisi n'est pas correct suit je pense a un bug Excel
Set fs = Application.FileSearch
With fs

    .LookIn = Folder_DAT

    .FileName = "/.dat"
    .FileName = "*.dat"

    If .Execute(SortBy:=msoSortByFileName, SortOrder:=msoSortOrderAscending) > 0 Then

il faut mettre

    .LookIn = Folder_DAT apres les filename car si on le met avant le bug reinitialise le repertoire de recherche a la racine c:\  ???? (vu avec le suivi des variables via la locals Windows dans VBA)

Set fs = Application.FileSearch
With fs

    .FileName = "/.dat"

    .FileName = "*.dat" (n'est pas indispensable sous 2000 car le / marche sous aussi sous Excel 2000 mais apres verif sous Excel 2003 le / ne marche pas, merci Bill Gate !!!)


    .LookIn = Folder_DAT

    If .Execute(SortBy:=msoSortByFileName, SortOrder:=msoSortOrderAscending) > 0 Then

En gros pour mettre un Wildcard * dans un Application.FileSearch compatible a la fois sous Excel 2000, 97 et 2003 il faut mettre la lignejuste ci-dessous
Set fs = Application.FileSearch
With fs

    .FileName = "/.dat"

    .FileName = "*.dat" (indispensable pour une compatibilite totale des Excel


    .LookIn = Folder_DAT

    If .Execute(SortBy:=msoSortByFileName, SortOrder:=msoSortOrderAscending) > 0 Then

MaaaaaaaaGiiiiiiiiiiiiqueeeeeeeeeeee
Messages postés
22
Date d'inscription
mardi 28 septembre 2004
Statut
Membre
Dernière intervention
13 septembre 2011

bonjour,
je ne mitrise pas les listbox.
chez moi l'execution bute sur l'instruction
lstFiles.Clear
erreur d'execution '424': Objet requis

--- que manque t il ? ---

par ailleur j'ai essaye la fonction suivante mais là il n'y a aucun fichier qui apoparait dans la boite à liste

Sub test_selDos()
' Attention FileDialog n'étant pas reconnu dans excel 2000 et versions
' antérieures cette macro ne fonctionne qu'avec les versions 2002 et +.
'
' Attention le "" à la fin de la ligne de commande est essentiel.
MsgBox SelDossier("D:\a_PRIVE\toto")
End Sub


Function SelDossier(Defaut As String)
'd'après "Nicolas", mpfe
Dim fd As FileDialog
Set fd = Application.FileDialog(msoFileDialogFolderPicker)
With fd
.InitialFileName = Defaut
If .Show = -1 Then
SelDossier = fd.SelectedItems(1)
End If
End With
Set fd = Nothing
End Function

--- ??? ---

MsoExcel 2003
Windows XP
archiifk
Messages postés
22
Date d'inscription
mardi 28 septembre 2004
Statut
Membre
Dernière intervention
13 septembre 2011

bon j'ai trouvé : en fait le code de econs ou celui de us_30 doit être placé dans un UserForm et non dans un module.

de plus il faut précéder listbox du nom de la userform.

Ainsi j'ai placé ce code dans la UserForm2 ce qui me donne :


'Propriétés 
'VBAProject(PERSO.XLS)\Feuilles\UserForm2
'Name = UserForm2
'
Private Sub UserForm_Initialize()
End Sub
Private Sub ListBox1_Click()
End Sub
Private Sub CommandButton1_Click()
     Dim fnc As String
     Dbg = True
     Dim sTSRFolder As String
     
fnc = "CommandButton1_Click() _ "
     
    sTSRFolder = "D:\a_PRIVE\toto"
' function de econs ci-dessous : cela fonctionne
    Call RechercheFichiers(sTSRFolder) 
    If Dbg Then
        MsgBox (fnc & " premiere recherche de fichier passée")
    End If
' function de us_30  placée dans le module 5 
' (VBAProject(PERSO.XLS)\Modules\Module5): 
' cela fonctionne aussi
    RechercheFichiers2 (sTSRFolder)    
    If Dbg Then
        MsgBox (fnc & " seconde recherche de fichier passée")
    End If
End Sub

Private Function RechercheFichiers(sFolder As String)
' Cette procedure recherche tous les fichiers 
' contenus dans un répertoire donné.
' Elle les affiche dans une ListBox (lstFiles).
     Dim fnc As String
     Dbg = True
     Dim sTSRFolder As String
     
fnc = "RechercheFichiers(" & sFolder & ") _ "

    Dim NomFichier As String
    Dim nbFiles As Long

    'lstFiles.Clear
'ajout de UserForm2. sinon erreur 424 objet requis !!!
    UserForm2.ListBox1.Clear 
    
    With Application.FileSearch
        .NewSearch
        .LookIn = sFolder
        .SearchSubFolders = True
        .Filename = NomFichier
        .FileType = msoFileTypeAllFiles
        .MatchTextExactly = True
        If .Execute(msoSortByNone) > 0 Then
            For i = 1 To .FoundFiles.Count
                UserForm2.ListBox1.AddItem .FoundFiles(i)
                'lstFiles.AddItem .FoundFiles(i)
                If Dbg Then
                 MsgBox (fnc & .FoundFiles(i))
                End If
            Next i
        Else
            MsgBox "Aucun fichier n'a été trouvé."
        End If
    End With
    
End Function



archiifk