Alimenter une liste ou une combobox

frederic974

XLDnaute Nouveau
Bonjour,
Voici ma problématique que je tente de résoudre...
J'ai un fichier excel (celui qui est joint un démo) dans lequel il y a 2 colonnes A et B
A > Contient des matricules
B > Des prénoms

Mon but c'est d'arriver a faire ceci : dans une cellule j'entre le matricule (exemple 91155) cela m'affiche dans la cellule a coté le prénom correspondant.
Super facile :cool:a faire un simple rechercheV C'est la feuille "TST1" du fichier joint.

Mais la ou cela ce complique c'est que dans les colonnes A et B il peut y avoir plusieurs prénoms qui ont le même matricule (exemple toujours dans le fichier joint le matricule 91155 peut correspondre à PIERRE ou CLAIRE).
Avec mon rechercheV malheureusement une seule valeur est trouvé (PIERRE)

Or ce que je souhaite faire c'est que lorsqu'on met dans la case recherche matricule (E3) un matricule qui corresponds à plusieurs prénoms : Effectivement c'est le 1er qui s'affiche. Mais si on fait un clique droit sur la case résultat (F3) alors on affiche une liste genre un combobox par exemple qui liste d'abord les prénoms qui corresponds aux matricules puis les autres.

Pouvez-vous m'aider ? :rolleyes:
 

Pièces jointes

  • Classer et afficher dans une liste.xlsm
    9.3 KB · Affichages: 74
Dernière édition:

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : Alimenter une liste ou une combobox

Bonjour frederic974,

Un essai de réponse à votre question par du VBA. Je n'ai pas tout à fait respecté votre demande car les listes n'apparaissent pas à un clique droit sur la cellule F3. La gestion des listes se fait directement par le biais de listes de validation.

Le code tente de gérer aussi les modifications au sein de la zone Source (colonnes A et B) telles que les changements de matricules ou noms ainsi que les suppressions, insertions ou ajouts de lignes.

Les noms correspondant au matricule en E3 sont placés en début de liste (cellule F3) et séparés des suivants par un "trait".

L'initialisation des variables publiques est faite le module de code de ThisWorbook à l'ouverture du classeur.

Le fonctionnement nécessite l'activation de la référence à "Microsoft Scripting Runtime". Pour cela:
.
  • Se placer dans l'éditeur VBA (touches Alt+F11)
  • Sélectionner le menu "Outils / Références..."
  • Dans la boîte de dialogue, chercher "Microsoft Scripting RunTime"
  • Cocher la case correspondante (si ce n'est pas déjà le cas) puis cliquer sur "OK"

Le code principal est dans le Module1 (extrait):
VB:
Const sSh = "TST1", sSource = "A:B", sCellMatricule = "E3", sCellNom = "F3"
Dim Matricules As New Scripting.Dictionary, Plage As Range
Dim Sh As Worksheet, CellNom As Range
Public Source As Range, CellMatricule As Range

Sub InitVar()

  Set Sh = ThisWorkbook.Sheets(sSh)
  With Sh
    Set Source = Sh.Range(sSource)
    Set CellMatricule = Sh.Range(sCellMatricule)
    Set CellNom = Sh.Range(sCellNom)
    Set Plage = .Cells(.Rows.Count, Source.Column).End(xlUp)
    Set Plage = .Range(Source(2, 1), Plage.Offset(, 1))
  End With
End Sub

Sub CreerDico()
Dim xcell As Range
  
  If (Source Is Nothing) Or (CellNom Is Nothing) Then InitVar
  Matricules.RemoveAll
  For Each xcell In Plage.Resize(, 1)
    If Matricules.Exists(xcell.Value) Then
      Matricules(xcell.Value) = Matricules(xcell.Value) & "," & xcell.Offset(, 1).Value
    Else
      Matricules(xcell.Value) = xcell.Offset(, 1).Value
    End If
  Next xcell

End Sub

Sub ValidationMatricule()
Dim Aux, i&

  Aux = Matricules.Keys
  Qsort Aux, LBound(Aux), UBound(Aux)
  'Verif si actuel matricule existe
  If Not Matricules.Exists(CellMatricule.Value) Then CellMatricule = ""
  With CellMatricule.Validation
    .Delete
    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
    xlBetween, Formula1:=Join(Aux, ",")
  End With
End Sub

Sub ValidationNom()
Dim auxMatr, auxNoms, i&, S, Z
  
  auxMatr = Plage.Resize(, 1).Value
  auxNoms = Plage.Offset(, 1).Resize(, 1).Value
  For i = 1 To UBound(auxMatr)
    If auxMatr(i, 1) = CellMatricule Then
      S = S & "," & auxNoms(i, 1)
    End If
  Next i
  S = S & "," & "------------"
  For i = 1 To UBound(auxMatr)
    If auxMatr(i, 1) <> CellMatricule Then
      S = S & "," & auxNoms(i, 1)
    End If
  Next i
  If Left(S, 1) = "," Then S = Mid(S, 2)
  With CellNom.Validation
    .Delete
    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
    xlBetween, Formula1:=S
  End With
  'Vérif valeur de Nom par rapport au matricule
  If CellMatricule = "" Or Left(CellMatricule, 2) = "--" Then
    CellNom = ""
    CellMatricule.Activate
  Else
    Z = "," & CellNom & ","
    If InStr("," & Matricules.Item(CellMatricule.Value) & ",", Z) = 0 Then
      CellNom = Split(Matricules.Item(CellMatricule.Value), ",")(0)
      CellNom.Activate
    End If
  End If
End Sub
 

Pièces jointes

  • Classer et afficher dans une liste v3.xlsm
    25.2 KB · Affichages: 53
Dernière édition:

Misange

XLDnaute Barbatruc
Re : Alimenter une liste ou une combobox

Bonjour, coucou Mapomme

Par formule (en ayant mis le tableau sous forme de tableau excel)
=SIERREUR(INDEX(Tblo[Nom];PETITE.VALEUR(SI(Tblo[Matricule]=$E$3;LIGNE(Tblo[Matricule])-LIGNE(Tblo[#En-têtes]));LIGNE(1:1)));"")

à valider par ctrl+maj+entrée puis à tirer vers le bas
 

Pièces jointes

  • Copie de Classer et afficher dans une liste.xlsm
    9.4 KB · Affichages: 57

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : Alimenter une liste ou une combobox

Bonjour, mes hommages Misange :) ,

Effectivement, je me suis bien cassé la nénette (encore une expression de vieux que je suis... "Senior" qu'ils disent - les DRH - dans ma boîte, c'est mignon tout plein...)
Ne serait ce pas plutôt quelque chose du genre (pour ceux qui ne correspondent pas au matricule) ?
 

Pièces jointes

  • Copie de Classer et afficher dans une liste (1).xlsm
    9.8 KB · Affichages: 64
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 623
Messages
2 090 277
Membres
104 479
dernier inscrit
Guengant