XL 2019 Liste déroulante

  • Initiateur de la discussion Initiateur de la discussion chinel
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

chinel

XLDnaute Impliqué
Bonjour tout le monde, je cherche à faire une liste déroulante dans ma feuille (Comptage) avec tous les prénoms des gens de la feuille (Personnel) mais sachant qu'une liste déroulante ne peut se faire que, en ligne ou en colonne, je ne sais pas comment faire. Merci de votre aide !
 

Pièces jointes

Franchement, il est beaucoup plus simple d'avoir une liste de personnes et de remplir le tableau de la feuille "Personnel" à partir de cette liste, plutôt que de déduire une liste sans doublon à partir du tableau de la feuille "Personnel" !

Donc voici, en pièce jointe, une proposition, au cas où...
 

Pièces jointes

Re

Ton chef d'équipe aurait pu avoir la liste de ces agents par poste et tu préfères qu'il rentre les données à la main avec toutes les erreurs possibles.
Alors je dis bravo !

Je t'avais fait dans une demande précédente des listes déroulantes en fonction des postes de chacun tu as tout mis à la poubelles et maintenant tu demandes d'avoir une liste déroulante avec les noms de tes agents.

Je sais pas si tu es fou (je suis pas qualifier pour cela 🤣 ) en tout cas tu fonctionnes clairement à l'envers.

@Phil69970
 
Re

Ton chef d'équipe aurait pu avoir la liste de ces agents par poste et tu préfères qu'il rentre les données à la main avec toutes les erreurs possibles.
Alors je dis bravo !

Je t'avais fait dans une demande précédente des listes déroulantes en fonction des postes de chacun tu as tout mis à la poubelles et maintenant tu demandes d'avoir une liste déroulante avec les noms de tes agents.

Je sais pas si tu es fou (je suis pas qualifier pour cela 🤣 ) en tout cas tu fonctionnes clairement à l'envers.

@Phil69970
Le chef d'équipe a la liste du personnel le jour même donc pas possible d'avoir des erreurs et c'est lui qui décide de l'emplacement de son personnel 😉
 
Franchement, il est beaucoup plus simple d'avoir une liste de personnes et de remplir le tableau de la feuille "Personnel" à partir de cette liste, plutôt que de déduire une liste sans doublon à partir du tableau de la feuille "Personnel" !

Donc voici, en pièce jointe, une proposition, au cas où...
Merci pour ton fichier, il me plaît mais je vais devoir juste ajuster ma macro pour venir coller au bon endroit
 
Bonsoir,

En fouinant dans mon grenier, je t'ai déniché un code de Thierry( Mes respects pour les anciens😉) que j'ai adapté à ton contexte. Enfin, si j'ai bien compris ton problème.
Le code est dans le module 2, qui s’exécute à l'activation de la feuille "Comptage".
Ce n'est pas toi qui est fou, mais ton chef. En effet, mettre à jour une plage de données en utilisant le mot "IMPRIMER". Il faut vraiment avoir l'esprit tordu ou ne maitrisant pas le Français.
En espérant que le code réponde bien à tes attentes.

Bonne soirée.

nb: ne me demande pas de t'expliquer tout le code, je ne l'ai pas complétement décortiqué.
 

Pièces jointes

Si j'ai bien compris :
- le chef rempli la feuille "Planning",
- quand on clique sur le bouton "Imprimer" ça recopie les noms dans la feuille "Personnel", puis ça demande si on veut imprimer (et du coup ça imprime ou non selon la réponse...), ensuite ça efface les données de la feuille "Planning", et enfin ça sauvegarde le fichier,
- dans la feuille "Comptage" on choisi un ouvrier et ça affiche le nombre de fois où il était sur chacun des postes d'après la BDD de la feuille "Personnel" (feuille qui, du coup, devrait plutôt s'appeler "BDD" !...).

J'espère que j'ai bon, car je me suis basé là-dessus pour faire une nouvelle version, qui utilise le même principe que le camarade Phil69970 avait fort justement utilisé précédemment ici, c'est-à-dire l'utilisation d'une liste déroulante spécifique à chacune des trois catégories de travailleurs (Chef d'équipe, brigadier, ouvrier) afin de remplir, rapidement et sans erreur de saisie possible, la feuille "Planning".


