2 Listes déroulantes en conflits ?

thespeedy20

XLDnaute Occasionnel
Bonjour,

j'ai deux listes déroulantes distinctes, une pour la plage B18:B63 et une pour la plage P18:63....dans la feuille Rec

Dans la plage B18:B63 j'obtiens la liste de colonne P18:63 !!!!

Les valeurs de la liste de la B18:B63 se trouve dans la feuille Profs et celle P18:63 dans la feuille Evenements.
les deux listes se retrouvent dans la feuille Rec

VB:
Dim Lst As Range
Dim Lst2 As Range
Dim Liste As String

With Worksheets("Profs")
        Set Lst = .Range(.Cells(2, 2), .Cells(.Rows.Count, 2).End(xlUp))
    End With
    ThisWorkbook.Names.Add "Liste", "=Profs!" & Lst.Address
   
With Worksheets("Rec").Range("B18:B63").Validation
        .Delete
        .Add xlValidateList, , , "=Liste"
        .InputTitle = "Sélection"
        .InputMessage = "Recherche rapide"
    End With
   
   
With Worksheets("Evenements")
        Set Lst2 = .Range(.Cells(2, 2), .Cells(.Rows.Count, 2).End(xlUp))
    End With
    ThisWorkbook.Names.Add "Liste", "=Evenements!" & Lst2.Address
   
With Worksheets("Rec").Range("P18:P63").Validation
        .Delete
        .Add xlValidateList, , , "=Liste"
        .InputTitle = "Sélection"
        .InputMessage = "Recherche rapide"
    End With
 

Pièces jointes

  • Annexe 11.xlsm
    63.2 KB · Affichages: 11

thespeedy20

XLDnaute Occasionnel
re,

le but, c'est quand je sélectionne le nom dans la col B, il indique la fonction, le nombre de période, ,le matricule et le statut automatiquement... et re intègre la ligne dans l'ordre alphabétique... si tu introduis des valeurs tu verras que le classement se fait automatiquement et le numéro aussi...il peut y avoir un doublon dans le nom et garde le même numéro...(ça cela fonctionne...)

Oli
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Si on intervertit les deux modules alors on a l'inverse, les prénoms sont partout. D'où la piste :
VB:
Sub essai()
Dim Lst2 As Range
Dim Liste As String
Dim Plg As Range
With Worksheets("Evenements")
    Set Lst2 = .Range(.Cells(2, 2), .Cells(.Rows.Count, 2).End(xlUp))
End With
ThisWorkbook.Names.Add "Liste1", "=Evenements!" & Lst2.Address
    
With Worksheets("Rec").Range("P18:P63").Validation
        .Delete
        .Add xlValidateList, , , "=Liste1"
        .InputTitle = "Sélection"
        .InputMessage = "Recherche rapide"
    End With
With Worksheets("Profs")
    Set Lst3 = .Range(.Cells(2, 2), .Cells(.Rows.Count, 2).End(xlUp))
End With
ThisWorkbook.Names.Add "Liste2", "=Profs!" & Lst3.Address
    
With Worksheets("Rec").Range("B18:B63").Validation
        .Delete
        .Add xlValidateList, , , "=Liste2"
        .InputTitle = "Sélection"
        .InputMessage = "Recherche rapide"
End With
End Sub
Il ne faut pas donner le même nom au deux listes. En utilisant Liste1 et Liste2 ça marche.
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Si le problème est de faire une liste dynamique alors il suffit de nommer la liste en ajoutant plein de cellules vides ( ex : B2:B1000 appelée ListeEvenements ) et de mettre dans la liste déroulante ceci :
=DECALER(ListeEvenements;0;0;NBVAL(ListeEvenements);1)
quand on rajoute un item à la liste, il est pris en compte automatiquement par la lsite déroulante.
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
L'enregistreur macro fait quasi tout le boulot :
Code:
Sub TrierListe()
' Figer écran
Application.ScreenUpdating = False
' Trier Evenements
    ActiveWorkbook.Worksheets("Evenements").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("Evenements").Sort.SortFields.Add Key:=Range("B2:B200"), _
    SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets("Evenements").Sort
        .SetRange Range("A1:F200")
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
' Trier prénom profs
    ActiveWorkbook.Worksheets("Profs").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("Profs").Sort.SortFields.Add Key:=Range("B2:B25"), _
    SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets("Profs").Sort
        .SetRange Range("A1:F25")
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
End Sub

Dans votre code après les Dim, vous coller : Call TrierListe
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Un détail : pourquoi ne pas remplacer dans Feuille Rec Private Sub Worksheet_Change(ByVal Target As Range) par Private Sub Workbook_SheetActivate(ByVal Sh As Object), dans ce cas tout est réactualiser lors de la selection de la feuille et non sur un selection de cellule. C'est plus sain.
Ensuite ( pour ce que j'ai compris ) il ne faut pas activer Trier_Numeroter à chaque fois qu'on touche à une cellule Bxx. C'est ce qui se passe actuellement. Il faut trouver un autre moyen. Soit un bouton qui lance la macro, soit l'ajout de Trier_Numeroter dans Private Sub Workbook_SheetActivate, dans ce cas Trier_Numeroter se fera la prochaine fois que vous selectionnerais la feuille.
Ou encore Trier_Numeroter se fait sur selection d'une cellule vide ou une cellule bien précise, ça va dépendre de votre besoin..
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Dans ce cas, il faut supprimer le Private Sub Worksheet_Change ou alors, si aucune des solutions proposées ne vous convient, vous mettez le Private Sub Worksheet_Change sur la dernière cellule renseignée. Mais je maintiens que ce n'est pas "sain". Imaginez qu'il y ai une erreur ou un oubli, alors le classement vous fera perdre la ligne des yeux et vous risquez de ne pas la voir.
Pourquoi ne pas rajouter en W15 le texte "Réactualisation" en 7 points et en gris, et lancer le reclassement par clic sur cette ligne. Cela me semblerait plus clair : vous renseignez votre ligne, vous la vérifiez et quand tout est correct vous reclassez.
 

Discussions similaires

Statistiques des forums

Discussions
312 108
Messages
2 085 361
Membres
102 874
dernier inscrit
Petro2611