VBA - recherche avec sous dossier et ouverture fichier
Bonjour la communauté,
voilà, je sais que la fonction application.filesearch n'existe plus et j'en suis bien embêté.
J'ai un récapitulatif de toutes mes consultations avec des personnes, et je génère un compte rendu WORD automatique en fonction des NOM, PRENOM et d'un NUMERO.
Selon que le compte rendu est rédigé ou nom, je le place dans des dossiers différents.
Quelqu'un a t'il une piste:?:
J'ai beau chercher depuis plusieurs semaines dans les méthodes de remplacement de application.filesearch (notamment une méthode consistant à utiliser une input box et donc à rechercher manuellement) mais je ne trouve aucune solution.
Quelqu'un peut il m'orienter sur une méthode qui permette recherche et recherche sous dossier?
Avec mes remerciements.
Bonjour,
Une piste à adapter :
Sub test()
Dim Dossier As String
Dim Classeur As String
Dim Chemin As String
Dossier = "E:\Dossiers Modules\" 'adapte le chemin
Classeur = "Mon classeur.xls" 'adapter le nom du classeur avec tes variables NOM&PRENOM
Chemin = RecupFichier(Dossier, Classeur)
If Chemin = "" Then
MsgBox "Le fichier '" & Classeur & "' ne se trouve pas dans l'emplacement indiqué !"
Else
MsgBox "Le fichier ci-dessous :" _
& vbCrLf _
& Classeur _
& vbCrLf _
& vbCrLf _
& "se trouve dans le dossier ci-dessous :" _
& vbCrLf _
& Replace(Chemin, Classeur, "")
End If
End Sub
Function RecupFichier(Dossier As String, Classeur As String)
Dim FSO As Object
Dim Dos As Object
Dim Fichier As Object
Dim NomClasseur As String
Set FSO = CreateObject("Scripting.FileSystemObject")
'si le dossier n'existe pas, fin !
If FSO.FolderExists(Dossier) = False Then
MsgBox "Le dossier portant ce nom n'existe pas !"
Exit Function
End If
'recherche dans les fichiers du dossier
For Each Fichier In FSO.GetFolder(Dossier).Files
If Dir(Fichier) = Classeur Then RecupFichier = Fichier: Exit Function
Next Fichier
'parcours les sous-dossiers
For Each Dos In FSO.GetFolder(Dossier).SubFolders
'recherche dans les fichiers du sous-dossier
For Each Fichier In Dos.Files
If Dir(Fichier) = Classeur Then RecupFichier = Fichier: Exit Function
Next Fichier
'rappel de la proc (récursivité)
RecupFichier Dossier & "\" & Dos.Name, Classeur
Next Dos
End FunctionBonjour Theze,
merci beaucoup. Ta solution est géniale et ce code très élégant
J'aimerais vraiment pouvoir atteindre ce niveau.
Puis je te poser une autre petites questions
- Comment dans cette fonction ou cette sub, générer une msgBox si plusieurs occurrences du fichier ont été trouvé (par exemple un fichier "Lulu.xls" dans un dossier et "lulu.xls" dans son sous-dossier)? Pour information j'ai déjà constaté que ton msgbox "Fichier introuvable dans ce dossier" apparaît justement à cette occasion cependant j'aimerais pourvoir à cette éventualité et ainsi proposer à l'utilisateur une sélection manuelle (ça je sais faire)
Merci beaucoup de cette première aide en tout cas.
Bonjour,
Ici, j'ai transformé la fonction pour qu'elle retourne un tableau de valeurs (les chemins avec le nom du fichier), adaptes à tes besoins j'ai mis des commentaires :
Sub Test()
Dim Tbl() As String
Dim Dossier As String
Dim Classeur As String
Dim Chaine As String
Dim I As Integer
Dossier = "C:\Mon dossier\Mon sous-dossier\" 'adapte le chemin
Classeur = "Mon Classeur.xls" 'adapter le nom du classeur avec tes variables NOM&PRENOM
Tbl() = RecupFichier(Dossier, Classeur)
If Not (Not Tbl()) Then
'ici, les chemins et nom du fichier sont concaténés et la fonction Replace() ci-dessous
'supprime dans cette chaîne les noms du classeur afin de n'indiquer que les chemins
'c'est dans cette boucle ci-dessous qu'il te faut récupérer les valeurs qui t'intéressent...
For I = 1 To UBound(Tbl): Chaine = Chaine & Tbl(I) & vbCrLf: Next I
MsgBox "Le fichier ci-dessous :" _
& vbCrLf _
& Classeur _
& vbCrLf _
& vbCrLf _
& "se trouve dans le(s) dossier(s) ci-dessous :" _
& vbCrLf _
& Replace(Chaine, Classeur, "")
Else
MsgBox "Le fichier '" & Classeur & "' ne se trouve pas dans l'emplacement indiqué !"
End If
End Sub
'fonction retournant un tableau de String (chemin et nom du fichier)
Function RecupFichier(Dossier As String, Classeur As String) As String()
Dim FSO As Object
Dim Dos As Object
Dim Fichier As Object
Dim Tbl() As String
Dim I As Integer
Set FSO = CreateObject("Scripting.FileSystemObject")
'si le dossier n'existe pas, fin !
If FSO.FolderExists(Dossier) = False Then
MsgBox "Le dossier portant ce nom n'existe pas !"
Exit Function
End If
'recherche dans les fichiers du dossier
For Each Fichier In FSO.GetFolder(Dossier).Files
If Dir(Fichier) = Classeur Then
I = I + 1: ReDim Preserve Tbl(1 To I)
Tbl(I) = Fichier
End If
Next Fichier
'parcours les sous-dossiers
For Each Dos In FSO.GetFolder(Dossier).SubFolders
'recherche dans les fichiers du sous-dossier
For Each Fichier In Dos.Files
If Dir(Fichier) = Classeur Then
I = I + 1: ReDim Preserve Tbl(1 To I)
Tbl(I) = Fichier
End If
Next Fichier
'rappel de la proc (récursivité)
RecupFichier Dossier & "\" & Dos.Name, Classeur
Next Dos
'retourne un tableau contenant le chemin complet et le nom du fichier
RecupFichier = Tbl()
End FunctionMerci beaucoup.
Bon je vais devoir passer un niveau, mais c'est un bon défis.
Merci de ton aide.
Thézé,
ça y est j'ai étudié ton code, c'est parfaitement adapté à mon besoin, je t'en remercie.
J'ai vraiment besoin de pratiquer encore, je constate mes difficultés.
Peux tu m'expliquer pourquoi tu fais appelle récursivement à la fonction...
RecupFichier Dossier & "\" & Dos.Name, Classeur Et quelle condition réussit à faire que cette boucle de récursivité ne tourne pas infiniment sur elle-même?
Merci en tout cas pour la qualité (à première vue à mon niveau en tout cas) de ton code.
J'aurais certainement abandonné tout seul.
Merci.
Bonjour,
Peux tu m'expliquer pourquoi tu fais appelle récursivement à la fonction...
C'est propre au compilateur, en entrant dans un dossier je pense qu'il crée un tableau et y stocke les adresses afin de pouvoir remonter au dossier et partir latéralement puis ayant fait tous les dossiers du dossier supérieur, il remonte pour faire de même dans le dossier de même niveau et ainsi de suite.
C'est ce que j'ai remarqué en créant une fonction récursive qui n'a rien à voir avec des dossiers mais avec des combinaisons de lettres dans un tableaux de tableaux