Probleme de listage imbriqué de repertoire et fichier [Résolu]

Signaler
Messages postés
201
Date d'inscription
mercredi 1 décembre 2004
Statut
Membre
Dernière intervention
13 août 2005
-
Messages postés
3757
Date d'inscription
mardi 23 septembre 2003
Statut
Modérateur
Dernière intervention
13 mars 2006
-
bonjour!

j'ai un répertoire nommé PMS. celui-ci contient des repertoires types 'WPnumero-description', chacun de ces répertoires possède un sous répertoire nommé 'temporary reports', ce dernier contient des documents word.
Ce que je veux faire :
pour chaque répertoire 'WPnumero-description', aller dans 'temporary reports'et
lister tous les noms de fichiers
j'ai reussi a faire ce code pour lister les repertoires 'WPnumero-descritpion':
--------------------------------------------------------------------------------------------
Option Explicit
Private Sub CommandButton1_Click()
'add the reference 'Microsoft Scripting Runtime'in order to execute
'the following code



Dim fso As FileSystemObject, dossier As Folder
Dim generalDirectory As String


generalDirectory = "Z:\PMS"


Set fso = New FileSystemObject
Set dossier = fso.GetFolder(generalDirectory)
lister dossier


End Sub





Public Function lister(dossier As Folder)


Dim sFolder As Folder
Dim sFolderTabl() As String
Dim indexsFolder, maxiNum As Integer


indexsFolder = 0
For Each sFolder In dossier.SubFolders
indexsFolder = indexsFolder + 1
ReDim Preserve sFolderTabl(indexsFolder) As String
sFolderTabl(indexsFolder - 1) = sFolder.path + "\temporary reports"


Selection.TypeText Text:=sFolderTabl(indexsFolder - 1)
Selection.MoveDown Unit:=wdLine, Count:=1


Next
Selection.MoveDown Unit:=wdLine, Count:=1



End Function
---------------------------------------------------------------------------------------------
j'ai reussi à faire le code listant les fichiers(type 'WPnumero-description-weeknumber) dans un répertoire et en selectionnant le dernier ('number' le plus élevé):

-------------------------------------------------------------------------------------------
Option Explicit
'add the reference 'Microsoft Scripting Runtime'in order to execute
'the following code
Private Sub liste_Click()


Dim fso As FileSystemObject, dossier As Folder
Dim generalDirectory As String
generalDirectory = "Z:\PMS"
Set fso = New FileSystemObject
Set dossier = fso.GetFolder(generalDirectory)
lister dossier


End Sub


Public Function lister(dossier As Folder)


Dim fichier As File
Dim Tabl() As String
Dim indexfile, maxiNum As Integer
Dim selectedFilePath As String


indexfile = 0
For Each fichier In dossier.Files
indexfile = indexfile + 1
ReDim Preserve Tabl(indexfile) As String
Tabl(indexfile - 1) = fichier.Name


Selection.TypeText Text:=Tabl(indexfile - 1)
Selection.MoveDown Unit:=wdLine, Count:=1


Next


Selection.MoveDown Unit:=wdLine, Count:=1
'selection of the last case
maxiNum = UBound(Tabl)
selectedFilePath = Tabl(maxiNum - 1)
Selection.TypeText Text:=selectedFilePath
Selection.MoveDown Unit:=wdLine, Count:=1



End Function