Créer la liste, comme tu le demandes, à partir du tableau de la feuille "Personnel" c'est marcher sur la tête ! Autrement dit, c'est absurde car c'est faire le boulot à l'envers. Et en plus ça n'autorise aucune vérification lors de la saisie par le chef dans la feuille "Planning".
Si c'est ton chef qui t'a demandé faire comme ça, explique-lui l'avantage de travailler dans le bon sens : vérification des noms lors du remplissage de sa feuille "Planning". 😉
 

Pièces jointes

Bonsoir,

En fouinant dans mon grenier, je t'ai déniché un code de Thierry( Mes respects pour les anciens😉) que j'ai adapté à ton contexte. Enfin, si j'ai bien compris ton problème.
Le code est dans le module 2, qui s’exécute à l'activation de la feuille "Comptage".
Ce n'est pas toi qui est fou, mais ton chef. En effet, mettre à jour une plage de données en utilisant le mot "IMPRIMER". Il faut vraiment avoir l'esprit tordu ou ne maitrisant pas le Français.
En espérant que le code réponde bien à tes attentes.

Bonne soirée.

nb: ne me demande pas de t'expliquer tout le code, je ne l'ai pas complétement décortiqué.
Merci je vais regarder
Si j'ai bien compris :
- le chef rempli la feuille "Planning",
- quand on clique sur le bouton "Imprimer" ça recopie les noms dans la feuille "Personnel", puis ça demande si on veut imprimer (et du coup ça imprime ou non selon la réponse...), ensuite ça efface les données de la feuille "Planning", et enfin ça sauvegarde le fichier,
- dans la feuille "Comptage" on choisi un ouvrier et ça affiche le nombre de fois où il était sur chacun des postes d'après la BDD de la feuille "Personnel" (feuille qui, du coup, devrait plutôt s'appeler "BDD" !...).

J'espère que j'ai bon, car je me suis basé là-dessus pour faire une nouvelle version, qui utilise le même principe que le camarade Phil69970 avait fort justement utilisé précédemment ici, c'est-à-dire l'utilisation d'une liste déroulante spécifique à chacune des trois catégories de travailleurs (Chef d'équipe, brigadier, ouvrier) afin de remplir, rapidement et sans erreur de saisie possible, la feuille "Planning".


Créer la liste, comme tu le demandes, à partir du tableau de la feuille "Personnel" c'est marcher sur la tête ! Autrement dit, c'est absurde car c'est faire le boulot à l'envers. Et en plus ça n'autorise aucune vérification lors de la saisie par le chef dans la feuille "Planning".
Si c'est ton chef qui t'a demandé faire comme ça, explique-lui l'avantage de travailler dans le bon sens : vérification des noms lors du remplissage de sa feuille "Planning". 😉
Merci pour ton soutien, je regarde ça en rentrant chez moi. Bonne journée
 
Bonjour,
Si tu as beaucoup de données, le temps d’exécution du précédent code sera un peu long.
Je te propose ce nouveau code plus rapide. La liste sera triée dans un ordre croissant.
VB:
Option Explicit
Option Compare Text

Dim d As Object

Sub ListValidationSpecial()
   Dim dl As Integer, tb(), i As Integer, j As Integer
   Dim cle, liste

   Set d = CreateObject("scripting.dictionary")
   With Sheets("personnel")
      dl = .Range("A" & Rows.Count).End(xlUp).Row
      tb = .Range("B2:AE" & dl).Value
   End With

   For i = LBound(tb) To UBound(tb)
      For j = LBound(tb, 2) To UBound(tb, 2)
         If tb(i, j) <> "" Then d(tb(i, j)) = ""
      Next j
   Next i

   DicoTri d

   For Each cle In d.keys
      liste = liste & "," & cle
   Next
   With Sheets("Comptage").Range("B1").Validation
      .Delete
      .Add Type:=xlValidateList, _
           Operator:=xlBetween, _
           AlertStyle:=xlValidAlertStop, _
           Formula1:=liste
   End With
