Dim sPath, fso, Directory, SubFolders, Folders, File, Files
Dim sTmp As String
sPath = "NomDeMonRepertoireAExplorer"
Set fso = CreateObject("Scripting.FileSystemObject")
Set Directory = fso.GetFolder(sPath)
Set SubFolders = Directory.SubFolders
For Each Folders In SubFolders
sTmp = sTmp & Folders.name & ";"
Set Files = Directory.Files
For Each File In Files
Debug.Print File.name
sTmp = sTmp & File.name & ";"
Next File
Next Folders
sTmp = Left(sTmp, Len(sTmp) - 1)
MsgBox sTmp
Me![Description] = Me![Description] & vbCrLf & sTmp
Set SubFolders = Nothing
Set fso = Nothing
Set Directory = Nothing
Set File = Nothing
Set Files = Nothing
Merci par avance à ceux qui voudront bien m'aider,
Sonia.
Voici une procédure pour lister les répertoires et sous-répertoires.
Tu n'as qu'à y ajouter les fichiers
Sub test()
Call ListerSousRepertoires(LeNomDeTonDossier)
End Sub
Sub ListerSousRepertoires(sPath As String)
Dim fso As Object
Dim Directory As Object
Dim SubFolders As Object
Dim Folders As Object
Set fso = CreateObject("Scripting.FileSystemObject")
Set Directory = fso.GetFolder(sPath)
Set SubFolders = Directory.SubFolders
For Each Folders In SubFolders
Debug.Print strtmp & Folders.Name
Call ListerSousRepertoires(Folders.Path)
Next Folders
Set Folders = Nothing
Set SubFolders = Nothing
Set fso = Nothing
Set Directory = Nothing
End Sub
--
Cordialement,
Gilbert
"gauso" <sonia....@club-internet.fr> a écrit dans le message de
news:36270ee9-27c2-401e...@a22g2000hsc.googlegroups.com...
Je voulais donc remerçier Gilbert car finalement j'ai bidouillé quelque
chose qui semble bien fonctionner... voilà ce que cela donne (vos critiques
sont les bienvenues sur la forme) :
Sub test()
Call ListerSousRepertoires(LeNomDeTonDossier)
End Sub
Sub ListerSousRepertoires(spath As String)
Dim fso As Object
Dim Directory As Object
Dim SubFolders As Object
Dim Folders As Object
Dim sTmp As String
Set fso = CreateObject("Scripting.FileSystemObject")
Set Directory = fso.GetFolder(spath)
Set SubFolders = Directory.SubFolders
For Each Folders In SubFolders
Debug.Print strtmp & Folders.name
Call ListerSousRepertoires(Folders.Path)
Call ListerFichiers(Folders.Path)
Next Folders
Set Folders = Nothing
Set SubFolders = Nothing
Set fso = Nothing
Set Directory = Nothing
End Sub
Sub ListerFichiers(spath As String)
Dim fso As Object
Dim Repertoire As Object
Dim SubFolder As Object
Dim File, Files As Object
Set fso = CreateObject("Scripting.FileSystemObject")
Set Repertoire = fso.GetFolder(spath)
Set Files = Repertoire.Files
For Each File In Files
Debug.Print strtmp & File.name
Next File
Set Files = Nothing
Set File = Nothing
Set SubFolders = Nothing
Set fso = Nothing
Set Repertoire = Nothing
End Sub
Quand j'exécute cela, j'ai bien tous mes répertoires/sous-répertoires et
fichiers dans la fenêtre d'exécution : seulement voilà, maintenant je ne
sais comment récupérer le contenu de cette fenêtre pour l'intégrer dans le
champ de mon formulaire ? Ou bien une autre méthode pour récupérer
l'information ainsi rassemblée ?
Un truc que je ne pige pas (entre autre) c'est ce "strtmp", déclaré nul part
et qui pourtant passe sans problème ?
Bref merci de m'aider encore un peu : je bloque !
Cordialement,
Sonia.
gogo a écrit :
Ce "strtmp" est une variable non définis donc à la base de type "variant" en
gros le type va s'adapter lors de la 1ére affectation et comme il n'y a pas
d'affectation cette variable ne sert à rien, par contre cette variable ou
plutot "sTmp" pourrait te servir à récupérer par concaténation le résultat,
pour cela il faudrait bien sur transformer la procédure en fonction.
PS: Il doit être possible de regrouper les 2 procédures
ListerSousRepertoires
ListerFichiers
Sub test()
Call ListerSousRepertoires(LeNomDeTonDossier)
End Sub
Sub ListerSousRepertoires(spath As String)
Dim fso As Object
Dim Directory As Object
Dim SubFolders As Object
Dim Folders As Object
Dim strtmp
Set fso = CreateObject("Scripting.FileSystemObject")
Set Directory = fso.GetFolder(spath)
Set SubFolders = Directory.SubFolders
For Each Folders In SubFolders
Debug.Print strtmp & Folders.name
strtmp = strtmp & Folders.name & ";"
Call ListerSousRepertoires(Folders.Path)
Call ListerFichiers(Folders.Path)
Next Folders
Me![Description] = Me![Description] & vbCrLf & strtmp
Set Folders = Nothing
Set SubFolders = Nothing
Set fso = Nothing
Set Directory = Nothing
End Sub
Sub ListerFichiers(spath As String)
Dim fso As Object
Dim Repertoire As Object
Dim SubFolder As Object
Dim File, Files As Object
Dim strtmp
Dim recupfichiers As String
Set fso = CreateObject("Scripting.FileSystemObject")
Set Repertoire = fso.GetFolder(spath)
Set Files = Repertoire.Files
For Each File In Files
Debug.Print strtmp & File.name
strtmp = strtmp & File.name & ";"
Next File
Me![Description] = Me![Description] & vbCrLf & strtmp
Set Files = Nothing
Set File = Nothing
Set SubFolder = Nothing
Set fso = Nothing
Set Repertoire = Nothing
End Sub
... cela fonctionne : le seul problème est l'ordre dans lequel je récupère
les noms des répertoires et fichiers : voilà ce qu'il me donne :
Sous-sous-REP1;
ImageSous-REP1.bmp;
Sous-REP1;
Document-REP1.doc;ImageREP1.bmp;
SousREP2;
DocREP2.doc;
REPERTOIRE1;REPERTOIRE2;
Là ou j'aimerais bien avoir quelque chose qui redonne un peu l'organisation
des choses, du genre :
REPERTOIRE1
- Document-REP1.doc;
- ImageREP1.bmp;
- Sous-REP1;
-- ImageSous-REP1.bmp;
-- Sous-sous-REP1;
REPERTOIRE2
- DocREP2.doc;
- SousREP2;
Des idées pour obtenir un tel résultat ?
Par avance, ma reconnaissance :o)
Sonia.
Bon analysont un peu la méthode employée :
En premier tu appelle la procédure "ListerSousRepertoires" avec en paramêtre
le nom du répertoire origine puis tu effectue un traitement récursif (liste)
sur les éventuels sous-répertoires et lorsqu'il n'y a plus de
sous-répertoire tu liste les fichiers.
et toi tu voudrais lister d'abord les fichiers du répertoire à analyser puis
traiter de manière récursive les éventuels sous-répertoire, donc il va falloir
placer la procédure qui liste les fichiers avant la boucle qui traite les
sous-répertoires.
Dim fso As Object
Dim Directory As Object
Dim SubFolders As Object
Dim Folders As Object
Dim strtmp
Set fso = CreateObject("Scripting.FileSystemObject")
Set Directory = fso.GetFolder(spath)
Set SubFolders = Directory.SubFolders
For Each Folders In SubFolders
Debug.Print strtmp & Folders.name
strtmp = strtmp & Folders.name & ";"
Me![Description] = Me![Description] & vbCrLf & strtmp
Call ListerFichiers(Folders.Path)
Call ListerSousRepertoires(Folders.Path)
Next Folders
Sub ListerFichiers(spath As String)
.... qui me donnent :
REPERTOIRE1;
DocREP1.doc;ImageREP1.bmp;
Sous-REP1;
imageSous-REP1.bmp;
Sous-sous-REP1;
REPERTOIRE1;REPERTOIRE2;
docREP2.doc;
SousREP2;
base-sousREP2.mdb;
... presque parfait quoi :o) Sinon la répétition du noms de l'ensemble des
sous-répertoires de premier niveaux !
On pourrait faire avec car la logique est claire et la correction manuelle
facile, mais bon... et là encore je bloque...
Autre idée ?
Merci encore,
Dim sTmp As String
Sub Test()
Dim sChemin As String
sChemin = "C:\TonChemin"
sTmp = ""
Lister sChemin
Debug.Print sTmp
End Sub
Sub Lister(sPath)
Dim oFso As Object
Dim oDc As Object
Dim oD As Object
Dim oF As Object
Set oFso = CreateObject("Scripting.FileSystemObject")
If oFso.FolderExists(sPath) Then
Set oDc = oFso.GetFolder(sPath)
sTmp = sTmp & Mid(sPath, InStrRev(sPath, "\") + 1) & ";" & vbCrLf
For Each oF In oDc.Files
sTmp = sTmp & oF.Name & ";"
Next
sTmp = sTmp & vbCrLf
Set oF = Nothing
For Each oD In oDc.SubFolders
Lister sPath & "\" & oD.Name
Next
End If
Set oFso = Nothing
Set oDc = Nothing
Set oD = Nothing
End Sub
Sous-sous-REP1;
Sous-REP1;
imageSous-REP1.bmp;
REPERTOIRE1;
DocREP1.doc;ImageREP1.bmp;
SousREP2;
base-sousREP2.mdb;
REPERTOIRE2;
docREP2.doc;
REPERTOIRE3;
ImageREP3.bmp;
RIBPI_C_1979_01;
... je vais voir si je peux faire mieux (ça m'étonnerait quand même, mais
bon)
Cordialement,
Sonia.
gogo a écrit :
> Bonsoir,
> Merci beaucoup pour ton intérêt, mais pas encore tout à fait ça : pas
> l'ordre souhaité en tous les cas... car voilà ce que cela donne :
>
> Sous-sous-REP1;
>
> Sous-REP1;
> imageSous-REP1.bmp;
>
> REPERTOIRE1;
> DocREP1.doc;ImageREP1.bmp;
>
> SousREP2;
> base-sousREP2.mdb;
>
> REPERTOIRE2;
> docREP2.doc;
>
> REPERTOIRE3;
> ImageREP3.bmp;
>
> RIBPI_C_1979_01;
>
> .... je vais voir si je peux faire mieux (ça m'étonnerait quand même, mais
> bon)
> Cordialement,
> Sonia.
Essaye avec le code suivant :
Dim oFso As Object
Dim sTmp As String
Dim sChemin As String
Sub Test()
Set oFso = CreateObject("Scripting.FileSystemObject")
sChemin = "C:\TonChemin"
sTmp = ""
Lister sChemin
Debug.Print sTmp
Set oFso = Nothing
End Sub
Sub Lister(sPath)
Dim oDc As Object
Dim oD As Object
Dim oF As Object
If oFso.FolderExists(sPath) Then
Set oDc = oFso.GetFolder(sPath)
If sPath<>sChemin Then
sTmp = sTmp & Mid(sPath, InStrRev(sPath, "\") + 1) & ";" & vbCrLf
For Each oF In oDc.Files
sTmp = sTmp & oF.Name & ";"
Next
sTmp = sTmp & vbCrLf
Set oF = Nothing
End If
For Each oD In oDc.SubFolders
Lister sPath & "\" & oD.Name
Next
End If
Set oDc = Nothing
Merci de m'éclairer,
Sonia.
"Michel_D" <Michel...@orange-ft.com.invalid> a écrit dans le message de
news: O09ertan...@TK2MSFTNGP06.phx.gbl...
Question :
Comment tu fournis l'indication du chemin si tu associe Lister(sPath)
au click d'un bouton ?
Donne le code que tu utilisais jusqu'à présent ce sera plus simple.
PS:Les variables oFso, sTmp, sChemin sont des variables globales
déclarées à l'extérieur de toutes procédures/fonctions, elles sont donc
visibles par toutes les procédures/fonctions et doivent être situées au
début du code.
"gogo" <sonia....@club-internet.fr> a écrit dans le message de news:u9U2kpfn...@TK2MSFTNGP05.phx.gbl...
Ben voilà comment j'ai utilisé ta première proposition :
Sub Lister(sPath)
Dim oFso As Object
Dim oDc As Object
Dim oD As Object
Dim oF As Object
Dim sTmp As String
Set oFso = CreateObject("Scripting.FileSystemObject")
If oFso.FolderExists(sPath) Then
Set oDc = oFso.GetFolder(sPath)
sTmp = sTmp & mId(sPath, InStrRev(sPath, "\") + 1) & ";" & vbCrLf
For Each oF In oDc.Files
sTmp = sTmp & oF.name & ";"
Next
sTmp = sTmp & vbCrLf
Set oF = Nothing
For Each oD In oDc.SubFolders
Lister sPath & "\" & oD.name
Next
End If
Me![Description] = Me![Description] & vbCrLf & sTmp
Set oFso = Nothing
Set oDc = Nothing
Set oD = Nothing
End Sub
Private Sub Commande844_Click()
Lister ("I:\RIBPI\RIBPI_C_1979_01")
End Sub
C'est dans le click que je donne le chemin (la c'est juste pour tester,
ensuite il sera conditionnel : le répertoire à explorer sera fonction de
l'enregistrement en cours...)
Quant aux déclarations en dehors des procédures, chez moi cela ne fonctionne
pas... (ou je ne m'y prends pas comme il faut : mais obligé de remettre le
stmp à l'intérieur du Sub...)
Il faut déclarer les 3 premières variables tous au début (en haut).
Option Compare Database
Dim oFso As Object
Dim sTmp As String
Dim sChemin As String
Sub Test()
Set oFso = CreateObject("Scripting.FileSystemObject")
sChemin = "I:\RIBPI\RIBPI_C_1979_01"
sTmp = ""
Lister sChemin
Me![Description] = sTmp
' MsgBox sTmp
Set oFso = Nothing
End Sub
Sub Lister(sPath)
Dim oDc As Object
Dim oD As Object
Dim oF As Object
If oFso.FolderExists(sPath) Then
Set oDc = oFso.GetFolder(sPath)
If sPath <> sChemin Then
sTmp = sTmp & Mid(sPath, InStrRev(sPath, "\") + 1) & ";" & vbCrLf
For Each oF In oDc.Files
sTmp = sTmp & oF.Name & ";"
Next
sTmp = sTmp & vbCrLf
Set oF = Nothing
End If
For Each oD In oDc.SubFolders
Lister sPath & "\" & oD.Name
Next
End If
Set oDc = Nothing
Set oD = Nothing
End Sub
Private Sub Commande844_Click()
Test
End Sub
"gogo" <sonia....@club-internet.fr> a écrit dans le message de news:OLN6Qiln...@TK2MSFTNGP05.phx.gbl...
Ce forum est toujours aussi bien fréquenté...
Reconnaissance éternelle,
Sonia.
"Michel_D" <michel...@orange-ft.com.invalid> a écrit dans le message de
news: fu1s8l$vs8$1...@news.rd.francetelecom.fr...
REPERTOIRE1
- Sous-répertoire1
-- Fichier du sous-répertoire1
-- Sous-sous répertoire1
--- fichier du sous-sous répertoire1
- Sous-répertoire2
-- Fichier du sous-répertoire2
REPERTOIRE2
etc.
hmm??
Par avance encore merci,
Sonia.
Voici le code :
Option Compare Database
Dim oFso As Object
Dim sTmp As String
Dim sChemin As String
Dim RepFonds As String
Dim NomRepObjet As String
Dim ChemRepObjet As String
Dim NomRepPhase As String
Option Explicit
Sub Test2()
RepFonds = "I:\" & Me![Abreviation]
NomRepObjet = Me![Refobjet]
ChemRepObjet = "I:\" & Me![Abreviation] & "\" & NomRepObjet & "\"
NomRepPhase = Me![RepPhase]
Set oFso = CreateObject("Scripting.FileSystemObject")
sChemin = ChemRepObjet & NomRepPhase & "\"
sTmp = ""
Lister sChemin
Me![Description] = Me![Description] & vbCrLf & sTmp
Set oFso = Nothing
End Sub
Sub Lister(sPath)
Dim oDc As Object
Dim oD As Object
Dim oF As Object
If oFso.FolderExists(sPath) Then
Set oDc = oFso.GetFolder(sPath)
If sPath <> sChemin Then
sTmp = sTmp & mId(sPath, InStrRev(sPath, "\") + 1) & ";" & vbCrLf
For Each oF In oDc.Files
sTmp = sTmp & oF.name & ";"
Next
sTmp = sTmp & vbCrLf
Set oF = Nothing
End If
For Each oD In oDc.SubFolders
Lister sPath & "\" & oD.name
Ne déclare en variable globale que lorsque c'est nécessaire sinon il vaut
mieux déclarer les variables au niveau de la procédure ou de la fonction
ou elle s'applique, ceci étant dit, voila ma proposition :
Option Compare Database
Dim oFso As Object
Dim sTmp As String
Dim sChemin As String
Option Explicit
Sub Test2()
' RepFonds = "I:\" & Me![Abreviation]
' NomRepObjet = Me![Refobjet]
' ChemRepObjet = "I:\" & Me![Abreviation] & "\" & NomRepObjet & "\"
' NomRepPhase = Me![RepPhase]
Set oFso = CreateObject("Scripting.FileSystemObject")
' sChemin = ChemRepObjet & NomRepPhase & "\"
sChemin = "I:\" & Me![Abreviation] & "\" & Me![Refobjet] & "\" & Me![RepPhase]
sTmp = ""
Lister sChemin, 0
Me![Description] = Me![Description] & vbCrLf & sTmp
Set oFso = Nothing
End Sub
Sub Lister(sPath, Niv)
Dim oDc As Object
Dim oD As Object
Dim oF As Object
If oFso.FolderExists(sPath) Then
Set oDc = oFso.GetFolder(sPath)
If sPath <> sChemin Then
sTmp = sTmp & String(Niv-1,"-") & Mid(sPath,InstrRev(sPath,"\")+1) & ";" & vbcrlf
End If
If oDc.Files.Count>0 Then
sTmp = sTmp & String(Niv,"-")
For Each oF In oDc.Files
sTmp = sTmp & oF.name & ";"
Next
sTmp = sTmp & vbCrLf
Set oF = Nothing
End If
For Each oD In oDc.SubFolders
Lister sPath & "\" & oD.name,Niv+1
Next
End If
Set oDc = Nothing
Set oD = Nothing
End Sub
gogo a écrit :
Sub Lister(sPath)
Dim oDc As Object
Dim oD As Object
Dim oF As Object
If oFso.FolderExists(sPath) Then
Set oDc = oFso.GetFolder(sPath)
If sPath = sChemin Then 'code ajouté : toute la condition If... End if
sTmp = sTmp & mId(sPath, InStrRev(sPath, "\") + 1) & ";" & vbCrLf
For Each oF In oDc.Files
sTmp = sTmp & oF.name & ";" & vbCrLf & "- "
Next
sTmp = sTmp & vbCrLf & "- "
Set oF = Nothing
End If
If sPath <> sChemin Then
sTmp = sTmp & mId(sPath, InStrRev(sPath, "\") + 1) & ";" & vbCrLf
For Each oF In oDc.Files
sTmp = sTmp & oF.name & ";" & vbCrLf & "- "
Next
sTmp = sTmp & vbCrLf & "- "
Set oF = Nothing
End If
For Each oD In oDc.SubFolders
Lister sPath & "\" & oD.name
Next
End If
Set oDc = Nothing
Set oD = Nothing
End Sub
Dites-moi si c'est la bonne méthode ? (en tous les cas ça marche)...
Par contre je n'ai pas avancé sur le 2e problème : trouver le moyen de
rendre explicite la hiérarchie...
En espérant que quelqu'un saura m'aider ?
Par avance, merci !
Sonia.
Pour l'instant cela plante sur Niv : non défini... je déclare comment ?
A plus,
Sonia.
"Michel_D" <Michel...@orange-ft.com.invalid> a écrit dans le message de
news: eMUsUsho...@TK2MSFTNGP04.phx.gbl...
Tu as du oublier ceci :
Sub Lister(sPath, Niv)
que tu peux d'ailleurs transformer en :
Sub Lister(sPath As String, Niv As Long)
gogo a écrit :
"Michel_D" <Michel...@orange-ft.com.invalid> a écrit dans le message de
news: %23%23nUxTio...@TK2MSFTNGP03.phx.gbl...
Mais tu ne me dérange pas et puis je ne suis pas tout seul à pouvoir te répondre.
> Bon week-end,
A toi aussi.