ComboBox en cascade "spéciale" [Répondu]

Bonjour,

Je fais appel à vous malgré les nombreux messages à ce sujet car je n'ai pas trouvé la réponse à mon problème...

J'ai créé un formulaire afin de remplir un tableau excel, je souhaite maintenant que ces données soient modifiables. Etant donné que le tableau devrait contenir environ 1000 lignes, je souhaite facilité la recherche des données avec des ComboBox en cascade. Mais les colonnes contenant les données des ComboBox ne se succèdent pas et je n'arrive pas à adapter un code à ma situation...

Il faudrait que:

    - La ComboBox1 reprenne les données de la colonne "F"
    - La ComboBox2 reprenne les données de la colonne "D"
    - La ComboBox3 reprenne les données de la colonne "B"
    - Lorsque les données de la ComboBox3 sont sélectionnées, le formulaire devrait se pré-remplir avec les données de la ligne correspond.

Certaines données sont confidentiels, j'ai donc modifié un peu le tableau et le formulaire, mais cela n'affectera pas les formules (il y a simplement plus de TextBox et de colonnes remplies dans le formulaire)

Je suis débutant en VBA il y a peut être des erreurs dans mon code ou des incohérences, mais tant que ça fonctionne je suis content

Merci d'avance pour votre aide

PS: si en plus vous pouvez mettre la TextBox "Date" en format date (jj/mm/aaaa) cela m'aiderais

Bonjour K-Zimodo, bonjour le forum,

Le début du code, tu complèteras...

Option Compare Text
Private D As Worksheet
Private TV As Variant
Private DL As Long

Private Sub UserForm_Initialize()
Dim D1 As Object
Dim D2 As Object
Dim D3 As Object

Set D = Worksheets("données")
DL = D.Cells(Application.Rows.Count, "A").End(xlUp).Row
TV = D.Range("A1:G" & DL)
Set D1 = CreateObject("Scripting.Dictionary")
Set D2 = CreateObject("Scripting.Dictionary")
Set D3 = CreateObject("Scripting.Dictionary")
For I = 4 To DL
    D1(TV(I, 6)) = ""
    D2(TV(I, 4)) = ""
    D3(TV(I, 2)) = ""
Next I
Me.ComboBox1.List = D1.keys
Me.ComboBox2.List = D2.keys
Me.ComboBox3.List = D3.keys
End Sub

Private Sub ComboBox3_Change()
If Me.ComboBox1.Value = "" Or Me.ComboBox2.Value = "" Then Exit Sub
For I = 4 To DL
    If CStr(TV(I, 6)) = Me.ComboBox1.Value And CStr(TV(I, 4)) = Me.ComboBox2.Value And CStr(TV(I, 2)) = Me.ComboBox3.Value Then
        Me.TextBox2.Value = Me.ComboBox3.Value

        'ici tu complèteras les autres textboxes...

        Exit For
    End If
Next I
End Sub

Bonjour,

Tout d'abord merci pour votre réponse, qui m'aide à avancer dans mon projet.

Il me reste 2 petits problèmes....