End Sub
Sub DicoTri(dico)
Dim i As Integer, Tbl
   Tbl = d.keys                           ' Transfert Dictionnaire dans Array
   Tri Tbl, LBound(Tbl), UBound(Tbl)   ' Tri Array
   d.RemoveAll                           ' Création du dictionnaire
   For i = LBound(Tbl) To UBound(Tbl)
      d(Tbl(i)) = ""
   Next i
End Sub
Sub Tri(a, gauc, droi)          ' Quick sort
Dim ref As String, g As Integer, d As Integer, temp
   ref = a((gauc + droi) \ 2)
   g = gauc: d = droi
   Do
      Do While a(g) < ref: g = g + 1: Loop
      Do While ref < a(d): d = d - 1: Loop
      If g <= d Then
         temp = a(g): a(g) = a(d): a(d) = temp
         g = g + 1: d = d - 1
      End If
   Loop While g <= d
   If g < droi Then Call Tri(a, g, droi)
   If gauc < d Then Call Tri(a, gauc, d)
End Sub

Bonne journée.
 
Bonjour,
Si tu as beaucoup de données, le temps d’exécution du précédent code sera un peu long.
Je te propose ce nouveau code plus rapide. La liste sera triée dans un ordre croissant.
VB:
Option Explicit
Option Compare Text

Dim d As Object

Sub ListValidationSpecial()
   Dim dl As Integer, tb(), i As Integer, j As Integer
   Dim cle, liste

   Set d = CreateObject("scripting.dictionary")
   With Sheets("personnel")
      dl = .Range("A" & Rows.Count).End(xlUp).Row
      tb = .Range("B2:AE" & dl).Value
   End With

   For i = LBound(tb) To UBound(tb)
      For j = LBound(tb, 2) To UBound(tb, 2)
         If tb(i, j) <> "" Then d(tb(i, j)) = ""
      Next j
   Next i

   DicoTri d

   For Each cle In d.keys
      liste = liste & "," & cle
   Next
   With Sheets("Comptage").Range("B1").Validation
      .Delete
      .Add Type:=xlValidateList, _
           Operator:=xlBetween, _
           AlertStyle:=xlValidAlertStop, _
           Formula1:=liste
   End With
End Sub
Sub DicoTri(dico)
Dim i As Integer, Tbl
   Tbl = d.keys                           ' Transfert Dictionnaire dans Array
   Tri Tbl, LBound(Tbl), UBound(Tbl)   ' Tri Array
   d.RemoveAll                           ' Création du dictionnaire
   For i = LBound(Tbl) To UBound(Tbl)
      d(Tbl(i)) = ""
   Next i
End Sub
Sub Tri(a, gauc, droi)          ' Quick sort
Dim ref As String, g As Integer, d As Integer, temp
   ref = a((gauc + droi) \ 2)
   g = gauc: d = droi
   Do
      Do While a(g) < ref: g = g + 1: Loop
      Do While ref < a(d): d = d - 1: Loop
      If g <= d Then
         temp = a(g): a(g) = a(d): a(d) = temp
         g = g + 1: d = d - 1
      End If
   Loop While g <= d
   If g < droi Then Call Tri(a, g, droi)
   If gauc < d Then Call Tri(a, gauc, d)
End Sub

Bonne journée.
Merci beaucoup pour le code mais si je mets une protection (mot de passe) à ma feuille "Comptage", j'ai un débogage au niveau de:

.Add Type:=xlValidateList, _
Operator:=xlBetween, _
AlertStyle:=xlValidAlertStop, _
Formula1:=liste
 

Pièces jointes

  • erreur.png
    erreur.png
    53.7 KB · Affichages: 12
Merci beaucoup pour le code mais si je mets une protection (mot de passe) à ma feuille "Comptage", j'ai un débogage au niveau de:

.Add Type:=xlValidateList, _
Operator:=xlBetween, _
AlertStyle:=xlValidAlertStop, _
Formula1:=liste
Il te suffit de déprotéger au préalable la feuille.
Sheets("comptage").unprotect +password
utilise l'enregistreur de macro, il te donnera la syntaxe.
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
8
Affichages
94
Réponses
29
Affichages
803
Réponses
6
Affichages
323
Réponses
13
Affichages
128
Retour