Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2019 Rechercher un fichier dans plusieurs répertoires

qalibo30

XLDnaute Nouveau
Bonjour à tous,
J'espère que vous allez bien malgré les évènements.
Voilà j'ai recherché dans les discussions sur le site une solution à ma recherche mais en vain.

Dans un fichier EXCEL, j'ai dans la colonne A, des noms dans les différentes cellules, qui correspondent à des noms de fichiers qui peuvent se trouver
dans des répertoires ou sous-répertoires différents sous C:\ (mais ca pourrait être dans tout autre disque)
Je souhaiterai en cliquant sur une cellule de la colonne A, que le fichier qui a le même nom et qui se trouve donc dans un autre répertoire ou sous répertoire puisse s'ouvrir.

J'ai mis le fichier en questione en pièce jointe dans lequel il y dans Feuil1, une macro qui fonctionne mais seulement si le chemin de recherche est stipulé (ex: chemin = "C:\Perso\Administratif\")

J'ai trouvé 2 exemples (Sub FileSearch() et Sub FileSearch2()) d'utilisation de "SearchSubFolders" que j'ai copié dans le Module 1 mais malgré mes tentatives, il y a un soucis avec l'utilisation de With Application.FileSearch


Merci pour votre aide.
 

Pièces jointes

  • EXCEL Downloads-A utiliser pour les capabilités.xlsm
    20.8 KB · Affichages: 32

papacorno

XLDnaute Nouveau
Bonjour,
Est-ce qu'un lien hypertexte ne suffirait pas tout simplement?
Sélection du nom ou nombre dans la cellule , clic droit lien hypertexte et ensuite tu sélectionne le fichier à ouvrir où il se trouve. Si toutefois cela suffit..........
Cordialement
 

qalibo30

XLDnaute Nouveau
Bonjour Papacorno,

Le souci est que les liens hypertextes se cassent quelques fois. Le fait d'utiliser cette macro permettrait de retrouver les fichiers ou qu'ils soient si un jour ils sont déplacés.
 

jmfmarques

XLDnaute Accro
Bonjour
lorsque l'on en est réduit à rechercher un fichier par son nom, sur toutes les partitions éventuelles du disque dur, c'est qu'il y a un défaut majeur de conception pouvant dans certains cas avoir des conséquences plutôt fâcheuses. Rien , absolument rien, ne permettra en effet jamais d'affirmer que plusieurs fichiers, en plusieurs endroits différents, ne portent pas le même nom .
 

jmfmarques

XLDnaute Accro
Non, le nom des fichiers sera unique, ex : Cpc_AA1_Id15000_Nikon_0001
Désolé, mais (bis repetita) il s'agit certes de ta volonté et non de la preuve de l'inexistence absolue d'un fichier du même nom, pour une raison x ou y pouvant totalement échapper à ta volonté (une copie décidée par l'utilisateur, entre autre ...)

As-tu par ailleurs et de toutes manières une petite idée du temps que prendrait la recherche, y compris sur la seule partition C:\ ?
L'utilisation de l'outil de recherches de explorer.exe t'en donnera un aperçu.

Je vais laisser (je préfère) à d'autres le soin de t'accompagner éventuellement sans une telle démarche.
 

jmfmarques

XLDnaute Accro
il y aura un répertoire AA puis 50 sous répertoires qui seront sous le répertoire AA. Donc pas tant que ca
mais :
1) voilà (pour mémoire) ce que tu as écrit
qui correspondent à des noms de fichiers qui peuvent se trouver
dans des répertoires ou sous-répertoires différents sous C:\ (mais ca pourrait être dans tout autre disque)
2) cela ne change absolument rien à la possible existence de noms "doublons"
Bien. Je veux croire que tu comprendras que je te salue, mais quitte cette discussion.
 

patricktoulon

