OVH Cloud OVH Cloud

liste de fichier, avec VBA

3 réponses
Avatar
Yves-Marie BIERSOHN
Bonjour,

Je souhaiterais obtenir dans une feuille excel, un menu déroulant avec la
liste des disque dur, dans une autre liste, l'arborescence des fichiers
dépendant du premier menu déroulant, et un bouton validation pour obtenir a
partir de la ligne "5" et en colonne "A" la liste de tous les fichiers du
dossier préselectionner.
Ensuite, je souhaite en colonne B, mettre une formule que je maitrise :) et
ensuite, une autre macro, pour renommer tous les fichier avec la valeur de
la colonne B.
Voila,
Merci beaucoup.

3 réponses

Avatar
Philippe.R
Bonsoir Yves-Marie,

Tu dois trouver de quoi construire ça sur le site de Frédéric.

http://perso.wanadoo.fr/frederic.sigonneau/

avec en particulier ceci :

http://perso.wanadoo.fr/frederic.sigonneau/code/Fichiers/LecteursExistants.txt

et ceci :

http://perso.wanadoo.fr/frederic.sigonneau/code/Fichiers/ListeDossiersSousDossiers.txt
--
Amicales Salutations

Retirer A_S_ pour répondre.
XL97 / XL2002

"Yves-Marie BIERSOHN" a écrit dans le message de
news:
Bonjour,

Je souhaiterais obtenir dans une feuille excel, un menu déroulant avec la
liste des disque dur, dans une autre liste, l'arborescence des fichiers
dépendant du premier menu déroulant, et un bouton validation pour obtenir a
partir de la ligne "5" et en colonne "A" la liste de tous les fichiers du
dossier préselectionner.
Ensuite, je souhaite en colonne B, mettre une formule que je maitrise :) et
ensuite, une autre macro, pour renommer tous les fichier avec la valeur de
la colonne B.
Voila,
Merci beaucoup.




Avatar
Hervé
Salut Yves-Marie,
Voila ce que je t'ai bidouillé :
Mets sur ta feuille un ComboBox que tu nomme "CmbLecteurs", une ListeBox que
tu nomme "LstDossiers" ensuite mets tout le code dans le module de la
feuille. Pour le test j'ai mis le remplissage du Combo pour les lecteurs sur
Activate de la feuille donc change de feuille et revient ton Combo sera
plein. Un clic sur un dossier dans la liste t'inscris à partir de A5 les
fichiers Excel du dossier. Un double clic ouvre le dossier et affiche les
sous-dossiers avec un décalage un double-clic sur le dossier parent remonte
dans arborescence. Je n'ai plus le temps de chercher pour le moment comment
renommer tous les classeurs sans les ouvrir. Je verrai demain. Pour le
moment, teste et dis moi si cela te convient. Attention, j'utilise la
cellule [A1] pour afficher le chemin complet du dossier ouvert Adapte si
cela te dérange. Fait le test sur un classeur vierge.

Private Declare Function LesLecteurs Lib _
"kernel32" Alias "GetLogicalDriveStringsA" _
(ByVal nBufferLength As Long, _
ByVal lpBuffer As String) As Long

'à mettre dans ThisWorkbook.Open
'pour avoir tous les lecteurs
'à l'ouverture du classeur
'l'appel :
'>Private Sub Workbook_Open()
'>Feuil1.Lecteurs
'>End Sub
'Je l'ai mis ici pour les tests
Private Sub Worksheet_Activate()
Lecteurs
End Sub

Private Sub CmbLecteurs_Click()

With Me
.LstDossiers.Clear
CheminComplet .CmbLecteurs.Value, False
Dossiers [A1]
ChargerFichiers .CmbLecteurs.Value
End With

End Sub

Private Sub LstDossiers_Click()

Dim I As Integer
Dim Chemin As String
Dim NomDossier As String

Range("A5:A" & Range("A5").End(xlDown).Row).Clear

