Recherche plus précise avec FileSearch [Résolu]

Signaler
Messages postés
28
Date d'inscription
vendredi 27 mars 2009
Statut
Membre
Dernière intervention
9 juillet 2009
-
Messages postés
28
Date d'inscription
vendredi 27 mars 2009
Statut
Membre
Dernière intervention
9 juillet 2009
-
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

Messages postés
1835
Date d'inscription
vendredi 13 mai 2005
Statut
Membre
Dernière intervention
20 novembre 2013
9
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+
Messages postés
1835
Date d'inscription
vendredi 13 mai 2005
Statut
Membre
Dernière intervention
20 novembre 2013
9
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+
Messages postés
28
Date d'inscription
vendredi 27 mars 2009
Statut
Membre
Dernière intervention
9 juillet 2009

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"?
Messages postés
28
Date d'inscription
vendredi 27 mars 2009
Statut
Membre
Dernière intervention
9 juillet 2009

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.
Messages postés
28
Date d'inscription
vendredi 27 mars 2009
Statut
Membre
Dernière intervention
9 juillet 2009

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