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
Etc jusqu'au choix du paramètre 5.

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?

8choix.xlsm (19.31 Ko)

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 Sub

Ps : 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 Sub

Ce 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

13choix.xlsm (24.88 Ko)

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 Sub

C'est parfait, j'ai testé avec toutes mes autres valeurs.

Merci Franck, cette fois je laisse le sujet en résolu

De rien.

A++

Rechercher des sujets similaires à "combobox dependantes"