With Me
Chemin = [A1]
With .LstDossiers
'si le dossier est un sous dossier (5 espaces à gauche)
'rajoute au chemin le nom du dossier sélectionné
If Left(.Value, 5) = Space(5) Then
Chemin = Chemin & Trim(.Value) & ""
Else
'si le chemin indique seulement le lecteur, rajoute
'le dossier sélectionné
If Len(Chemin) = 3 Then
Chemin = Chemin & .Value & ""
End If
End If
End With
End With

ChargerFichiers Chemin

End Sub

Private Sub LstDossiers_DblClick(ByVal Cancel As MSForms.ReturnBoolean)

Dim DosParent As String

On Error Resume Next
With Me.LstDossiers
If .ListIndex = 0 Then
If Err = 0 Then
DossierParent
Exit Sub
End If
End If
End With
On Error GoTo 0
'récupère le dossier parent, le recharge après avoir
'vidé la ListBox. Défini le chemin et appelle la
'proc SousDossiers pour charger les sousdossiers
'et les mettre en décalés

With Me.LstDossiers
DosParent = Trim(.Value)
.Clear
.AddItem DosParent
CheminComplet DosParent, True
SousDossiers [A1], DosParent
End With

Range("A5:A" & Range("A5").End(xlDown).Row).Clear
'charge les fichiers du dossier parent

ChargerFichiers [A1]

End Sub

Public Sub Lecteurs()
Dim LstLecteur As String
Dim Retour As Long
Dim I As Integer
Const LecteurDef As String = "C:" 'lecteur par défaut

'récup de la liste des lecteurs
LstLecteur = String(50, Chr$(0))
Retour = LesLecteurs(50, LstLecteur)
CmbLecteurs.Clear
For I = 1 To Len(LstLecteur)
If Mid(LstLecteur, I, 1) = "" Then
CmbLecteurs.AddItem UCase(Mid(LstLecteur, I - 2, 3))
End If
Next I

[A1] = LecteurDef
CmbLecteurs.Value = LecteurDef

End Sub

Private Sub Dossiers(Chemin As String)
Dim Dossier As String
Dim Tbl()
Dim I As Integer

'évite l'erreur du lecteur CD vide
'et plus bas, le tableau non initialisé
'dû à une disquette ou CD vierge
On Error Resume Next
Dossier = Dir(Chemin, 16)
If Err.Number <> 0 Then Exit Sub

Do While Dossier <> ""
If Dossier <> "." And Dossier <> ".." Then
If (GetAttr(Chemin & Dossier) _
And 16) = 16 Then
I = I + 1
ReDim Preserve Tbl(1 To I)
Tbl(I) = Dossier
End If
End If
Dossier = Dir
Loop

TriTableau Tbl()

'charge la listbox
Me.LstDossiers.List = Tbl()

Erase Tbl

End Sub

Sub TriTableau(Tbl())
Dim Tempo
Dim I As Integer
Dim J As Integer

'éffectue un tri
'croissant du tableau
For I = 1 To UBound(Tbl) - 1
For J = I + 1 To UBound(Tbl)
If Trim(Tbl(I)) > Trim(Tbl(J)) Then
Tempo = Tbl(J)
Tbl(J) = Tbl(I)
Tbl(I) = Tempo
End If
Next J
Next I

End Sub

Private Sub SousDossiers(Chemin As String, _
Optional DosParent As String)
Dim Tbl()
Dim Dossier As String
Dim I As Integer

'récupère les dossiers pour le chemin spécifié
'insére pour chaque sous-dossier 5 espaces avant
'afin de les démarquer du dossier parent en les
'décalant vers la droite
Dossier = Dir(Chemin, 16)
Do While Dossier <> ""
If Dossier <> "." And Dossier <> ".." Then
If (GetAttr(Chemin & Dossier) _
And 16) = 16 Then
I = I + 1
ReDim Preserve Tbl(1 To I)
Tbl(I) = Space(5) & Dossier
'Me.LstDossiers.AddItem Space(5) & Dossier
End If
End If
Dossier = Dir
Loop

On Error Resume Next
TriTableau Tbl()