XLDnaute Barbatruc
bonsoir
que je résume la situation (voir si j'ai bien compris)
  1. tu a un dossier "AA" quelque part dans un disque ou partition à la racine
  2. dans ce dossier "AA" tu a des sous dossiers qui eux même peuvent en avoir d'autres
  3. tu recherche un/des fichier(s) (dont le(s) nom(s) est/sont dans une/des cellule(s))qui serait dans un de ces dossiers
  4. et tu es sur qu'il n'y aura pas de doublons
si c'est bien résumé une petite fonction récursive avec DIR devrait quand même être assez rapide
 

qalibo30

XLDnaute Nouveau
Bonjour patricktoulon,

Oui, c'est presque ca, un dossier AA (par exemple sous C:\) sous lequel il y des sous dossiers. Pas plus au niveau arborescence.
Dans ces sous dossiers il y a des fichiers Excel qui ont des noms différents (pas de doublons).
Le fichier Excel pilote "EXCEL Downloads", a dans sa colonne A de la Feuil1 les noms de ces différents fichiers Excel.
Le but est de double cliquer sur une de ses cellules de la colonne A afin d'ouvrir le fichier qui porte le même nom et qui se trouve dans l'un des sous dossiers.

(J'ai trouvé 2 exemples (Sub FileSearch() et Sub FileSearch2()) d'utilisation de "SearchSubFolders" que j'ai copié dans le Module 1 mais malgré mes tentatives, il y a un soucis avec l'utilisation de With Application.FileSearch)

Je mets un zip en piece jointe.

Merci pour ton aide et désolé si je "bafouille" dans mes explications.
 

Pièces jointes

  • test.zip
    41.6 KB · Affichages: 27

patricktoulon

XLDnaute Barbatruc
Ok
colle ça dans un module et lance test
VB:
Sub Test()
    maliste = liste_mes_Fichiers("C:\Résultats\")  ' EXTENTION DEMANDE
    For i = 2 To Cells(Rows.Count, "A").End(xlUp).Row
        For l = LBound(maliste) To UBound(maliste)
            If maliste(l) Like "*" & Cells(i, "A").Text & ".*" Then Cells(i, "B").Value = maliste(l)
        Next
    Next
End Sub

Function liste_mes_Fichiers(path As String, Optional T As Variant = Null, Optional ExT As Variant = 0, Optional a As Long = 0)
    Dim itemVU As String, folder As Variant, dirCollection As Collection, i As Long
    Set dirCollection = New Collection
    If IsNull(T) Then T = Array()
    crit = vbDirectory Or vbHidden Or vbNormal Or vbArchive Or vbReadOnly Or vbSystem Or vbVolume
    On Error GoTo passe
    itemVU = Dir(path, crit)
      Do Until itemVU = vbNullString
        If Left(itemVU, 1) <> "." And Not path Like "*RECYCLE*" Then
            If (GetAttr(path & itemVU) And vbDirectory) <> vbDirectory Then
                 If IsArray(ExT) Then
                    For i = 0 To UBound(ExT)
                        If itemVU Like "*" & ExT(i) Then
                            ReDim Preserve T(0 To a): T(a) = path & itemVU: a = a + 1:
                        End If
                    Next
                Else
                    ReDim Preserve T(0 To a): T(a) = path & itemVU: a = a + 1:
                End If
            End If
        End If
        'ajout des dossiers enfant direct de la racine a la collection
        If Left(itemVU, 1) <> "." And (GetAttr(path & itemVU) And vbDirectory) = vbDirectory Then
            dirCollection.Add itemVU
        End If
        itemVU = Dir()
    Loop
passe:
    Err.Clear
    'Exploration des subdossier inscrit dans la collection
    For Each folder In dirCollection
          liste_mes_Fichiers path & folder & "\", T, ExT, a
    Next folder
    liste_mes_Fichiers = T
End Function
demo
 

fanch55

XLDnaute Barbatruc
Salut à tous, je suis en accord avec @jmfmarques , c'est une recherche qui risque d'être :
  • Très longue physiquement parlant
  • inefficace à cause des doublons
  • inefficace à cause des problèmes éventuels de sécurité (dossiers protégés)
  • Très longue selon la configuration et le nombre de disques et les liens réseau .

Même Windows n'a pas vraiment réussi d'où la ponte de sa recherche de fichiers ( ou contenu ) d'après l'indexation des fichiers et la mise en cache de celle-ci qui pourrit bien les temps d’exécution du système .

Sans limitation dans les frontières de la recherche, c'est un no-way .
 

patricktoulon

XLDnaute Barbatruc
re
fanch55 moins d'un quart de seconde
pour que ca soit plus long de l'ordre du depassement des 3 secondes il faudrait qu'il y ai des centaines de fichier dans des dizaines de dossiers
et même là ,3 seconde c'est par la belle mere a avaler
et les doublons il a dit qu'il y en avait pas
les dossier protégés qui planteraient eventuellement le dir ben regarde la variable crit et la gestion d'erreur
 

fanch55

XLDnaute Barbatruc
@patricktoulon
Salut Pat, ta recherche a été rapide car tu t'es limité à un seul répertoire : "C:\Résultats\"
Je conviens que c'est effectivement rapide et dépendant de celui-ci .
As-tu essayé de prendre la racine C:\ comme demandé en début de fil ?
Ou un disque "N:\" qui pourrait être un disque réseau de 2 à 4 To ?
 

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…