OVH Cloud OVH Cloud

Récupérer noms répertoires/sous-rép. et fichiers

21 réponses
Avatar
gauso
Bonjour,
Je cherche =E0 pouvoir r=E9cup=E9rer, dans un champ texte (Memo), les noms
des r=E9pertoires, sous-r=E9pertoires, ainsi que les noms (y compris
extensions) des fichiers contenus dans ceux-ci...
Apr=E8s parcours du forum et de l'aide Access (2003), je ne trouve rien
qui r=E9ponde =E0 ma question...
Des pistes, des bouts de codes, que je suis bien incapable
d'adapter...
J'ai =E9cris le code suivant qui fonctionne mais ne me ram=E8ne que le
premier niveau (ne va pas chercher dans les sous-r=E9pertoires !)

Dim sPath, fso, Directory, SubFolders, Folders, File, Files
Dim sTmp As String
sPath =3D "NomDeMonRepertoireAExplorer"

Set fso =3D CreateObject("Scripting.FileSystemObject")
Set Directory =3D fso.GetFolder(sPath)
Set SubFolders =3D Directory.SubFolders
For Each Folders In SubFolders
sTmp =3D sTmp & Folders.name & ";"

Set Files =3D Directory.Files
For Each File In Files
Debug.Print File.name
sTmp =3D sTmp & File.name & ";"
Next File

Next Folders
sTmp =3D Left(sTmp, Len(sTmp) - 1)
MsgBox sTmp
Me![Description] =3D Me![Description] & vbCrLf & sTmp
Set SubFolders =3D Nothing
Set fso =3D Nothing
Set Directory =3D Nothing
Set File =3D Nothing
Set Files =3D Nothing

Merci par avance =E0 ceux qui voudront bien m'aider,
Sonia.

10 réponses

1 2 3
Avatar
Michel_D
Bonjour,

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" a écrit dans le message de news:
Bonjour Michel,
Suite du feuilleton, mais quelle patience ;o)
Bon, j'ai un problème avec ta proposition : à quoi cela sert ton sub test()
? et comment l'utilises-tu ? (la première fois je ne l'ai carrément pas
ajouté car je ne voyais pas à quoi il servait : j'ai ajouté les déclarations
à Lister
Pour info j'associe directement Lister(spath) à click sur un bouton...
Et où je les mets ces déclarations que tu indiques au début ?
Dim oFso As Object
Dim sTmp As String
Dim sChemin As String


Merci de m'éclairer,
Sonia.


"Michel_D" a écrit dans le message de
news:
re,

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
Set oD = Nothing
End Sub








Avatar
gogo
Bonsoir,

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:RIBPIRIBPI_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...)
Avatar
Michel_D
Bonjour,

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:RIBPIRIBPI_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" a écrit dans le message de news:
Bonsoir,

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:RIBPIRIBPI_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...)




Avatar
gogo
Bonjour,
C'est super de chez "ça marche au pt'it poil" :o)
Merci, merci !
(Un tout petit problème restait : cela effaçait le texte initial contenu
dans mon champ Description...
J'ai donc simplement modifié dans Test(), le : Me![Description] = sTmp,
en Me![Description] = Me![Description] & vbCrLf & sTmp)

Ce forum est toujours aussi bien fréquenté...
Reconnaissance éternelle,
Sonia.


"Michel_D" a écrit dans le message de
news: fu1s8l$vs8$
Bonjour,

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:RIBPIRIBPI_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" a écrit dans le message de
news:
Bonsoir,

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:RIBPIRIBPI_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...)








Avatar
gogo
Bonjour,
Je ne sais si Michel D est encore dans le coin, et encore disposé à
m'aider... car après avoir cru que tout était parfait, j'ai encore deux
problèmes...
J'ai modifié le code parce que le chemin du répertoire à explorer est
conditionnel - (ci-dessous le code)
Et voilà ce qui cloche encore :
1) au résultat je n'ai pas les fichiers du 1er niveau (j'ai par contre tous
les sous-répertoires et les fichiers qu'ils contiennent, voir les sous-sous
répertoires et leurs fichiers...)
2) comment faire en sorte qu'apparaissent clairement la hiérarchie dans mon
résultat : l'ordre est correct et peut se déduire mais jusqu'à un certain
point quand même... ? Possible d'intégrer des tirets devant les occurences
correspondant à leurs niveaux, par exemple :

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
Next
End If
Set oDc = Nothing
Set oD = Nothing
End Sub
Avatar
gogo
Re,
En fait j'ai réussi à résoudre le premier problème, a ajoutant une condition
(si le répertoire est égal au répertoire courant) : et là j'ai donc aussi
les fichiers de premier niveau.. Cela donne :

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.
Avatar
Michel_D
Bonjour,

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