'charge la listbox
For I = 1 To UBound(Tbl)
Me.LstDossiers.AddItem Tbl(I)
Next

Erase Tbl

End Sub

Sub ChargerFichiers(Chemin As String)

Dim Fichier As String
Dim FS As FileSearch
Dim I As Integer
Dim J As Integer
'vide les cellules
Range("A5:A" & Range("A5").End(xlDown).Row).Clear
'effectue la recherche
With Me
Set FS = Application.FileSearch
With FS
.LookIn = Chemin
.Filename = "*.xls" 'seulement Excel
If .Execute > 0 Then
J = 5
For I = 1 To .FoundFiles.Count
Range("A" & J) = Dir(.FoundFiles(I))
J = J + 1
Next I
End If
End With
End With

Set FS = Nothing

End Sub

Private Sub CheminComplet(Dossier As String, SousDossier As Boolean)
Dim I As Integer
Dim Chemin As String
Dim DosCourrant As String
Dim Lecteur As Boolean

'cherche si le dossier est le lecteur
'si il l'est, attribut la valeur de la variable
'Dossier à la variable Chemin, sinon, défini
'le chemin
Lecteur = Dossier Like "?:"

If Lecteur = False Then
Chemin = [A1]
'recherche le nom du dossier ouvert
For I = Len(Chemin) - 1 To 3 Step -1
If Mid(Chemin, I, 1) = "" Then
DosCourrant = Mid(Chemin, I + 1, Len(Chemin) - (I + 1))
Exit For
End If
Next I

If I < 3 Then I = 3
'si le dossier est différent, éffectue le changement
'ou le rajoute en fonction de la valeur de la variable
'SousDossier
If Dossier <> DosCourrant Then
If SousDossier = False Then
Chemin = Left(Chemin, I) & Dossier & ""
Else
Chemin = Chemin & Dossier & ""
End If
Else
Chemin = Chemin
End If
Else
Chemin = Dossier
End If
'défini la cellule qui sert pour la recherche
'et l'information sur le dossier ouvert
[A1] = Chemin

End Sub

Private Sub DossierParent()
Dim I As Integer
Dim J As Integer
Dim Chemin As String
Dim DosParent As String

Chemin = [A1]

'si le chemin ne contient pas que le lecteur
'recherche la barre de séparation
If Len(Chemin) > 3 Then
For I = Len(Chemin) - 1 To 3 Step -1
If Mid(Chemin, I, 1) = "" Then
Exit For
End If
Next I
'recherche le dossier parent
For J = I - 1 To 3 Step -1
If Mid(Chemin, J, 1) = "" Then
DosParent = Mid(Chemin, J + 1, (I - 1) - J)
Exit For
End If
Next J
Else
'défini I à 3 pour le lecteur
I = 3
End If

With Me
.LstDossiers.Clear
[A1] = Left(Chemin, I)
If DosParent <> "" Then
.LstDossiers.AddItem DosParent
SousDossiers [A1]
Else
Dossiers [A1]
End If
ChargerFichiers [A1]
If Len([A1]) <> 3 Then
.LstDossiers.ListIndex = 0
End If
End With

End Sub

Hervé.

"Yves-Marie BIERSOHN" a écrit
dans le message news:
Bonjour,

Je souhaiterais obtenir dans une feuille excel, un menu déroulant avec la
liste des disque dur, dans une autre liste, l'arborescence des fichiers
dépendant du premier menu déroulant, et un bouton validation pour obtenir
a

partir de la ligne "5" et en colonne "A" la liste de tous les fichiers du
dossier préselectionner.
Ensuite, je souhaite en colonne B, mettre une formule que je maitrise :)
et

ensuite, une autre macro, pour renommer tous les fichier avec la valeur de
la colonne B.
Voila,
Merci beaucoup.