-------------------------------------------------------------------------------------------
le problème c'est pour imbriquer les deux, je ne sais pas s'il faut que je déclare (dans le 2eme code) une nouvelle variable de la même façon que 'dossier'(en elevant justemement 'dossier'), et donner un nouveau chemin (celui du sous repertoire) parce quand je fais cela, ca ne marche pas (je ne sais pas comment m'y prendre)

à l'aideu!

merci si vous avez des propositions...
Daydayerement Vôtre

8 réponses

Messages postés
3757
Date d'inscription
mardi 23 septembre 2003
Statut
Modérateur
Dernière intervention
13 mars 2006
16
Une fonction ou une sub récursive est une procédure qui s'appelle elle-même, dans mon exemple, Rechercher_Fichiers.

Pour le next sans for, je pense que ça vient de ton if sans end if :

If Right(fl.Name, 4) = ".doc" Then
Selection.TypeText Text:=subfld.path
Selection.MoveDown Unit:=wdLine, Count:=1

If Right(fl.Name, 4) = ".doc" Then
Selection.TypeText Text:=subfld.path
Selection.MoveDown Unit:=wdLine, Count:=1
End if

Quant à réutiliser le même fso, c'est pas interdit mais tu peux en créer d'autres.

Cordialement, CanisLupus
3
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 179 internautes nous ont dit merci ce mois-ci

Messages postés
201
Date d'inscription
mercredi 1 décembre 2004
Statut
Membre
Dernière intervention
13 août 2005

en fait, j'ai fait cela comme code e imbriquant les boucles:

-----------------------------------------------------------------------------------------
Option Explicit
Private Sub CommandButton1_Click()
'add the reference 'Microsoft Scripting Runtime'in order to execute
'the following code



Dim fso As FileSystemObject, dossier As Folder
Dim generalDirectory As String


generalDirectory = "Z:\PMS"


Set fso = New FileSystemObject
Set dossier = fso.GetFolder(generalDirectory)
lister dossier


End Sub





Public Function lister(dossier As Folder)


Dim sFolder As Folder
Dim sFolderTabl() As String
Dim indexsFolder, maxiNum As Integer


Dim fichier As File
Dim indexfile As Integer
Dim Tabl() As String
Dim selectedFileName, selectedFilePath As String



indexsFolder = 0
For Each sFolder In dossier.SubFolders
indexsFolder = indexsFolder + 1
ReDim Preserve sFolderTabl(indexsFolder) As String
sFolderTabl(indexsFolder - 1) = sFolder.path + "\temporary reports"


Selection.TypeText Text:=sFolderTabl(indexsFolder - 1)
Selection.MoveDown Unit:=wdLine, Count:=1


indexfile = 0
For Each fichier In dossier.Files
indexfile = indexfile + 1
ReDim Preserve Tabl(indexfile) As String
Tabl(indexfile - 1) = fichier.Name

Selection.TypeText Text:=Tabl(indexfile - 1)
Selection.MoveDown Unit:=wdLine, Count:=1

Next
Selection.MoveDown Unit:=wdLine, Count:=1

maxiNum = UBound(Tabl)
selectedFileName = Tabl(maxiNum - 1)
selectedFilePath = sFolderTabl(indexsFolder - 1) + selectedFileName
Selection.TypeText Text:=selectedFilePath
Selection.MoveDown Unit:=wdLine, Count:=1


Next
Selection.MoveDown Unit:=wdLine, Count:=1



End Function


------------------------------------------------------------------------------------------


mon problème se situe au niveau de 'for each fichier in dossier.files', je pense: il faut que je dise qu'en fait je cherche maintenant dans le répertoire temporary report, celui appartenant au répertoire dans la boucle supérieure du code...

Daydayerement Vôtre
Messages postés
3757
Date d'inscription
mardi 23 septembre 2003
Statut
Modérateur
Dernière intervention
13 mars 2006
16
Regarde du côté d'une fonction récusrsive.

Un exemple à moi (là je cherche des .doc) :

Un Form avec une listbox (list1) et un commandbutton (command1)

Dim fso As FileSystemObject


'Sélectionner "Microsoft Scripting Runtime" dans Projet/Références
Private Sub Rechercher_Fichiers(Dossier As String)
Dim fld As Folder
Dim subfld As Folder
Dim fl As File


' Création du FileSystemObject
Set fso = CreateObject("Scripting.FileSystemObject")


' Set du dossier à parcourir
Set fld = fso.GetFolder(Dossier)

' Listage des fichiers du dossier
For Each fl In fld.Files
If Right(fl.Name, 4) = ".doc" Then
List1.AddItem Dossier & fl.Name
End If
Next

' Recherche récursive des fichiers dans les sous-dossiers
For Each subfld In fld.SubFolders
Rechercher_Fichiers Dossier & subfld.Name & ""
Next

End Sub


Private Sub Command1_Click()
Dim Dossier_Depart As String


Screen.MousePointer = vbHourglass
' Dossier de départ
Dossier_Depart = "C:" ' toujours terminer la chaine par un ""

' Rechercher les fichiers
Rechercher_Fichiers Dossier_Depart

Screen.MousePointer = vbDefault

MsgBox "Recherche terminée"

End Sub



Cordialement, CanisLupus
Messages postés
201
Date d'inscription
mercredi 1 décembre 2004
Statut
Membre
Dernière intervention
13 août 2005

merci pour ta réponse!



là je vais regarder ce que je peux en faire... par contre, juste une
question de vocabulaire (peut être un peu bête) : c'est quoi une
fonction récursive?....

Daydayerement Vôtre
Messages postés
201
Date d'inscription
mercredi 1 décembre 2004
Statut
Membre
Dernière intervention
13 août 2005

c'est pas vraiment cela que je voudrais faire... je dois d'abord lister
tous les sous-dossiers d'un dossier nommé 'PMS' (qui se trouve dans
C:\), et pour chaque sous dossier, rajouter l'extension 'temporary
reports' (ca, pas de problème), en bout de leur chemin, et ensuite,
toujours pour chacun, lister tous les sous fichiers : je dois faire ce
listage de fichier sous dossier par sous dossier. ene ffet, à chaque
fois que je vais lister, c'est pour choisir un seul des fichiers de
chaque sous dossier. je ne dois pas d'abord faire la liste entière des
sous dossiers, puis la liste entière des fichiers.

