XL 2016 liste déroulante en cascade avec des noms définis

will91

XLDnaute Nouveau
Bonjour,
je suis sur un projet et j'ai besoin de faire une liste déroulante en cascade pour sélectionner l'émetteur d'une requête en fonction de son département.
c'est à dire que la liste des départements est déjà défini et chaque département à son personnel; et toute les listes sont définis et disponible dans le gestionnaire des noms.
Pour sélectionner un émetteur, il faudrait que le département soit préalablement défini.
Je tourne en rond depuis et je souhaiterais avoir un coup de pouce.

Merci.
 

Pièces jointes

  • Suivi des requêtes (1).xlsm
    105.1 KB · Affichages: 20
Solution
Bonjour,

Juste avec

VB:
Private Sub ComboBox3_Change()
    If ComboBox3.ListIndex > -1 Then
        ComboBox2.List = Application.Range(ComboBox3.Value).Value
    End If
End Sub

ça semble fonctionner

Par contre, ne laissez pas de lignes vides dans vos tableaux structurés, cela ne sert à rien puisqu'ils s'autoagrandissent tout seuls comme des grands.

Cordialement

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonjour @will91 :),
Bienvenue sur XLD 😉,

Tout d'abord :
  • Il est bon pour les tableaux structurés de ne pas de laisser de lignes vides en fin de tableau. Le tableau structuré a la faculté d'ajouter automatique d'insérer une ligne quand c'est nécessaire.
  • Le département RH a un intitulé différent entre dans le tableau des départements et comme en-tête du tableau de ses membres => le code proposé ne donne donc aucun résultat pour ce département RH
  • pour le fun, je n'utilise pas les noms définis
  • sans ligne vide dans ComboBox2
J'ai utilisé au maximum le vocabulaire des tableaux structutés pour le fun. Le code proposé est le suivant :
VB:
Private Sub ComboBox3_Change()
Dim DptCol&, t, i&
   ComboBox2.Clear
   With Sheets("listes")
      DptCol = Application.IfError(Application.Match(ComboBox3.Value, .Rows(2), 0), 0)
      If DptCol = 0 Then Exit Sub
      t = .Cells(2, DptCol).ListObject.ListColumns(1).Range.Value
      For i = 2 To UBound(t)
         If Trim(t(i, 1)) <> "" Then ComboBox2.AddItem t(i, 1)
      Next i
   End With
End Sub
 

Pièces jointes

  • will91- Suivi des requêtes- v1.xlsm
    105.4 KB · Affichages: 10
Dernière édition:

Hasco

XLDnaute Barbatruc
Repose en paix
Bonjour,

Juste avec

VB:
Private Sub ComboBox3_Change()
    If ComboBox3.ListIndex > -1 Then
        ComboBox2.List = Application.Range(ComboBox3.Value).Value
    End If
End Sub

ça semble fonctionner

Par contre, ne laissez pas de lignes vides dans vos tableaux structurés, cela ne sert à rien puisqu'ils s'autoagrandissent tout seuls comme des grands.

Cordialement
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Re,

Pour ne pas être tributaire de l’orthographe des départements dans le tableau des départements et dans les en-têtes des tableaux des personnels, on utilise un seul tableau nommé Personnels.
  • ce tableau comporte les noms des départements en en-têtes (qui sont modifiables n'importe quand)
  • ce tableau peut s'agrandir facilement tant en ligne qu'en colonne
  • plus de problème d'orthographe puisque le nom d'un département n'apparait qu'une seule fois
  • plus besoin de définir une flopée de noms
Le code à l'initialisation :
VB:
Private Sub UserForm_Initialize()
Dim x
   Me.Caption = "MyUserform"
   For Each x In Sheets("Listes").ListObjects("Personnels").HeaderRowRange: ComboBox3.AddItem x: Next x
End Sub

Le code au changement de ComboBox3 :
Code:
Private Sub ComboBox3_Change()
Dim x
   ComboBox2.Clear
   If ComboBox3.ListIndex < 0 Then Exit Sub
   For Each x In Sheets("listes").ListObjects("Personnels").ListColumns(1 + ComboBox3.ListIndex).DataBodyRange
      If Trim(x) <> "" Then ComboBox2.AddItem x
   Next x
End Sub

Private Sub ComboBox2_Change() a été supprimé.
 

Pièces jointes

  • will91- Suivi des requêtes- v2.xlsm
    103.7 KB · Affichages: 12
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 085
Messages
2 085 196
Membres
102 814
dernier inscrit
JLGalley