XL 2019 Liste déroulante

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

  • Planning d'équipe Melvin.xlsm
    53.6 KB · Affichages: 15

TooFatBoy

XLDnaute Barbatruc
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

  • Planning-d-equipe-Melvin_(TooFatBoy-v1).xlsm
    48.4 KB · Affichages: 5

Phil69970

XLDnaute Barbatruc
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
 

chinel

XLDnaute Impliqué
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 ;)
 

chinel

XLDnaute Impliqué
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
 

cp4

XLDnaute Barbatruc
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

  • Planning d'équipe Melvin_Cp4.xlsm
    54.8 KB · Affichages: 9

TooFatBoy

XLDnaute Barbatruc
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

  • Planning-d-equipe-Melvin_(TooFatBoy-v2).xlsm
    52.6 KB · Affichages: 2

chinel

XLDnaute Impliqué
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
 

cp4

XLDnaute Barbatruc
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.
 

chinel

XLDnaute Impliqué
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

cp4

XLDnaute Barbatruc
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.
 

Discussions similaires

Statistiques des forums

Discussions
314 496
Messages
2 110 236
Membres
110 708
dernier inscrit
novy16