Daydayerement Vôtre
Messages postés
201
Date d'inscription
mercredi 1 décembre 2004
Statut
Membre
Dernière intervention
13 août 2005

mais bon, là je t'ai répondu au vu de ton code, je l'ai pas épluché.... je reviens si j'ai un souci. encor merci!
Daydayerement Vôtre
Messages postés
201
Date d'inscription
mercredi 1 décembre 2004
Statut
Membre
Dernière intervention
13 août 2005

c'est remoi...



bon, j'ai remanié ton code à ma sauce et cela donne cela:



Dim fld, newfld As Folder

Dim subfld As Folder

Dim fl As File

Dim fso As FileSystemObject

Dim Dossier, newPath As String



Set fso = New FileSystemObject

Dossier = "C:\Documents and Settings\Propriétaire\Bureau\Claire\PL\PMS"

' Set du dossier à parcourir

Set fld = fso.GetFolder(Dossier)



' Recherche récursive des fichiers dans les sous-dossiers

For Each subfld In fld.SubFolders



newPath = Dossier + subfld.Name + ""

Set newfld = fso.GetFolder(newPath)



For Each fl In newfld.Files

If Right(fl.Name, 4) = ".doc" Then

Selection.TypeText Text:=subfld.path

Selection.MoveDown Unit:=wdLine, Count:=1



Next



Next



End Sub





le problème, c"est que le compileur me dit qu'il y a un 'next' sans
'for' alors que je l'ai bien mis pour les deux 'next'.... à ton avis,
cela viens d'où?? du 'set ' que j'ai mis dans le for principal?

le problème c'est que j'ai besoin de faire ce set pour rediriger ma recherche de fichier dans chaque sous répertoire...



merci de ta réponse


Daydayerement Vôtre
Messages postés
201
Date d'inscription
mercredi 1 décembre 2004
Statut
Membre
Dernière intervention
13 août 2005

au fait, en faisant le set de 'newfld', est ce que j'ai le droit de
réutiliser 'fso' ou est ce que je dois utiliser un autre
filesystemobject? (j'ai pas encore la réponse vu que mon ciode ne
tourne pas à cause de ce next sans for)

Daydayerement Vôtre