NomFichier = d & "" & Fichier.Name
If EstTrouve = False Then MsgBox ("Le fichier : " & Numcapa & ".xls n'existe pas") End If
Sub FichierAOuvrir() Dim Repertoire As String Dim Numcapa As String Dim fso As Object Dim Dossier As Object Dim SousDossier As Object Dim d As Object Dim Fichier As Object Dim NomFichier As String Dim EstTrouve As Boolean Repertoire = "C:\TEMP" Numcapa = "Export_HNO_11Mar2014-28" Set fso = CreateObject("Scripting.FileSystemObject") Set Dossier = fso.GetFolder(Repertoire) EstTrouve = False 'examen du dossier courant For Each d In Dossier.SubFolders For Each Fichier In d.Files If Fichier.Name Like Numcapa & "*.xls" Then If Not Fichier.Name Like "*notice*" Then NomFichier = d & "" & Fichier.Name ' si le fichier a été trouvé, on l'ouvre et on sort de la boucle EstTrouve = True Workbooks.Open NomFichier 'Exit Sub 'Si tu veux ensuite les ouvrir... pourquoi ne pas le faire directement ICI... FichierAOuvrir SousDossier.Path, Numcapa End If End If Next Fichier ' afin d'éviter de rechercher dans les autres fichiers du même sous dossier, on sort de la boucle Next d If EstTrouve = False Then MsgBox ("Le fichier : " & Numcapa & ".xls n'existe pas") End If Set fso = Nothing End Sub
'Si tu veux ensuite les ouvrir... pourquoi ne pas le faire directement ICI...
FichierAOuvrir SousDossier.Path, Numcapa
For Each Fichier In d.Filesmais je ne sais pas comment la mettre
If Not Fichier.Name Like "*notice*" Then
If Not Fichier.Name Like "*notice*" Then
NomFichier = d & "" & Fichier.Name
' si le fichier a été trouvé, on l'ouvre et on sort de la boucle
EstTrouve = True
Workbooks.Open NomFichier
Exit Sub
End If
Mon problème se situe que le programme ne quitte pas après avoir trouvé le fichierSi... mais à condition qu'il trouve le fichier !
il me manque une recherche sur les sous-répertoireOui... c'est pour ça qu'il faut utiliser du récursif...
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre questionMsgBox ("Le fichier : " & Numcapa & ".xls n'existe pas")
Option Compare Text Option Base 1 '------------------------------------------------- 'Module de classe ClasseFileSearch pour Excel 2007 'SilkyRoad 'http://silkyroad.developpez.com/ 'Mise à jour le 01.07.2007 '------------------------------------------------- 'La procédure recherche des fichiers en fonction des critères 'spécifiés et renvoie dans un tableau : 'Le nom des fichiers 'Le chemin 'La taille des fichers (en octets) 'La date de création 'La date de dernière modification 'Le type de fichier) '------------------------------------------------- 'Enumération pour les options de tri Public Enum Sort_By Sort_None sort_Name sort_Path sort_Size sort_DateCreated sort_LastModified sort_Type End Enum Dim TabFiles() As InfosResultFichiers Dim DirectoryPath As String Dim lngFoundFilesCount As Long Dim boolSousRep As Boolean Dim strExtens As String Dim optionSortBy As Long 'Propriété pour le répertoire de recherche Public Property Let FolderPath(strFolderPath As String) DirectoryPath = strFolderPath End Property 'Propriété pour rechercher dans les sous dossiers Public Property Let SubFolders(boolSubFolders As Boolean) boolSousRep = boolSubFolders End Property 'Propriété pour lister les fichiers correspondants à la requête Public Property Get Files(Idx As Long) As InfosResultFichiers Files = TabFiles(Idx) End Property 'Propriété pour l'extension des fichiers à rechercher Public Property Let Extension(strExtension As String) strExtens = strExtension End Property 'Propriété pour compte le nombre de fichiers Public Property Get FoundFilesCount() As Long FoundFilesCount = lngFoundFilesCount End Property 'Propriété pour l'option de tri Public Property Let SortBy(lngSortBy As Sort_By) optionSortBy = lngSortBy End Property 'Fonction d'exécution Public Function Execute() As Long 'Lance la recherche ListeFichiers DirectoryPath 'Vérifie que des fichiers ont été trouvés et qu'une option de tri a 'été spécifié avant de lancer la procédure de tri. If lngFoundFilesCount > 1 And optionSortBy <> Sort_By.Sort_None Then _ FonctionTri optionSortBy Execute = lngFoundFilesCount End Function 'Procédure pour lister les fichiers Private Sub ListeFichiers(strFolderName As String) Dim Fso As Object Dim NomDossier As Object, SousDossier As Object Dim objFichier As Object On Error GoTo Fin 'Vérifie si le dossier spécifié existe If Dir(strFolderName, vbDirectory Or vbHidden Or vbSystem) = "" Then Exit Sub Set Fso = CreateObject("Scripting.FileSystemObject") Set NomDossier = Fso.GetFolder(strFolderName) 'Boucle sur les fichiers du répertoire For Each objFichier In NomDossier.Files 'Vérifie l'extension du fichier If objFichier.Name Like strExtens Or strExtens = "" Then 'Redimensionne le tableau pour ajouter un nouvel élément lngFoundFilesCount = lngFoundFilesCount + 1 ReDim Preserve TabFiles(lngFoundFilesCount) 'Nom fichier TabFiles(lngFoundFilesCount).strFileName = objFichier.Name 'Répertoire TabFiles(lngFoundFilesCount).strPathName = objFichier.ParentFolder 'Taille du fichier (en octets) TabFiles(lngFoundFilesCount).lngSize = objFichier.Size 'Date de création TabFiles(lngFoundFilesCount).DateCreated = objFichier.DateCreated 'Date de création ou dernière modification TabFiles(lngFoundFilesCount).DateLastModified = objFichier.DateLastModified 'Type de fichier TabFiles(lngFoundFilesCount).strFileType = objFichier.Type End If Next objFichier 'Boucle récursive: '(Si l'option de recherche dans les sous répertoires a été spécifiée) If boolSousRep Then For Each SousDossier In NomDossier.SubFolders ListeFichiers SousDossier.Path Next SousDossier End If Exit Sub: Fin: MsgBox "Erreur '" & Err.Number & "'" & vbCrLf & vbCrLf & _ Err.Description, vbInformation End Sub 'Procédure de tri (reste à améliorer). Private Sub FonctionTri(optionSortBy As Sort_By) Dim i As Long, j As Long, k As Long Dim ValTemp As Variant 'Vérifie quel champ du tableau doit être trié Select Case optionSortBy Case Sort_By.sort_Name For i = LBound(TabFiles) To UBound(TabFiles) j = i For k = j + 1 To UBound(TabFiles) If TabFiles(k).strFileName <= TabFiles(j).strFileName Then j = k If TabFiles(k).strFileName <= TabFiles(j).strFileName Then j = k Next k If i <> j Then ValTemp = TabFiles(j).strFileName: TabFiles(j).strFileName = _ TabFiles(i).strFileName: TabFiles(i).strFileName = ValTemp ValTemp = TabFiles(j).strPathName: TabFiles(j).strPathName = _ TabFiles(i).strPathName: TabFiles(i).strPathName = ValTemp ValTemp = TabFiles(j).lngSize: TabFiles(j).lngSize = _ TabFiles(i).lngSize: TabFiles(i).lngSize = ValTemp ValTemp = TabFiles(j).DateCreated: TabFiles(j).DateCreated = _ TabFiles(i).DateCreated: TabFiles(i).DateCreated = ValTemp ValTemp = TabFiles(j).DateLastModified: TabFiles(j).DateLastModified = _ TabFiles(i).DateLastModified: TabFiles(i).DateLastModified = ValTemp ValTemp = TabFiles(j).strFileType: TabFiles(j).strFileType = _ TabFiles(i).strFileType: TabFiles(i).strFileType = ValTemp End If Next i Case Sort_By.sort_Path For i = LBound(TabFiles) To UBound(TabFiles) j = i For k = j + 1 To UBound(TabFiles) If TabFiles(k).strPathName <= TabFiles(j).strPathName Then j = k If TabFiles(k).strPathName <= TabFiles(j).strPathName Then j = k Next k If i <> j Then ValTemp = TabFiles(j).strFileName: TabFiles(j).strFileName = _ TabFiles(i).strFileName: TabFiles(i).strFileName = ValTemp ValTemp = TabFiles(j).strPathName: TabFiles(j).strPathName = _ TabFiles(i).strPathName: TabFiles(i).strPathName = ValTemp ValTemp = TabFiles(j).lngSize: TabFiles(j).lngSize = _ TabFiles(i).lngSize: TabFiles(i).lngSize = ValTemp ValTemp = TabFiles(j).DateCreated: TabFiles(j).DateCreated = _ TabFiles(i).DateCreated: TabFiles(i).DateCreated = ValTemp ValTemp = TabFiles(j).DateLastModified: TabFiles(j).DateLastModified = _ TabFiles(i).DateLastModified: TabFiles(i).DateLastModified = ValTemp ValTemp = TabFiles(j).strFileType: TabFiles(j).strFileType = _ TabFiles(i).strFileType: TabFiles(i).strFileType = ValTemp End If Next i Case Sort_By.sort_Size For i = LBound(TabFiles) To UBound(TabFiles) j = i For k = j + 1 To UBound(TabFiles) If TabFiles(k).lngSize <= TabFiles(j).lngSize Then j = k If TabFiles(k).lngSize <= TabFiles(j).lngSize Then j = k Next k If i <> j Then ValTemp = TabFiles(j).strFileName: TabFiles(j).strFileName = _ TabFiles(i).strFileName: TabFiles(i).strFileName = ValTemp ValTemp = TabFiles(j).strPathName: TabFiles(j).strPathName = _ TabFiles(i).strPathName: TabFiles(i).strPathName = ValTemp ValTemp = TabFiles(j).lngSize: TabFiles(j).lngSize = _ TabFiles(i).lngSize: TabFiles(i).lngSize = ValTemp ValTemp = TabFiles(j).DateCreated: TabFiles(j).DateCreated = _ TabFiles(i).DateCreated: TabFiles(i).DateCreated = ValTemp ValTemp = TabFiles(j).DateLastModified: TabFiles(j).DateLastModified = _ TabFiles(i).DateLastModified: TabFiles(i).DateLastModified = ValTemp ValTemp = TabFiles(j).strFileType: TabFiles(j).strFileType = _ TabFiles(i).strFileType: TabFiles(i).strFileType = ValTemp End If Next i Case Sort_By.sort_DateCreated For i = LBound(TabFiles) To UBound(TabFiles) j = i For k = j + 1 To UBound(TabFiles) If TabFiles(k).DateCreated <= TabFiles(j).DateCreated Then j = k If TabFiles(k).DateCreated <= TabFiles(j).DateCreated Then j = k Next k If i <> j Then ValTemp = TabFiles(j).strFileName: TabFiles(j).strFileName = _ TabFiles(i).strFileName: TabFiles(i).strFileName = ValTemp ValTemp = TabFiles(j).strPathName: TabFiles(j).strPathName = _ TabFiles(i).strPathName: TabFiles(i).strPathName = ValTemp ValTemp = TabFiles(j).lngSize: TabFiles(j).lngSize = _ TabFiles(i).lngSize: TabFiles(i).lngSize = ValTemp ValTemp = TabFiles(j).DateCreated: TabFiles(j).DateCreated = _ TabFiles(i).DateCreated: TabFiles(i).DateCreated = ValTemp ValTemp = TabFiles(j).DateLastModified: TabFiles(j).DateLastModified = _ TabFiles(i).DateLastModified: TabFiles(i).DateLastModified = ValTemp ValTemp = TabFiles(j).strFileType: TabFiles(j).strFileType = _ TabFiles(i).strFileType: TabFiles(i).strFileType = ValTemp End If Next i Case Sort_By.sort_LastModified For i = LBound(TabFiles) To UBound(TabFiles) j = i For k = j + 1 To UBound(TabFiles) If TabFiles(k).DateLastModified <= TabFiles(j).DateLastModified Then j = k If TabFiles(k).DateLastModified <= TabFiles(j).DateLastModified Then j = k Next k If i <> j Then ValTemp = TabFiles(j).strFileName: TabFiles(j).strFileName = _ TabFiles(i).strFileName: TabFiles(i).strFileName = ValTemp ValTemp = TabFiles(j).strPathName: TabFiles(j).strPathName = _ TabFiles(i).strPathName: TabFiles(i).strPathName = ValTemp ValTemp = TabFiles(j).lngSize: TabFiles(j).lngSize = _ TabFiles(i).lngSize: TabFiles(i).lngSize = ValTemp ValTemp = TabFiles(j).DateCreated: TabFiles(j).DateCreated = _ TabFiles(i).DateCreated: TabFiles(i).DateCreated = ValTemp ValTemp = TabFiles(j).DateLastModified: TabFiles(j).DateLastModified = _ TabFiles(i).DateLastModified: TabFiles(i).DateLastModified = ValTemp ValTemp = TabFiles(j).strFileType: TabFiles(j).strFileType = _ TabFiles(i).strFileType: TabFiles(i).strFileType = ValTemp End If Next i Case Sort_By.sort_Type For i = LBound(TabFiles) To UBound(TabFiles) j = i For k = j + 1 To UBound(TabFiles) If TabFiles(k).strFileType <= TabFiles(j).strFileType Then j = k If TabFiles(k).strFileType <= TabFiles(j).strFileType Then j = k Next k If i <> j Then ValTemp = TabFiles(j).strFileName: TabFiles(j).strFileName = _ TabFiles(i).strFileName: TabFiles(i).strFileName = ValTemp ValTemp = TabFiles(j).strPathName: TabFiles(j).strPathName = _ TabFiles(i).strPathName: TabFiles(i).strPathName = ValTemp ValTemp = TabFiles(j).lngSize: TabFiles(j).lngSize = _ TabFiles(i).lngSize: TabFiles(i).lngSize = ValTemp ValTemp = TabFiles(j).DateCreated: TabFiles(j).DateCreated = _ TabFiles(i).DateCreated: TabFiles(i).DateCreated = ValTemp ValTemp = TabFiles(j).DateLastModified: TabFiles(j).DateLastModified = _ TabFiles(i).DateLastModified: TabFiles(i).DateLastModified = ValTemp ValTemp = TabFiles(j).strFileType: TabFiles(j).strFileType = _ TabFiles(i).strFileType: TabFiles(i).strFileType = ValTemp End If Next i End Select End Sub
Option Explicit Public Type InfosResultFichiers strFileName As String strPathName As String lngSize As Long DateCreated As Date DateLastModified As Date strFileType As String End Type Public Function Nouvelle_Recherche() As ClasseFileSearch Set Nouvelle_Recherche = New ClasseFileSearch End Function Function ListeFichiers(NomF As String, chemin As String, Recursif As Boolean, ParamArray Exclu()) '------------------------------------------------------------------- 'Fonction permettant de lister les fichiers d'un répèertoire donnée ' NomF => Nom de la feuille ou copier les données ' Chemin => Répèertoire à scanner ' Recursif => Mode récursif ou non (recherche dans les sous dossiers) ' Exclu => liste du/des Fichier(s) à Exclure de la liste '------------------------------------------------------------------- '****************************************************************** Dim arrFile As Variant ' tableau contenant la liste des fichiers trouvés arrFile = Array(1) Dim NbFichiers As Integer ' Nb de fichiers dans le répertoire Dim NomFichier As String ' Nom du fichier Dim XCLU As Boolean ' test si trouve des fichiers a exlure XCLU = False 'valeur par défaut Dim Recherche As New ClasseFileSearch Set Recherche = Nouvelle_Recherche Dim i As Long Dim j As Long Dim x As Long With Recherche .FolderPath = chemin .SubFolders = Recursif If .Execute > 0 Then NbFichiers = .FoundFilesCount '---------------------------------------------------- '------ parcoure le répèrtoire '---------------------------------------------------- For i = 1 To NbFichiers NomFichier = .Files(i).strFileName chemin = .Files(i).strPathName '---------------------------------------------------- '------ Test si fait parti des exclusions '---------------------------------------------------- For j = 0 To UBound(Exclu) If NomFichier Like Exclu(j) Then XCLU = True End If Next j '---------------------------------------------------- ' ------ Traitement si le fichier correspond à la recherche '---------------------------------------------------- If XCLU <> True Then If NomFichier Like NomF Then 'Ajout du fichier dans la variable tableau x = UBound(arrFile) ReDim Preserve arrFile(x + 1) arrFile(x) = chemin & "" & NomFichier End If End If Next i End If End With ListeFichiers = arrFile End Function
Sub test() Dim mesFichiers As Variant Dim f As Long Dim Numcapa As String Numcapa = "Export*" mesFichiers = ListeFichiers(Numcapa & "*.xls", "C:\TEMP", True, False) For f = 1 To UBound(mesFichiers) - 1 Debug.Print mesFichiers(f) Next End Sub
Effectivement plusieurs fichiers peuvent être nommés partiellement Numcapa & "*.xls" d'où le test à la ligne 24 :Laisse entendre que tu ne veux pas ouvrir les fichiers contenant la chaîne "notice", y compris si elle contien Numcapa et ".xls", mais n'établit pas clairement l'existence d'un UNIQUE fichier contenant Numcapa et ".xls" mais ne contenant pas "notice" !
If Not Fichier.Name Like "*notice*" Then
- le fichier NumCapa...xls n'est pas trouvé, un message s'affiche du stylequi n'a de sens (ton msgbox) que ni numcapa est en effet le nom exact du fichier
MsgBox ("Le fichier : " & Numcapa & ".xls n'existe pas")
Private Declare Function SearchTreeForFile Lib "imagehlp" (ByVal RootPath As String, ByVal InputPathName As String, ByVal OutputPathBuffer As String) As Long
Private Sub Command1_Click()
Dim repertoire As String, numcapa As String
repertoire = "W:\Quality\Corrective & preventive Action Request\2014"
numcapa = "NumCapa...xls" '===>> ici le nom exact (avec son extension .xls)
MsgBox trouve(repertoire, numcapa)
End Sub
Private Function trouve(R As String, F As String) As String
Dim T As String, resu As Long
T = String(260, 0)
trouve = "le fichier " & F & " n'existe pas"
resu = SearchTreeForFile(R, F, T)
If resu <> 0 Then
trouve = Left$(T, InStr(1, T, Chr$(0)) - 1): Exit Function
End If
End Function
Dim Recherche As New ClasseFileSearch
Set Nouvelle_Recherche = New ClasseFileSearch
Sub OuvertureCAPA()
Dim WbFollow As Workbook ' classeur "CAR Follow Up"
Dim WsFollow As Worksheet ' Onglet "CAPA" du classeur "CAR Follow Up"
Dim NumCapa As String ' Récupérer le numéro de CAPA créé
Dim repertoire As String ' répertoire
Dim DateCapa As String ' Année du CAPA
Set WbFollow = ActiveWorkbook
Set WsFollow = WbFollow.Sheets("CAPA")
' Récupération du numéro du CAPA
WsFollow.Activate
NumCapa = ActiveCell.Value & "*.xls"
' Récupération de l'année du CAPA
DateCapa = Mid(NumCapa, 6, 4)
repertoire = "W:\Quality\Corrective & preventive Action Request" & DateCapa & ""
On Error GoTo fin
Workbooks.Open trouve(repertoire, NumCapa)
Exit Sub
fin:
MsgBox trouve(repertoire, NumCapa)
Exit Sub
End Sub
Function trouve(R As String, F As String) As String
Dim T As String, resu As Long
T = String(260, 0)
trouve = "le fichier " & F & " n'existe pas"
If Not NumCapa Like "notice*" Then
resu = SearchTreeForFile(R, F, T)
If resu <> 0 Then
trouve = Left$(T, InStr(1, T, Chr$(0)) - 1)
Exit Function
End If
End If
End Function