Avatar
Hervé
Re salut Yves-Marie,
Voila le code le plus complet que j'ai pus te faire (qui est sûrement
optimisable, mais je n'ai plus envie de creuser). Rajoute un bouton (comme
les autres contrôles, issus de la barre "Boîte à outils Contrôles") que tu
nomme "CmdRenommer" et colle tout le code ci-dessous dans le module de la
feuille (je l'ai modifié par endroits). Il te faut avoir une certaine
rigueur dans les nouveaux noms des classeurs (sans carractères interdits,
avec l'extension .xls, etc...) afin de ne pas avoir de mauvaises surprises.
Le chemin du dossier inscrit en [A1] est nécessaire au renommage des
classeurs, alors ne le supprime pas. Tu peux modifier la cellule dans le
code, si [A1] est occupée. Pour le renommage, les classeurs sont dabors
recopiés avec le nouveau nom puis l'original est supprimés dans la foulée.
Amuse toi bien :

Private Declare Function LesLecteurs Lib _
"kernel32" Alias "GetLogicalDriveStringsA" ( _
ByVal nBufferLength As Long, _
ByVal lpBuffer As String) As Long

Private Declare Function CopierFichiers Lib _
"kernel32" Alias "CopyFileA" ( _
ByVal lpExistingFileName As String, _
ByVal lpNewFileName As String, _
ByVal bFailIfExists As Long) _
As Long

Private Declare Function SupprimerFichiers Lib _
"kernel32" Alias "DeleteFileA" ( _
ByVal lpFileName As String) As Long

Dim CheminDossier As String

'à mettre dans ThisWorkbook.Open
'pour avoir tous les lecteurs
'à l'ouverture du classeur
'l'appel :
'>Private Sub Workbook_Open()
'>Feuil1.Lecteurs
'>End Sub
'Je l'ai mis ici pour les tests
Private Sub Worksheet_Activate()
Lecteurs
End Sub

Private Sub CmbLecteurs_Click()

With Me
.LstDossiers.Clear
CheminComplet .CmbLecteurs.Value, False
Dossiers CheminDossier
ChargerFichiers .CmbLecteurs.Value
[A1] = .CmbLecteurs.Value
CheminDossier = .CmbLecteurs.Value
End With

End Sub

Private Sub LstDossiers_Click()

Dim I As Integer
Dim Chemin As String
Dim NomDossier As String

With Me
Chemin = CheminDossier
With .LstDossiers
'si le dossier est un sous-dossier
'(5 espaces à gauche) rajoute au
'chemin le nom du dossier sélectionné
If Left(.Value, 5) = Space(5) Then
Chemin = Chemin & Trim(.Value) & ""
Else
'si le chemin indique seulement le lecteur
'rajoute le dossier sélectionné
If Len(Chemin) = 3 Then
Chemin = Chemin & .Value & ""
End If
End If
End With
End With

ChargerFichiers Chemin
[A1] = Chemin

End Sub

Private Sub LstDossiers_DblClick( _
ByVal Cancel As MSForms.ReturnBoolean)

Dim DosParent As String
Static Niveau As Integer

On Error Resume Next
With Me.LstDossiers
If .ListIndex = 0 Then
If Err = 0 Then
Niveau = Niveau - 1
If Niveau = 0 Then
[A1] = CmbLecteurs.Value
End If
DossierParent
Exit Sub
End If
End If
End With
On Error GoTo 0

'récupère le dossier parent, le recharge
'après avoir vidé la ListBox. Défini le
'chemin et appelle la proc SousDossiers
'pour charger les sousdossiers et les
'mettre en décalés
With Me.LstDossiers
DosParent = Trim(.Value)
.Clear
.AddItem DosParent
CheminComplet DosParent, True
SousDossiers CheminDossier
Niveau = Niveau + 1
End With

Range("A5:A" & Range("A5").End(xlDown).Row).Clear
'charge les fichiers du dossier parent

ChargerFichiers CheminDossier

End Sub

Private Sub CmdRenommer_Click()
Dim Plage As Range
Dim Cel As Range

If [A5] = "" Then Exit Sub

Set Plage = Range([A5], IIf([A6] <> "", _
[A5].End(xlDown), [A5]))
'effectue une copie en renommant
'le classeur et supprime l'original
For Each Cel In Plage
'0 = écrasé, 1 = pas écrasé
CopierFichiers [A1] & Cel.Value, _
[A1] & Cel.Offset(0, 1).Value, 0
SupprimerFichiers [A1] & Cel.Value
Next Cel
'simule un click sur la listbox
'pour recharger la plage (A5 à A?) avec les
'classeurs nouvellement renommés
LstDossiers_Click

Set Cel = Nothing
Set Plage = Nothing
End Sub

Public Sub Lecteurs()
Dim LstLecteur As String
Dim Retour As Long
Dim I As Integer
'lecteur par défaut, à modifier
Const LecteurDef As String = "C:"

'récup de la liste des lecteurs
LstLecteur = String(50, Chr$(0))
Retour = LesLecteurs(50, LstLecteur)
CmbLecteurs.Clear
For I = 1 To Len(LstLecteur)
If Mid(LstLecteur, I, 1) = "" Then
CmbLecteurs.AddItem UCase( _
Mid(LstLecteur, I - 2, 3))
End If
Next I

CheminDossier = LecteurDef
[A1] = LecteurDef
CmbLecteurs.Value = LecteurDef

End Sub

Private Sub Dossiers(Chemin As String)
Dim Dossier As String
Dim Tbl()
Dim I As Integer

'évite l'erreur du lecteur CD vide
'et plus bas, le tableau non initialisé
'dû à une disquette ou CD vierge
On Error Resume Next
Dossier = Dir(Chemin, 16)
If Err.Number <> 0 Then Exit Sub

Do While Dossier <> ""
If Dossier <> "." And Dossier <> ".." Then
If (GetAttr(Chemin & Dossier) _
And 16) = 16 Then
I = I + 1
ReDim Preserve Tbl(1 To I)
Tbl(I) = Dossier
End If
End If
Dossier = Dir
Loop

TriTableau Tbl()

'charge la listbox
Me.LstDossiers.List = Tbl()

Erase Tbl

End Sub

Sub TriTableau(Tbl())
Dim Tempo
Dim I As Integer
Dim J As Integer

'éffectue un tri
'croissant du tableau
For I = 1 To UBound(Tbl) - 1
For J = I + 1 To UBound(Tbl)
If Trim(Tbl(I)) > Trim(Tbl(J)) Then
Tempo = Tbl(J)
Tbl(J) = Tbl(I)
Tbl(I) = Tempo
End If
Next J
Next I

End Sub

Private Sub SousDossiers(Chemin As String)
Dim Tbl()
Dim Dossier As String
Dim I As Integer

'récupère les dossiers pour le chemin spécifié
'insére pour chaque sous-dossier 5 espaces avant
'afin de les démarquer du dossier parent en les
'décalant vers la droite
Dossier = Dir(Chemin, 16)
Do While Dossier <> ""
If Dossier <> "." And Dossier <> ".." Then
If (GetAttr(Chemin & Dossier) _
And 16) = 16 Then
I = I + 1
ReDim Preserve Tbl(1 To I)
Tbl(I) = Space(5) & Dossier
End If
End If
Dossier = Dir
Loop

On Error Resume Next
TriTableau Tbl()

'charge la listbox
For I = 1 To UBound(Tbl)
Me.LstDossiers.AddItem Tbl(I)
Next

Erase Tbl

End Sub

Sub ChargerFichiers(Chemin As String)

Dim Fichier As String
Dim FS As FileSearch
Dim I As Integer
Dim J As Integer

'vide les cellules
Range("A5:A" & Range("A5").End(xlDown).Row).Clear
'effectue la recherche
With Me
Set FS = Application.FileSearch
With FS
.LookIn = Chemin
.Filename = "*.xls" 'seulement Excel
If .Execute > 0 Then
J = 5
For I = 1 To .FoundFiles.Count
Range("A" & J) = Dir(.FoundFiles(I))
J = J + 1
Next I
End If
End With
End With

Set FS = Nothing

End Sub

Private Sub CheminComplet(Dossier As String, _
SousDossier As Boolean)
Dim I As Integer
Dim Chemin As String
Dim DosCourrant As String
Dim Lecteur As Boolean

'cherche si le dossier est le lecteur
'si il l'est, attribut la valeur de
'la variableDossier à la variable
'Chemin, sinon, défini le chemin
Lecteur = Dossier Like "?:"

If Lecteur = False Then
Chemin = CheminDossier
'recherche le nom du dossier ouvert
For I = Len(Chemin) - 1 To 3 Step -1
If Mid(Chemin, I, 1) = "" Then
DosCourrant = Mid(Chemin, I + 1, _
Len(Chemin) - (I + 1))
Exit For
End If
Next I

If I < 3 Then I = 3
'si le dossier est différent, éffectue
'le changement ou le rajoute en fonction
'de la valeur de la variable SousDossier
If Dossier <> DosCourrant Then
If SousDossier = False Then
Chemin = Left(Chemin, I) & Dossier & ""
Else
Chemin = Chemin & Dossier & ""
End If
Else
Chemin = Chemin
End If
Else
Chemin = Dossier
End If

CheminDossier = Chemin

End Sub

Private Sub DossierParent()
Dim I As Integer
Dim J As Integer
Dim Chemin As String
Dim DosParent As String

Chemin = CheminDossier

'si le chemin ne contient pas que le lecteur
'recherche la barre de séparation
If Len(Chemin) > 3 Then
For I = Len(Chemin) - 1 To 3 Step -1
If Mid(Chemin, I, 1) = "" Then
Exit For
End If
Next I
'recherche le dossier parent
For J = I - 1 To 3 Step -1
If Mid(Chemin, J, 1) = "" Then
DosParent = Mid(Chemin, J + 1, (I - 1) - J)
Exit For
End If
Next J
Else
'défini I à 3 pour le lecteur
I = 3
End If

With Me
.LstDossiers.Clear
CheminDossier = Left(Chemin, I)
If DosParent <> "" Then
.LstDossiers.AddItem DosParent
SousDossiers CheminDossier
Else
Dossiers CheminDossier
End If
ChargerFichiers CheminDossier
If Len(CheminDossier) <> 3 Then
.LstDossiers.ListIndex = 0
End If
End With

End Sub

Hervé.

"Hervé" a écrit dans le message news:

Salut Yves-Marie,
Voila ce que je t'ai bidouillé :
Mets sur ta feuille un ComboBox que tu nomme "CmbLecteurs", une ListeBox
que

tu nomme "LstDossiers" ensuite mets tout le code dans le module de la
feuille. Pour le test j'ai mis le remplissage du Combo pour les lecteurs
sur

Activate de la feuille donc change de feuille et revient ton Combo sera
plein. Un clic sur un dossier dans la liste t'inscris à partir de A5 les
fichiers Excel du dossier. Un double clic ouvre le dossier et affiche les
sous-dossiers avec un décalage un double-clic sur le dossier parent
remonte

dans arborescence. Je n'ai plus le temps de chercher pour le moment
comment

renommer tous les classeurs sans les ouvrir. Je verrai demain. Pour le
moment, teste et dis moi si cela te convient. Attention, j'utilise la
cellule [A1] pour afficher le chemin complet du dossier ouvert Adapte si
cela te dérange. Fait le test sur un classeur vierge.

Private Declare Function LesLecteurs Lib _
"kernel32" Alias "GetLogicalDriveStringsA" _
(ByVal nBufferLength As Long, _
ByVal lpBuffer As String) As Long

'à mettre dans ThisWorkbook.Open
'pour avoir tous les lecteurs
'à l'ouverture du classeur
'l'appel :
'>Private Sub Workbook_Open()
'>Feuil1.Lecteurs
'>End Sub
'Je l'ai mis ici pour les tests
Private Sub Worksheet_Activate()
Lecteurs
End Sub

Private Sub CmbLecteurs_Click()

With Me
.LstDossiers.Clear
CheminComplet .CmbLecteurs.Value, False
Dossiers [A1]
ChargerFichiers .CmbLecteurs.Value
End With

End Sub

Private Sub LstDossiers_Click()

Dim I As Integer
Dim Chemin As String
Dim NomDossier As String

Range("A5:A" & Range("A5").End(xlDown).Row).Clear

With Me
Chemin = [A1]
With .LstDossiers
'si le dossier est un sous dossier (5 espaces à gauche)
'rajoute au chemin le nom du dossier sélectionné
If Left(.Value, 5) = Space(5) Then
Chemin = Chemin & Trim(.Value) & ""
Else
'si le chemin indique seulement le lecteur, rajoute
'le dossier sélectionné
If Len(Chemin) = 3 Then
Chemin = Chemin & .Value & ""
End If
End If
End With
End With

ChargerFichiers Chemin

End Sub

Private Sub LstDossiers_DblClick(ByVal Cancel As MSForms.ReturnBoolean)

Dim DosParent As String

On Error Resume Next
With Me.LstDossiers
If .ListIndex = 0 Then
If Err = 0 Then
DossierParent
Exit Sub
End If
End If
End With
On Error GoTo 0
'récupère le dossier parent, le recharge après avoir
'vidé la ListBox. Défini le chemin et appelle la
'proc SousDossiers pour charger les sousdossiers
'et les mettre en décalés

With Me.LstDossiers
DosParent = Trim(.Value)
.Clear
.AddItem DosParent
CheminComplet DosParent, True
SousDossiers [A1], DosParent
End With

Range("A5:A" & Range("A5").End(xlDown).Row).Clear
'charge les fichiers du dossier parent

ChargerFichiers [A1]

End Sub

Public Sub Lecteurs()
Dim LstLecteur As String
Dim Retour As Long
Dim I As Integer
Const LecteurDef As String = "C:" 'lecteur par défaut

'récup de la liste des lecteurs
LstLecteur = String(50, Chr$(0))
Retour = LesLecteurs(50, LstLecteur)
CmbLecteurs.Clear
For I = 1 To Len(LstLecteur)
If Mid(LstLecteur, I, 1) = "" Then
CmbLecteurs.AddItem UCase(Mid(LstLecteur, I - 2, 3))
End If
Next I

[A1] = LecteurDef
CmbLecteurs.Value = LecteurDef

End Sub

Private Sub Dossiers(Chemin As String)
Dim Dossier As String
Dim Tbl()
Dim I As Integer

'évite l'erreur du lecteur CD vide
'et plus bas, le tableau non initialisé
'dû à une disquette ou CD vierge
On Error Resume Next
Dossier = Dir(Chemin, 16)
If Err.Number <> 0 Then Exit Sub

Do While Dossier <> ""
If Dossier <> "." And Dossier <> ".." Then
If (GetAttr(Chemin & Dossier) _
And 16) = 16 Then
I = I + 1
ReDim Preserve Tbl(1 To I)
Tbl(I) = Dossier
End If
End If
Dossier = Dir
Loop

TriTableau Tbl()

'charge la listbox
Me.LstDossiers.List = Tbl()

Erase Tbl

End Sub

Sub TriTableau(Tbl())
Dim Tempo
Dim I As Integer
Dim J As Integer

'éffectue un tri
'croissant du tableau
For I = 1 To UBound(Tbl) - 1
For J = I + 1 To UBound(Tbl)
If Trim(Tbl(I)) > Trim(Tbl(J)) Then
Tempo = Tbl(J)
Tbl(J) = Tbl(I)
Tbl(I) = Tempo
End If
Next J
Next I

End Sub

Private Sub SousDossiers(Chemin As String, _
Optional DosParent As String)
Dim Tbl()
Dim Dossier As String
Dim I As Integer

'récupère les dossiers pour le chemin spécifié
'insére pour chaque sous-dossier 5 espaces avant
'afin de les démarquer du dossier parent en les
'décalant vers la droite
Dossier = Dir(Chemin, 16)
Do While Dossier <> ""
If Dossier <> "." And Dossier <> ".." Then
If (GetAttr(Chemin & Dossier) _
And 16) = 16 Then
I = I + 1
ReDim Preserve Tbl(1 To I)
Tbl(I) = Space(5) & Dossier
'Me.LstDossiers.AddItem Space(5) & Dossier
End If
End If
Dossier = Dir
Loop

On Error Resume Next
TriTableau Tbl()

'charge la listbox
For I = 1 To UBound(Tbl)
Me.LstDossiers.AddItem Tbl(I)
Next

Erase Tbl

End Sub

Sub ChargerFichiers(Chemin As String)

Dim Fichier As String
Dim FS As FileSearch
Dim I As Integer
Dim J As Integer
'vide les cellules
Range("A5:A" & Range("A5").End(xlDown).Row).Clear
'effectue la recherche
With Me
Set FS = Application.FileSearch
With FS
.LookIn = Chemin
.Filename = "*.xls" 'seulement Excel
If .Execute > 0 Then
J = 5
For I = 1 To .FoundFiles.Count
Range("A" & J) = Dir(.FoundFiles(I))
J = J + 1
Next I
End If
End With
End With

Set FS = Nothing

End Sub

Private Sub CheminComplet(Dossier As String, SousDossier As Boolean)
Dim I As Integer
Dim Chemin As String
Dim DosCourrant As String
Dim Lecteur As Boolean

'cherche si le dossier est le lecteur
'si il l'est, attribut la valeur de la variable
'Dossier à la variable Chemin, sinon, défini
'le chemin
Lecteur = Dossier Like "?:"

If Lecteur = False Then
Chemin = [A1]
'recherche le nom du dossier ouvert
For I = Len(Chemin) - 1 To 3 Step -1
If Mid(Chemin, I, 1) = "" Then
DosCourrant = Mid(Chemin, I + 1, Len(Chemin) - (I + 1))
Exit For
End If
Next I

If I < 3 Then I = 3
'si le dossier est différent, éffectue le changement
'ou le rajoute en fonction de la valeur de la variable
'SousDossier
If Dossier <> DosCourrant Then
If SousDossier = False Then
Chemin = Left(Chemin, I) & Dossier & ""
Else
Chemin = Chemin & Dossier & ""
End If
Else
Chemin = Chemin
End If
Else
Chemin = Dossier
End If
'défini la cellule qui sert pour la recherche
'et l'information sur le dossier ouvert
[A1] = Chemin

End Sub

Private Sub DossierParent()
Dim I As Integer
Dim J As Integer
Dim Chemin As String
Dim DosParent As String

Chemin = [A1]

'si le chemin ne contient pas que le lecteur
'recherche la barre de séparation
If Len(Chemin) > 3 Then
For I = Len(Chemin) - 1 To 3 Step -1
If Mid(Chemin, I, 1) = "" Then
Exit For
End If
Next I
'recherche le dossier parent
For J = I - 1 To 3 Step -1
If Mid(Chemin, J, 1) = "" Then
DosParent = Mid(Chemin, J + 1, (I - 1) - J)
Exit For
End If
Next J
Else
'défini I à 3 pour le lecteur
I = 3
End If

With Me
.LstDossiers.Clear
[A1] = Left(Chemin, I)
If DosParent <> "" Then
.LstDossiers.AddItem DosParent
SousDossiers [A1]
Else
Dossiers [A1]
End If
ChargerFichiers [A1]
If Len([A1]) <> 3 Then
.LstDossiers.ListIndex = 0
End If
End With

End Sub

Hervé.

"Yves-Marie BIERSOHN" a écrit
dans le message news:
Bonjour,

Je souhaiterais obtenir dans une feuille excel, un menu déroulant avec
la


liste des disque dur, dans une autre liste, l'arborescence des fichiers
dépendant du premier menu déroulant, et un bouton validation pour
obtenir


a
partir de la ligne "5" et en colonne "A" la liste de tous les fichiers
du


dossier préselectionner.
Ensuite, je souhaite en colonne B, mettre une formule que je maitrise :)
et

ensuite, une autre macro, pour renommer tous les fichier avec la valeur
de


la colonne B.
Voila,
Merci beaucoup.