Le premier est que, le formulaire ne se rempli pas avec les données de la ligne correspondant à la ComboBox3 (je vous joint le code plus bas je n'ai peut être pas mit la bonne formule des TextBox). Mais lorsque j'ai choisi chaque ComboBox le formulaire ne se rempli pas...

Le second problème est que, lorsque j'ai choisi une valeur dans la ComboBox1 (correspondant au département) la liste de la ComboBox 2 (correspondant à l'atelier) reprend toutes les données de la colonne atelier et pas seulement les données de la colonne Atelier avec le département choisi... (je ne sais pas si je m'explique vraiment bien) ^^ Mais il n'y a pas de "filtre" progressif des données et c'est pareil entre la comboBox2 et 3.

Merci d'avance

Private Sub UserForm_Initialize()

Dim D1 As Object

Dim D2 As Object

Dim D3 As Object

Set D = Worksheets("données")

DL = D.Cells(Application.Rows.Count, "A").End(xlUp).Row

TV = D.Range("A1:G" & DL)

Set D1 = CreateObject("Scripting.Dictionary")

Set D2 = CreateObject("Scripting.Dictionary")

Set D3 = CreateObject("Scripting.Dictionary")

For I = 4 To DL

D1(TV(I, 6)) = ""

D2(TV(I, 4)) = ""

D3(TV(I, 2)) = ""

Next I

Me.ComboBox1.List = D1.keys

Me.ComboBox2.List = D2.keys

Me.ComboBox3.List = D3.keys

End Sub

Private Sub ComboBox3_Change()

If Me.ComboBox1.Value = "" Or Me.ComboBox2.Value = "" Then Exit Sub

For I = 4 To DL

If CStr(TV(I, 6)) = Me.ComboBox1.Value And CStr(TV(I, 4)) = Me.ComboBox2.Value And CStr(TV(I, 2)) = Me.ComboBox3.Value Then

Me.TextBox2.Value = Me.ComboBox3.Value

Me.TextBox3.Value = Cells(no_ligne, 3)

Me.TextBox4.Value = Cells(no_ligne, 4)

Me.TextBox5.Value = Cells(no_ligne, 5)

Me.TextBox6.Value = Cells(no_ligne, 6)

Me.TextBox7.Value = Cells(no_ligne, 7)

Me.TextBox8.Value = Cells(no_ligne, 8 )

Me.TextBox9.Value = Cells(no_ligne, 9)

Me.TextBox10.Value = Cells(no_ligne, 10)

Me.TextBox11.Value = Cells(no_ligne, 11)

Me.TextBox12.Value = Cells(no_ligne, 12)

Me.TextBox13.Value = Cells(no_ligne, 13)

Me.TextBox14.Value = Cells(no_ligne, 14)

Me.TextBox15.Value = Cells(no_ligne, 15)

Me.TextBox16.Value = Cells(no_ligne, 16)

Me.TextBox17.Value = Cells(no_ligne, 17)

Me.TextBox18.Value = Cells(no_ligne, 18)

Me.TextBox19.Value = Cells(no_ligne, 19)

Me.TextBox20.Value = Cells(no_ligne, 20)

Me.TextBox21.Value = Cells(no_ligne, 21)

Me.TextBox22.Value = Cells(no_ligne, 22)

Me.TextBox23.Value = Cells(no_ligne, 23)

Me.TextBox24.Value = Cells(no_ligne, 24)

Me.TextBox25.Value = Cells(no_ligne, 25)

Me.TextBox26.Value = Cells(no_ligne, 26)

Exit For

End If

Next I

End Sub

Re,

J'avsis oublié de définir le numéro de ligne no_ligne. Mais toi, de ton coté, tu as rajouté des textboxes en pagaille qui n'existent même pas dans ta UserForm. Je n'y comprend rien !...

Le code complet avec les filtres et le numéro de ligne :

Private O As Worksheet
Private DL As Long
Private TV As Variant
Private no_ligne As Long

Private Sub UserForm_Initialize()
Dim D As Object
Dim I As Long

Set O = Worksheets("données")
DL = O.Cells(Application.Rows.Count, "A").End(xlUp).Row
TV = O.Range("A1:G" & DL)
Set D = CreateObject("Scripting.Dictionary")
For I = 4 To DL
    D(TV(I, 6)) = ""
Next I
Me.ComboBox1.List = D.keys
End Sub

Private Sub ComboBox1_Change()
Dim D As Object
Dim I As Long

Set D = CreateObject("Scripting.Dictionary")
For I = 4 To DL
    If CStr(TV(I, 6)) = Me.ComboBox1.Value Then D(TV(I, 4)) = ""
Next I
Me.ComboBox2.List = D.keys
End Sub

Private Sub ComboBox2_Change()
Dim D As Object
Dim I As Long

Set D = CreateObject("Scripting.Dictionary")
For I = 4 To DL
    If CStr(TV(I, 6)) = Me.ComboBox1.Value And CStr(TV(I, 4)) = Me.ComboBox2.Value Then D(TV(I, 2)) = ""
Next I
Me.ComboBox3.List = D.keys
End Sub

Private Sub ComboBox3_Change()
If Me.ComboBox1.Value = "" Or Me.ComboBox2.Value = "" Then Exit Sub
For I = 4 To DL
If CStr(TV(I, 6)) = Me.ComboBox1.Value And CStr(TV(I, 4)) = Me.ComboBox2.Value And CStr(TV(I, 2)) = Me.ComboBox3.Value Then
    no_ligne = I
    Me.TextBox2.Value = Me.ComboBox3.Value
    Me.TextBox3.Value = Cells(no_ligne, 3)
    Me.TextBox4.Value = Cells(no_ligne, 4)
    Me.TextBox5.Value = Cells(no_ligne, 5)
    Me.TextBox6.Value = Cells(no_ligne, 6)
    Me.TextBox7.Value = Cells(no_ligne, 7)
    Exit For
End If
Next I
End Sub

bonsoir Thauthème, K-simodo et le forum

Thauthème j'ai fait un essai de ton dernier code sur fichier fourni dans le 1er post et j'ai un biug a combobox1 au 1er TV

comme tu peux le voir sur l’aperçu joint

bug cbx1 modifie 1

Si si, ça marche parfaitement je te met le document en pièce jointe

Merci beaucoup @ThauThème pour ton aide le fichier fonctionne parfaitement avec 2/3 bidouillages

Je change mon titre pour mettre "répondu"

Rechercher des sujets similaires à "combobox cascade speciale repondu"