Combobox avec choix dépendant d'un dossier

  • Initiateur de la discussion Initiateur de la discussion Carnage029
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Carnage029

XLDnaute Occasionnel
Bonjour à tous,

J'essaye d'apprendre à utiliser excel au fur et à mesure, et je me posais une question, donc je vous la pose

Je cherche à créer une combobox, avec des choix "dynamiques" c'est à dire que j'ai un dossier qui par exemple est dans C:\mondossier\sigle

qui contient lui même par exemple 3 dossier
Sigle1, Sigle2, Sigle3

J'aimerai que ma combobox mette la liste déroulante à jour si jamais j'ajoute ou je supprime un dossier...
Par exemple, si je crée un dossier sigle 4 à ce chemin : C:\mondossier\sigle\Sigle4 ma combobox me propose 4 choix, mais si je supprime Sigle1, il n'y en ai plus que 3...

Je ne sais pas du tout comment faire 🙁

Merci beaucoup à vous de votre précieuse aide
 
Re : Combobox avec choix dépendant d'un dossier

Bonjour Carnage, bonjour le forum,

Si ta ComboBox se trouve dans une UserForm, le code ci-dessous d'initialisation de l'UserForm devrait convenir :
Code:
Private Sub UserForm_Initialize() 'à l'initialisation de l'Userform
Dim fs, f, f1, sf 'décalre les variables fs, f, f1 et sf
Dim chem As String 'déclare la variable chem (CHEMin)


chem = "C:\mondossier\sigle" 'définit la variable chem
Set fs = CreateObject("Scripting.FileSystemObject") 'définit la variable fs (accès aux fichiers)
Set f = fs.GetFolder(chem) 'définit la variable f (accès aux fichiers du dossier chem)
Set sf = f.SubFolders 'définit la variable sf (accès aux sous-dossiers du dossier chem)
For Each f1 In sf 'boucle sur tous les sous-dossiers
    Me.ComboBox1.AddItem f1.Name 'ajoute le sous-dossier à la ComboBox1
Next 'prochain sous-dossier de la boucle
End Sub
 
Re : Combobox avec choix dépendant d'un dossier

Bon j'ai réussi à faire marche ton code Robert, il faut juste pas mettre le code dans le initialize, c'est trop tard, par contre il reste un problème de taille, les dossiers apparaissent plusieurs fois, j'ai

Sigle1
Sigle2
Sigle3
Silge4
Sigle1
Sigle2
...
etc
à mon avis la boucle se fait trop de fois 🙁

Merci pour tout Robert 😀


EDIT : je comprend pas sur une deuxième éxecution ça remarche parfaitement 🙂 problème résolu, je sais pas comment

Merci encore Robert 😀
 
Re : Combobox avec choix dépendant d'un dossier

Bon je me permet une autre question dans le même fil car elle est très proche et peut être que Robert (surement même 🙂 ) aura une solution à me proposer :

Une fois que j'ai choisi dans mon userform SigleN, il y'a des fichiers dans ce dossier qui sont toujours construit de la même manière à savoir,

SigleN DEVISE - jjmmaa.xls

Je souhaiterai créer une deuxième combobox qui me demande la devise (3 caractères à chaque fois) et une troisième qui me demande la date voulue (toujours jjmmaa)

Bien sur le but est que les combobox de la devise et de la date me propose que les informations possibles d'après le sigle, puis d'après la devise 🙂

Surtout n'hésitez pas à me poser des questions 🙂

voilà, j'espère que c'est possible, et surtout encore merci Robert 🙂
 
Dernière édition:
Re : Combobox avec choix dépendant d'un dossier

Bonsoir Carnage, bonsoir le forum,

À ces mots le corbeau ne se sent pas de joie...
Il ouvre un large bec, laisse tomber sa proie...

Pas besoin de tant de flatteries, tu l'aurais eu quand même ton fichier. Tu remarqueras que ça marche très bien à l'Initialisation de l'UserForm...
 

Pièces jointes

Dernière édition:
Re : Combobox avec choix dépendant d'un dossier

