Recherche dans plusieurs dossiers si fichier existe

Salut à tous,

Suite à mon dernier sujet, je rencontre un soucis.

En effet, l'idée c'est de rechercher dans un dossier si le fichier existe, si oui on colorie la case en vert, dans le cas contraire en rouge.

Jusqu'ici, tout marche mais le problème c'est que j'aimerais vérifier si le fichier n'existe pas dans le premier "Dir", alors on cherche dans le second avant de colorier en rouge.

Sub test ()
  Dim dlig&, i&, Dir1 As String, Dir2 As String, c As Byte: Application.ScreenUpdating = 0
  Dir1 = "C:\Nouveau dossier\"
  Dir2 = "C:\Nouveau dossier2\"
  dlig = Cells(Rows.Count, 1).End(3).Row

  For i = 2 To dlig 'couleur c : 3 = ROUGE ; 4 = VERT
    With Cells(i, 1)
      If .Value <> "" Then
        c = IIf(Dir(Dir1 & .Value & "*.txt") = "", 3, 4)
        .Offset(, 1).Interior.ColorIndex = c
        d = IIf(Dir(Dir1 & .Value & "*.txt") = "", 3, 4)
        .Offset(, 1).Interior.ColorIndex = d
      End If
    End With
  Next i
End Sub

Du coup, je vais traduire ce que j'ai codé :

1) On regarde les lignes vides en colonne A pour retrouver la dernière ligne non vide.

2) Ensuite, de la ligne 2 à la dernière ligne non vide on boucle.

3) On boucle sur l'instruction, si la valeur de Cells ( i , 1 ) n'est pas vide alors..

4) Alors on regarde si le fichier existe dans le Dir1, si non on colorie en rouge, sinon en vert.

C'est là que sa pose problème, on fait la même manipulation que le point "4)" mais dans le Dir2, du coup sa écrase les couleurs que le point "4)" a exécuter.

La finalité, c'est que je ne sais pas comment dire : si le fichier existe, on colorie en vert, sinon en rouge puis on regarde dans un second répertoire (Dir2) sans retoucher au couleur verte.

Après, dans un second temps, je me dit que, il faut qu'on regarde avant tout "coloriage", de regarder dans les deux répertoires systématiquement, mais en réfléchissant c'est une mauvaise idée car imaginons que tout les fichiers sont dans le premier dossier, on n'a pas besoin de regarder dans le second. (du coup perte de temps, mais bon cela dit, on aura forcément des fichiers dans les deux dossiers donc..)

Cordialement

coucou Fred,

d = IIf(Dir(Dir2 & .Value & "*.txt") = "", 3, 4)

copier / coller non mis à jour, hein ?

dhany

coucou Fred,

d = IIf(Dir(Dir2 & .Value & "*.txt") = "", 3, 4)

copier / coller non mis à jour, hein ?

dhany

C'est déjà un bon début

C'est sûr que ça risquait pas de marcher, mais j'ai toujours la problématique, qu'on colorie les cellules, de la première instruction.

Finalement la recherche dans le premier repertoire ne sert à rien, puisqu'on l'écrase lors de la recherche dans le second !

Cordialement

Il semblerait, sans vouloir trop m'avancer qu'il fallait indiquer :

c = IIf(Dir(Dir1 & .Value & "*.txt") = "" And Dir(Dir2 & .Value & "*.txt") = "", 3, 4)

Cordialement

si t'as bien les résultats qu'tu veux, alors bravo !

dhany

Bah après "on y arrive toujours", mais de quel façon.. je suis contre le "bricolage"

alors t'as aucun meuble IKEA ?

dhany

Je suis dans l'agencement alors, ça me connaît ! (le bricolage du moins, pas IKEA !)

Mais ça doit être une expression du coin, bricolage = bidouille.. quoi

Sinon, tant qu'on y est, par rapport à mon code :

c = IIf(Dir(Dir1 & .Value & "*.txt") = "" And Dir(Dir2 & .Value & "*.txt") = "", 3, 4)

Comment rechercher dans le répertoire et sous-dossiers ?

J'ai trouvé ça, qui me paraît pas mal, mais j'ai pas l'impression que ce soit compatible avec mon code !

[...]

With Application.FileSearch 'recherche de fichier

[...]

.SearchSubFolders = True 'dans les sous-répertoires

[...]

désolé, pour la suite, je laisse la place à un autre intervenant ! (j'vais devoir partir très bientôt)

dhany

Bonjour, Salut Dhany !

FileSearch n'est plus utilisable dans les nouvelles versions.

Cordialement.

Bonsoir,

Je bloque maintenant sur le "For Each", qui n'admet que des variantes type Object.

Dans l'exemple que j'ai lu, on boucle sur tout les fichiers qui sont dans le dossier et sous-dossier.

Dans l'idée, c'est de rechercher si le fichier existe ou non, suivant Cells( i , 1).

Donc j'étais partie dans l'idée de dire :

    
For Each FileItem In SourceFolder.Files
FileItem = Cells(i, 1)
Cells(i, 2) = "X"
i = i + 1
Next FileItem

Alors bien sûr le code ne marche pas, car il est impossible de dire que "FileItem" est une valeur d'une cellule mais du coup je ne sais pas comment lui dire ça justement !

Cordialement

FileItem est un objet spécifique, c'est son nom que tu dois tester.

Essaie avec :

 If FileItem.Name = Cells(i, 1) Then

Je pense passer à côté de quelque chose :

    For Each FileItem In SourceFolder.Files
        If FileItem.Name = Cells(i, 1) & "*.txt" Then
        Cells(i, 2) = FileItem.Name
        End If
        i = i + 1
    Next FileItem

Pourtant en traduisant,

"Pour tout les fichiers se trouvant dans le dossier.."

"Si on trouve un fichier qui à le même nom que la valeur en cellule ( i , colonne A) .txt alors.."

"La cellule ( i , colonne B) = "X".. "

"On incrémente.."

Cordialement

Remplace = par Like !

MFerrand a écrit :

Remplace = par Like !

yes, I love this « Like » ! but subsitute only the first equal by Like, not the two others !

traduction : remplace seulement le 1er signe égal par Like, pas les 2 suivants !

(info complémentaire : non, non, il ne s'agit pas d'une pub Nike ! )

dhany

Salut à tous,

Sa ne semble pas mieux marcher

Cordialement

Bonsoir,

        If FileItem.Name Like Cells(i, 1) & "*.txt" Then
            Cells(i, 2) = FileItem.Name
        End If

Cette syntaxe est correcte. Si cela ne fonctionne pas où est l'erreur ? Vois à afficher ce que renvoie FileItem.Name pour y voir plus clair...

En effet, ça marche ! J'avais oubliez quelques caractères..

Cordialement

Rechercher des sujets similaires à "recherche dossiers fichier existe"