Bonjour,
Je ne sais si Michel D est encore dans le coin, et encore disposé à
m'aider... car après avoir cru que tout était parfait, j'ai encore deux
problèmes...
J'ai modifié le code parce que le chemin du répertoire à explorer est
conditionnel - (ci-dessous le code)
Et voilà ce qui cloche encore :
1) au résultat je n'ai pas les fichiers du 1er niveau (j'ai par contre tous
les sous-répertoires et les fichiers qu'ils contiennent, voir les sous-sous
répertoires et leurs fichiers...)
2) comment faire en sorte qu'apparaissent clairement la hiérarchie dans mon
résultat : l'ordre est correct et peut se déduire mais jusqu'à un certain
point quand même... ? Possible d'intégrer des tirets devant les occurences
correspondant à leurs niveaux, par exemple :

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
Next
End If
Set oDc = Nothing
Set oD = Nothing
End Sub




Avatar
gogo
Merci beaucoup Michel pour ta fidélité :o)

Pour l'instant cela plante sur Niv : non défini... je déclare comment ?
A plus,
Sonia.

"Michel_D" a écrit dans le message de
news:
Bonjour,

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


Bonjour,
Je ne sais si Michel D est encore dans le coin, et encore disposé à
m'aider... car après avoir cru que tout était parfait, j'ai encore deux
problèmes...
J'ai modifié le code parce que le chemin du répertoire à explorer est
conditionnel - (ci-dessous le code)
Et voilà ce qui cloche encore :
1) au résultat je n'ai pas les fichiers du 1er niveau (j'ai par contre
tous les sous-répertoires et les fichiers qu'ils contiennent, voir les
sous-sous répertoires et leurs fichiers...)
2) comment faire en sorte qu'apparaissent clairement la hiérarchie dans
mon résultat : l'ordre est correct et peut se déduire mais jusqu'à un
certain point quand même... ? Possible d'intégrer des tirets devant les
occurences correspondant à leurs niveaux, par exemple :

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
Next
End If
Set oDc = Nothing
Set oD = Nothing
End Sub





Avatar
Michel_D
re,

Tu as du oublier ceci :

Sub Lister(sPath, Niv)

que tu peux d'ailleurs transformer en :

Sub Lister(sPath As String, Niv As Long)


Merci beaucoup Michel pour ta fidélité :o)

Pour l'instant cela plante sur Niv : non défini... je déclare comment ?
A plus,
Sonia.

"Michel_D" a écrit dans le message de
news:
Bonjour,

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


Bonjour,
Je ne sais si Michel D est encore dans le coin, et encore disposé à
m'aider... car après avoir cru que tout était parfait, j'ai encore deux
problèmes...
J'ai modifié le code parce que le chemin du répertoire à explorer est
conditionnel - (ci-dessous le code)
Et voilà ce qui cloche encore :
1) au résultat je n'ai pas les fichiers du 1er niveau (j'ai par contre
tous les sous-répertoires et les fichiers qu'ils contiennent, voir les
sous-sous répertoires et leurs fichiers...)
2) comment faire en sorte qu'apparaissent clairement la hiérarchie dans
mon résultat : l'ordre est correct et peut se déduire mais jusqu'à un
certain point quand même... ? Possible d'intégrer des tirets devant les
occurences correspondant à leurs niveaux, par exemple :

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.






Avatar
gogo
Oups ! en effet...
Je viens d'essayer : évidemment ça fonctionne du feu de Dieu...
Alors bon, je ne sais plus quoi dire : braci, mervo... ou l'inverse... ;o)
En espérant ne plus avoir à te déranger,
Bon week-end,
Sonia.

"Michel_D" a écrit dans le message de
news: %23%
re,

Tu as du oublier ceci :

Sub Lister(sPath, Niv)

que tu peux d'ailleurs transformer en :

Sub Lister(sPath As String, Niv As Long)


Merci beaucoup Michel pour ta fidélité :o)

Pour l'instant cela plante sur Niv : non défini... je déclare comment ?
A plus,
Sonia.

"Michel_D" a écrit dans le message
de news:
Bonjour,

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


Bonjour,
Je ne sais si Michel D est encore dans le coin, et encore disposé à
m'aider... car après avoir cru que tout était parfait, j'ai encore deux
problèmes...
J'ai modifié le code parce que le chemin du répertoire à explorer est
conditionnel - (ci-dessous le code)
Et voilà ce qui cloche encore :
1) au résultat je n'ai pas les fichiers du 1er niveau (j'ai par contre
tous les sous-répertoires et les fichiers qu'ils contiennent, voir les
sous-sous répertoires et leurs fichiers...)
2) comment faire en sorte qu'apparaissent clairement la hiérarchie dans
mon résultat : l'ordre est correct et peut se déduire mais jusqu'à un
certain point quand même... ? Possible d'intégrer des tirets devant les
occurences correspondant à leurs niveaux, par exemple :

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.









1 2 3