Désolé Robert si tu le prend mal, mais je suis comme ça, je suis très (trop ?) chaleureux et aime bien remercier, il ne s'agit en aucun cas de flatterie ou autre pour arriver à mes fins,

Si mon enthousiasme sur ce forum ou e suis "nouveau" est trop prononcé je ferai attention par la suite, quoi qu'il en soit, je regarde ta proposition dès que j'arrive au boulot 🙂 Merci
 
Re : Combobox avec choix dépendant d'un dossier

Bonjour Carnage, bonjour le forum,

Hé je te rassure ! Ce n'était rien que de l'humour et un peu de foutage de gueule mais gentillet et sans intention de t'offenser. Ça m'a fait sourire tes remerciements appuyés mais ils font bien plus plaisir que les innombrables
tdc que l'on rencontre à longueur de journées.
 
Re : Combobox avec choix dépendant d'un dossier

Ouf alors on est sauvé, je viens de regarder le fichier Carnage01, mais il y'a pas grand chose, un bouton sans code VBA derrière 🙁

Bon, je sais que c'est pas correct de ma part, mais j'ai réussi (je sais pas trop comment) a régler le problème, Merci encore (et encore ou ça fait trop 😛 ? )

Bonne journée
 
Re : Combobox avec choix dépendant d'un dossier

Bonjour Carnage, bonjour le forum,

Le bouton lance une UserForm avec le code commenté ci-dessous. Mais comme tu le dis, pas grand chose... Il suffisait d'ouvrir l'éditeur VBE avec le raccourci [Alt]+[F11] :
Code:
Private chem As String 'déclare la variable chem (CHEMin)
Private chem1 As String 'déclare la variable chem (CHEMin)

Private Sub UserForm_Initialize() 'à l'initialisation de l'Userform
Dim fs, f, f1, sf 'décalre les variables fs, f, f1 et sf
Dim td() As String 'décalre le tableau de variables td (Tableau des Dossiers)
Dim i As Integer 'déclare la variable i (Incrément)
chem = "C:\mondossier\sigle" 'définit la variable chem
Set fs = CreateObject("Scripting.FileSystemObject") 'définit la variable fs (accès aux fichiers)
Set f = fs.GetFolder(chem) 'définit la variable f (accès aux fichiers du dossier chem)
Set sf = f.SubFolders 'définit la variable sf (accès aux sous-dossiers du dossier chem)
For Each f1 In sf 'boucle sur tous les sous-dossiers
    ReDim Preserve td(i) 'redimentionne le tableau td
    td(i) = f1.Name 'attribue à la variable indexée td(i) la valeur du nom du dossier
    i = i + 1 'incrémente i
Next 'prochain sous-dossier de la boucle
Call tri(td, LBound(td), UBound(td)) 'lance la macro de tri (merci Jacques BOISGONTIER)
Me.ComboBox1.List = td 'alimente la ComboBox1 d'une liste de dossiers triés et sans doublons
'****************************************************************************************************
'j'ai mis ce code car il me semblait que tu le demandais sur un autre fil mais il ne peut pas y avoir
'de doublons dans les dossiers et, en pricipe, ils sont automatiquement triés par ordre alphabétique.
'****************************************************************************************************
End Sub


Private Sub ComboBox1_Change() 'au changement dans la ComboBox1
Dim dico As Object 'déclare la variable dico (DICtiOnanaire)
Dim temp As Variant 'déclare la variable temp (tableau TEMPoraire)
Dim fs, f, fc, f1 'déclare les variables fs, f, fc et f1
Me.ComboBox2.Clear 'vide la ComboBox2
Me.ComboBox3.Clear 'vide la ComboBox2
Me.ListBox1.Clear 'vide la ListBox1
chem1 = chem & "\" & Me.ComboBox1.Value 'définit la variable chem1
Set dico = CreateObject("Scripting.Dictionary") 'définit le dioctionnaire dico
Set fs = CreateObject("Scripting.FileSystemObject") 'définit la variable fs (accès aux fichiers)
Set f = fs.GetFolder(chem1) 'définit la variable f (accès au dossier chem1)
Set fc = f.Files 'définit la variable fc (accès aux fichiers de chem1)
For Each f1 In fc 'boucle sur tous les fichiers
    dico(Left(Split(f1.Name, " ")(1), 3)) = "" 'alimente le dico avec les 3 caractères des devises
    Me.ListBox1.AddItem f1.Name 'alimente la ListBox1
