Recherche plus précise avec FileSearch

Résolu
sfab41 Messages postés 28 Date d'inscription vendredi 27 mars 2009 Statut Membre Dernière intervention 9 juillet 2009 - 17 mai 2009 à 19:37
sfab41 Messages postés 28 Date d'inscription vendredi 27 mars 2009 Statut Membre Dernière intervention 9 juillet 2009 - 25 mai 2009 à 16:35
Bonjour!

Petit souci qui a surement une réponse simple : pour chaque cellule d'une plage, j'utilise la fonction "FileSearch" pour rechercher dans un dossier si un fichier a pour nom la valeur de la cellule. Dans le cas où aucun fichier ne porte ce nom, la cellule est supprimée. Dans l'ensemble, cela marche, mais le problème est que si la cellule a pour contenu "blabla", il va accepter un fichier qui s'appelle "blablasdfsdf" par exemple.
Est-il possible de faire une recherche avec comme nom de fichier le nom exact de la cellule?

Voilà le code:

With Worksheets(1).Range("D8:D" & Compteur)
For Each cell In Range("D8:D" & Compteur)
    If Not IsEmpty(cell) Then
         With Application.FileSearch
            .NewSearch
            .LookIn = source
            .SearchSubFolders = False
            .FileName = cell.Value
            .Execute
            If .FoundFiles.Count = 0 Then cell.ClearContents
        End With
    End If

5 réponses

bigfish_le vrai Messages postés 1835 Date d'inscription vendredi 13 mai 2005 Statut Membre Dernière intervention 20 novembre 2013 15
18 mai 2009 à 12:10
Salut,

et pourquoi ne pas utiliser la fonction "Dir" ?
Cela serait plus simple ( a mon avis) et cela resoudrait ton probleme

Sub TestSurFichier()
    Dim chemin As String, NomFichier As String
    Dim Cellule As Range, Maplage As Range
   
    chemin = "c:\temp"
    ' on determine la plage qui contient les noms de fichiers
    With Sheets("feuil1")
        Set Maplage = .Range("A1:" & .Range("A" & .Columns("A").Rows.Count).End(xlUp).Address(False, False))
    End With
    'on boucle sur cette plage
    For Each Cellule In Maplage
        ' si le fichier n'existe pas la fonction dir renvera une chaine vide
        If Dir$(chemin & Cellule.Text) = "" Then
            Cellule.ClearContents 'donc on vide la cellule
        End If
    Next
End Sub

A+
3
bigfish_le vrai Messages postés 1835 Date d'inscription vendredi 13 mai 2005 Statut Membre Dernière intervention 20 novembre 2013 15
18 mai 2009 à 22:21
Salut,

j'ai pas imagine (a tord d'ailleur ), que tu pouvais une longue liste de fichiers. De plus je me suis rappeler de cette propriete du FileSearch et qui est:

MatchTextExactly = True

ce qui dans ton precedent code donne :

Sub TestSurFichiers()
    Dim chemin As String
    Dim Cellule As Range, Maplage As Range
    chemin = "C:\WINDOWS\system32"
    ' on determine la plage qui contient les noms de fichiers
    With Sheets("sheet1")
        Set Maplage = .Range("D8:" & .Range("D" & .Columns("D").Rows.Count).End(xlUp).Address(False, False))
    End With
    For Each Cellule In Maplage
        If Not IsEmpty(Cellule) Then
             With Application.FileSearch
                .NewSearch
                .LookIn = chemin
                .SearchSubFolders = False
                .Filename = Cellule.Value
                .MatchTextExactly = True
                .Execute
                If .FoundFiles.Count = 0 Then Cellule.ClearContents
            End With
        End If
    Next
End Sub

note que cell est un mot reserve vba donc a eviter comme nom de variable

par contre sur une recherche dans un repertoire contenant 2737 fichier et a partir d'une liste de 2737 fichiers

le temps que prend le code qui utilise la fonction dir donne un resultat en 1.359"

alors que ton code donne un resultat en 174.64" soit pres de 3 minutes. Alors franchement la je ne vois pas ce que je peux faire de mieux pour toi !
As tu change quoi que soit au code que je t'ai donne ? si oui montre moi

A+
3
sfab41 Messages postés 28 Date d'inscription vendredi 27 mars 2009 Statut Membre Dernière intervention 9 juillet 2009
18 mai 2009 à 19:37
J'ai essayé la méthode avec la fonction "Dir" mais ça prend un temps dingue!!! Il n'y aurait pas moyen de faire quelque chose du type "Lookat:=xlWhole" comme on peut faire pour la fonction "Find"?
0
sfab41 Messages postés 28 Date d'inscription vendredi 27 mars 2009 Statut Membre Dernière intervention 9 juillet 2009
22 mai 2009 à 23:00
Me revoilà! Désolé mais j'ai été très occupé ces derniers temps et j'avoue ne pas avoir pris le temps de me remettre sur ma macro, ni même de répondre.
Alors voilà le topo :
- j'ai tester avec "MatchTextExactly" et le résultat est le même
- j'ai écris exactement le code que vous m'aviez fourni en 1ère réponse et le temps mis pour effectuer la macro est démentiel!

Est-ce que le fait que mes fichiers soit gros peut influencer? Est-ce que je dois activer un paramètre pour exécuter cette macro (référence)?
Merci de votre aide parce que là je bloque complètement.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
sfab41 Messages postés 28 Date d'inscription vendredi 27 mars 2009 Statut Membre Dernière intervention 9 juillet 2009
25 mai 2009 à 16:35
C'est bon, j'ai trouvé ! En fait j'ai simplement ajouté l'extension du fichier et ça marche! Voilà c'était tout bête. En effet c'est beaucoup plus rapide de cette manière alors merci bigfish.

Nouveau code:

    Dim chemin As String, NomFichier As String
    Dim Cellule As Range, Maplage As Range
   
    chemin = "c:\temp"
    With Sheets("feuil1")
        Set Maplage = .Range("A1:" & .Range("A" & .Columns("A").Rows.Count).End(xlUp).Address(False, False))
    End With
    For Each Cellule In Maplage
        If Dir(chemin & Cellule.Text & ".asf") = "" Then
            Cellule.ClearContents
        End If
    Next
0
Rejoignez-nous