ComboBox dépendantes
Bonjour,
Je travaille sur un projet VBA qui me permet de connaître un résultat suivant le choix de différent paramètres. J'ai réalisé une première application et je souhaite à présent l'optimiser. Pour cela j'ai remplacé les textbox permettant la saisie des paramètres par des combobox proposant les choix.
Voilà ce que je chercher à avoir :
- Choix d'une valeur dans la combobox1
- >Proposition de valeurs dans la combobox2 en fonction de la combobox1 et choix de la valeur
- >Proposition de valeurs dans la combobox3 en fonction de la combobox1 ET de la combobox2
Or c'est ici que je bloque, je n'arrive pas à avoir ces dépendances, comment les créer, ou est-ce qu'il existe une fonction qui permettrait de choisir et d'afficher les paramètres présents sur la même ligne (disposition des paramètres sur le fichier excel)?
Merci beaucoup pour votre aide.
Damien
Ps : est-ce qu'il est possible d'enlever les espaces blancs entre les valeurs des combobox?
Bonjour Damien,
Une première solution :
Je ne t'ai fait que les combo 2 et 3, le principe est le même pour les autres.
Private Sub ComboBox1_Change()
Dim j As Integer
If ComboBox1 = "" Then Exit Sub
ComboBox2.Clear
For j = 2 To Range("A65536").End(xlUp).Row
If ComboBox1 = Range("A" & j) Then ComboBox2.AddItem Range("B" & j)
Next j
End Sub
Private Sub ComboBox2_Change()
Dim j As Integer
If ComboBox1 = "" Or ComboBox2 = "" Then Exit Sub
ComboBox3.Clear
For j = 2 To Range("A65536").End(xlUp).Row
If ComboBox1 = Range("A" & j) And ComboBox2 = Range("B" & j) Then ComboBox3.AddItem Range("C" & j)
Next j
End SubPs : est-ce qu'il est possible d'enlever les espaces blancs entre les valeurs des combobox?
Oui, il suffit de les supprimer de la base de données. Ne jamais mettre de lignes vides dans une bdd...
Merci Franck de ta réponse rapide.
J'ai testé ta solution mais ma combobox2 reste vide...
Est-ce qu'il y a une manipulation particulière à faire pour intégrer le code dans ce que j'ai déjà ? (je suis encore débutant en vba)
Encore merci.
Ma faute, je n'ai pas regardé le format dee tes données.
Tu as des nombres en colonne A. Or une ComboBox renvoie toujours des String (chaine de caractères).
Donc, il te faut utiliser une conversion.
Voici le nouveau code (ou j'ai tenu compte également des éventuels doublons) :
Private Sub ComboBox1_Change()
Dim j As Integer
If ComboBox1 = "" Then Exit Sub
ComboBox2.Clear
For j = 2 To Range("A65536").End(xlUp).Row
If ComboBox1 = CStr(Range("A" & j)) Then
ComboBox2 = Range("B" & j)
If ComboBox2.ListIndex = -1 Then ComboBox2.AddItem Range("B" & j)
End If
Next j
End Sub
Private Sub ComboBox2_Change()
Dim j As Integer
If ComboBox1 = "" Or ComboBox2 = "" Then Exit Sub
ComboBox3.Clear
For j = 2 To Range("A65536").End(xlUp).Row
If ComboBox1 = CStr(Range("A" & j)) And ComboBox2 = CStr(Range("B" & j)) Then
ComboBox3 = Range("C" & j)
If ComboBox3.ListIndex = -1 Then ComboBox3.AddItem Range("C" & j)
End If
Next j
End SubCe sont donc ça ces fameuses chaines de caractères, ça marche super bien j'ai plus qu'à compléter pour mes autres paramètres.
Encore merci de ton aide Franck, c'est exactement ce que je recherchais.
N'oublie pas de mettre ton sujet comme étant "résolu"
A++
Il faudrait un bouton presque résolu
Je viens de m'apercevoir qu'il restait un petit problème, pour les lignes 4 et 5 de mon fichier, les paramètres 1 à 4 sont identiques, seul le 5è change mais les 2 choix n'apparaissent pas dans la combobox...
Est-ce que tu crois que le problème peut venir du fait que les 4 premiers paramètres soient identiques ? (ou alors il y a une erreur dans mon programme)
Damien
Il faut :
- ne pas "présélectionner" de valeur dans les combo. Pour cela : combo.ListIndex = -1
- utiliser une booléenne "Change" pour désactiver/activer les événements des autres combos.
Voici ton code modifié :
Option Explicit
Public Change As Boolean
Private Sub UserForm_Initialize()
Dim j As Integer
Change = False
For j = 2 To Range("A65536").End(xlUp).Row
ComboBox1 = Range("A" & j)
If ComboBox1.ListIndex = -1 Then ComboBox1.AddItem Range("A" & j)
Next j
ComboBox1.ListIndex = -1
Change = True
End Sub
Private Sub ComboBox1_Change()
Dim j As Integer
If ComboBox1 = "" Or Change = False Then Exit Sub
Change = False
ComboBox2.Clear
For j = 2 To Range("A65536").End(xlUp).Row
If ComboBox1 = CStr(Range("A" & j)) Then
ComboBox2 = Range("B" & j)
If ComboBox2.ListIndex = -1 Then ComboBox2.AddItem Range("B" & j)
End If
Next j
ComboBox2.ListIndex = -1
Change = True
End Sub
Private Sub ComboBox2_Change()
Dim j As Integer
If ComboBox1 = "" Or ComboBox2 = "" Or Change = False Then Exit Sub
Change = False
ComboBox3.Clear
For j = 2 To Range("A65536").End(xlUp).Row
If ComboBox1 = CStr(Range("A" & j)) And ComboBox2 = CStr(Range("B" & j)) Then
ComboBox3 = Range("C" & j)
If ComboBox3.ListIndex = -1 Then ComboBox3.AddItem Range("C" & j)
End If
Next j
ComboBox3.ListIndex = -1
Change = True
End Sub
Private Sub ComboBox3_Change()
Dim j As Integer
If ComboBox1 = "" Or ComboBox2 = "" Or ComboBox3 = "" Or Change = False Then Exit Sub
Change = False
ComboBox4.Clear
For j = 2 To Range("A65536").End(xlUp).Row
If ComboBox1 = CStr(Range("A" & j)) And ComboBox2 = CStr(Range("B" & j)) And ComboBox3 = CStr(Range("C" & j)) Then
ComboBox4 = Range("D" & j)
If ComboBox4.ListIndex = -1 Then ComboBox4.AddItem Range("D" & j)
End If
Next j
ComboBox4.ListIndex = -1
Change = True
End Sub
Private Sub ComboBox4_Change()
Dim j As Integer
If ComboBox1 = "" Or ComboBox2 = "" Or ComboBox3 = "" Or ComboBox4 = "" Or Change = False Then Exit Sub
ComboBox5.Clear
For j = 2 To Range("A65536").End(xlUp).Row
If ComboBox1 = CStr(Range("A" & j)) And ComboBox2 = CStr(Range("B" & j)) And ComboBox3 = CStr(Range("C" & j)) And ComboBox4 = CStr(Range("D" & j)) Then
ComboBox5 = Range("E" & j)
If ComboBox5.ListIndex = -1 Then ComboBox5.AddItem Range("E" & j)
End If
Next j
ComboBox5.ListIndex = -1
End Sub
Private Sub Recherche_Click()
Dim A As Integer, B As Integer, C As Double, D As Double, E As Double, R As Double, S As Double, T As Double
If ComboBox1 = "" Or ComboBox2 = "" Or ComboBox3 = "" Or ComboBox4 = "" Or ComboBox5 = "" Then
MsgBox "Vous n'avez pas saisie les parametres"
Exit Sub
End If
If Not IsNumeric(ComboBox1) Or Not IsNumeric(ComboBox2) Or Not IsNumeric(ComboBox3) Or Not IsNumeric(ComboBox4) Or Not IsNumeric(ComboBox5) Then
MsgBox "veuillez entrer une valeur numerique"
Exit Sub
End If
End SubC'est parfait, j'ai testé avec toutes mes autres valeurs.
Merci Franck, cette fois je laisse le sujet en résolu