Next f1 'prochain fichier de la boucle
temp = dico.keys 'récupère le dictionnaire sans doublons
Call tri(temp, LBound(temp), UBound(temp)) 'lance la macro macro de tri des devises
Me.ComboBox2.List = temp 'alimente la ComboBox2 d'une liste triée sans doublons
End Sub


Private Sub ComboBox2_Change() 'au changement dans la ComboBox2
Dim dico As Object 'déclare la variable dico (DICtiOnanaire)
Dim temp As Variant 'déclare la variable temp (tableau TEMPoraire)
Dim fs, f, fc, f1 'déclare les variables fs, f, fc, et f1
Me.ComboBox3.Clear 'vide la ComboBox3
Me.ListBox1.Clear 'vide la ListBox1
Set dico = CreateObject("Scripting.Dictionary") 'définit le dioctionnaire dico
Set fs = CreateObject("Scripting.FileSystemObject") 'définit la variable fs (accès aux fichiers)
Set f = fs.GetFolder(chem1) 'définit la variable f (accès au dossier chem)
Set fc = f.Files 'définit la variable fc (accès aux fichiers de chem1)
For Each f1 In fc 'boucle sur tous les fichiers
    dico(Left(Right(f1.Name, 10), 6)) = "" 'alimente le dictionnaire dico avec les 6 derniers caractères (avant l'extension)
    'si la devise correspond, ajoute le fichier à la ListBox1
    If Left(Split(f1.Name, " ")(1), 3) = Me.ComboBox2.Value Then Me.ListBox1.AddItem f1.Name
Next f1 'prochain fichier de la boucle
temp = dico.keys 'récupère le dictionnaire sans doublons
Call tri(temp, LBound(temp), UBound(temp)) 'lance la macro macro de tri des devises
Me.ComboBox3.List = temp 'alimente la ComboBox3 d'une liste triée sans doublons
End Sub


Private Sub ComboBox3_Change() 'au changement dans la ComboBox2
Dim fs, f, fc, f1 'déclare les variables fs, f, et f1
Me.ListBox1.Clear 'vide la ListBox1
Set fs = CreateObject("Scripting.FileSystemObject") 'définit la variable fs (accès aux fichiers)
Set f = fs.GetFolder(chem1) 'définit la variable f (accès au dossier chem)
Set fc = f.Files 'définit la variable fc (accès aux fichiers de chem1)
For Each f1 In fc 'boucle sur tous les fichiers
    'si la devise et la date correspondent, ajoute le fichier à la LisBox1
    If Left(Right(f1.Name, 10), 6) = Me.ComboBox3.Value _
        And Left(Split(f1.Name, " ")(1), 3) = Me.ComboBox2 Then Me.ListBox1.AddItem f1.Name
Next f1 'prochain fichier de la boucle
End Sub


Sub tri(a As Variant, gauc As Integer, droi As Integer) 'code tiré du site de Jacques BOISGONTIER
Dim g As Integer, d As Integer
Dim ref As String
Dim tmp As String
ref = a((gauc + droi) \ 2)
g = gauc: d = droi
Do
    Do While a(g) < ref: g = g + 1: Loop
    Do While ref < a(d): d = d - 1: Loop
    If g <= d Then
        tmp = a(g): a(g) = a(d): a(d) = tmp
        g = g + 1: d = d - 1
    End If
Loop While g <= d
If g < droi Then Call tri(a, g, droi)
If gauc < d Then Call tri(a, gauc, d)
End Sub

Mais c'est pas grave ça m'a permis à moi de découvrir un peu ce domaine des fichiers du système en VBA que je connaissais très mal...
 
Dernière édition:
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
28
Affichages
2 K
Retour