Listes déroulantes filtrées

Salut Brice,
Salut Fronck,

saisis pas tout...

If Cells(x, 1) <> sEq And (Cells(x + 1, iCol) = "J" Or Cells(x + 1, iCol) = "REPOS") And Cells(x + 1, iCol + 1) <> "M" Then

Là, je choisis les équipes, différentes de l'équipe appelante, qui sont en "J" ou "Repos" et qui ne sont pas en "M" le lendemain.

If Cells(x + (y * 2), 1) <> 0 And Cells(x + (y * 2) + 1, iCol) <> "ABS" And _
                    WorksheetFunction.CountIf(Columns(iCol), Cells(x + (y * 2), 1)) = 0

Ici, dans les équipes choisies plus haut, je choisis les agents qui existent (<> 0), non absents ce jour-là et qui n'ont pas encore été repris ailleurs.

Et, c'est quoi cette histoire de couleur ?


A+

Bonjour Curulis, Brice,

@Brice, tu fais un tableau annuel qui ne donne pas envie à la consultation, avec un curseur qui t'emmène encore plus loin que décembre.

A cela tu veux ajouter des listes déroulantes avec une ligne en plus à chaque personne et chaque jour, ce qui rend le planning un peu plus illisible, alors qu'il n'y a pratiquement pas de données dedans à part les formules, ce qui me fait penser qu'il n'y a pas souvent de recomposition d'équipe. Bon courage à Curulis pour faire une macro qui fasse des listes déroulantes différentes par jour et par personne. En plus pour moi tes règles peuvent encore changer selon d'autres critères (surtout qu'on sait pas ce que signifie tous les termes (M AM et J) et il faudra changer les macros.

C'est pour cela que je me suis arrété à la condition du repos d'une équipe pour compléter les autres équipes, avec une visibilité qui te permet de voir mieux les autres employés disponibles, et faire un copier coller d'une cellule.

Cdt

10planning-brice-2.zip (239.29 Ko)
12doc1.zip (292.06 Ko)

salut curulis,

effectivement tu ne devais pas avoir les couleurs, la version que j'avais mise n'était pas à jour mais c'est pas grave,

par contre dans la liste déroulante il y a du personnel qui ne devrait pas être pressent puisqu'ils sont absents sur le même jour ...

salut fronck,

j'avoue ce n'est pas très attirant mais ce n'est pas fini non plus...

j'ai prévu de faire un filtre d'affichage entre le 01 JUIN au 15 septembre, ce qui me permet d'avoir une vue d'ensemble des remplacements d'été.

j'avoue ce n'est pas évident d'où mon besoin d'aide !!

les listes déroulante sont pas trop mal, il y a quelques bug que je pense modifiable mais curulis s'en sort plutôt bien lol .

en faite c'est un planning en 3/8

M matin

AM aprés midi

N nuit

avec un roulement sur 7 semaines

les remplacements sont gérer au coup par coup le reste de l'année ce qui ne demande pas d'anticipation à une grande demande

si on regarde l'été la moitié du personnel est absent chaque jour ce qui génère 6 remplacement/jour sur presque 90 jours

merci de ton aide ;)

Salut Brice,
Salut Fronck,

peux-tu me désigner un jour avec une erreur dans la liste des remplaçants que je puisse saisir le truc ?


A+

salut curulis,

dans le fichier DOC1, un peu plus haut je t'ai mis un exemple.

j'ai l'impression que l'erreur n'est pas partout ...

merci beaucoup en tous cas je m'en sert déjà c'est super pratique pour moi !!!

bonne fin de journée

brice

14planning-brice-2.zip (238.88 Ko)

Salut Brice,

l'erreur se situait ici.
Version corrigée.

            For y = 1 To iNbWk
                If Cells(x + (y * 2), 1) <> 0 And Cells(x + (y * 2), iCol) <> "ABS" And _
                    WorksheetFunction.CountIf(Columns(iCol), Cells(x + (y * 2), 1)) = 0 Then _
                        sFormula = sFormula & IIf(sFormula = "", "", ",") & Cells(x + (y * 2), 1)
            Next

And Cells(x + (y * 2) + 1, iCol) <> "ABS"


A+

salut curulis,

vraiment génial !!!

si ça ne te dérange pas je solliciterais encore ton aide, au fur et à mesure que j'avance dans mon planning je vais essayer d'ajouter des filtres ;)

en essayant de partir de tes formules.

encore merci !

10doc1.zip (586.92 Ko)

salut curulis,

je viens de me rendre compte que j’étais trop restrictif sur une de mes conditions:

If Cells(x, 1) <> sEq And (Cells(x + 1, iCol) = "J" Or Cells(x + 1, iCol) = "REPOS") And Cells(x + 1, iCol + 1) <> "M" Then

Là, je choisis les équipes, différentes de l'équipe appelante, qui sont en "J" ou "Repos" et qui ne sont pas en "M" le lendemain.

je te mets en exemple une condition:

il peut faire un matin si avant il était de repos de j ou ABS

le 26 juillet sur un remplacement de matin en équipe 1 on peut faire apparaitre les OP disponibles de l’équipe 6

Salut Brice,

Il y a 2 séries de REPOS après J :
- une de 1 jour de REPOS puis M ;
- une de 4 jours de REPOS puis M.

Peuvent-ils faire un M n'importe quel jour de REPOS ou uniquement LE jour précédant la reprise ?


A+

Salut curulis,

Encore merci pour le temps que tu passes dessus...

Voici les conditions où il ne peux pas faire de matin :

Après une N , après un AM, s'il est absent.

Je regarde pour faire un bouton qui efface le formulaire (seulement les remplacements déjà rentrés).

Un autre qui effacerai les dates de vacances dans la feuille de donnée.

Et aussi je vais essayer de faire un filtre d'affichage de date , de... à....

Passe une bonne journée merci

Brice ou Ponpon ?!

peux-tu me faire un topo COMPLET des conditions pour chaque pause ?
Pas envie de faire joujou au cas par cas...


A+

salut curulis,

lol je me suis connecté de mon tel portable et apparemment ce n'est pas le même compte ...

oui tu as raison mais au final en remplissant le planning j'y ai trouvé tellement de subtilité que ça en devient compliqué ...

je vais essayé de faire un topo complet:

  1. les personnes peuvent remplacer si elles sont de repos ou de J
    1. elle ne peuvent PAS faire :
      1. de M si la veille elle était de N ou de AM
      2. travailler 12 jours d'affilés (M, N, AM et J compris) un repos est obligatoire entre 2 périodes de 11 jours
      3. de M et AM si la veille elles étaient de N
      4. de N si le lendemain elles sont de M ou AM
      5. de AM si le lendemain elle est de M
  2. elle peuvent faire:
    1. un N si la veille elles étaient de N
    2. un M si le lendemain elles sont de M
    3. et bien sure tous les autres cas qui ne sont pas cité dessus ...

tous c'est compliqué...

actuellement pas mal de condition sont déjà prise en compte

je me suis aussi rendu compte que les personnes préfèrent faire des remplacements M avant un M de leurs roulement et des N aprés un N de leurs roulement ...

j’espère avoir été clair...

merci beaucoup

je vais faire une version sans nom pour mettre en ligne...

je ferais ça cette nuit au travail

Bonjour Brice Curulis et ponpon,

Bon je me suis fait à l'idée d'avoir des noms de remplaçants en dehors des entêtes mais çà promet pour la comptabilité aprés si vous faites pas des NB.SI mensuels.

Merci à Curulis pour son code que j'ai découvert et compris.

Voici ma proposition pour résoudre 2 des 3 derniéres conditions :

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'
Dim iRow%, iCol%, iNb%, iNb1%, iNb2%, iNbAbs%, iNbEnd%, iNbWk%, sEq$, sFormula$
'
If Selection.Columns.Count > 1 Or Selection.Row = 1 Then Exit Sub
'
iRow = Target.Row 'ligne ou tu cliques
iCol = Target.Column 'col ou tu cliques
iNb1 = Columns(1).Find(what:="Equipe 1", lookat:=xlWhole, LookIn:=xlValues, searchdirection:=xlNext).Row  'ligne Equipe 1
iNb2 = Columns(1).Find(what:="Equipe 2", lookat:=xlWhole, LookIn:=xlValues, searchdirection:=xlNext).Row  'ligne Equipe 2
iNbAbs = Columns(1).Find(what:="Absence", lookat:=xlWhole, LookIn:=xlValues, searchdirection:=xlNext).Row  'ligne Absence Eq 1
iNbEnd = Columns(1).Find(what:="Equipe", lookat:=xlPart, LookIn:=xlValues, searchdirection:=xlPrevious).Row 'ligne dern éq (eq 7)
iNbWk = (iNbAbs - (iNb1 + 2)) / 2               'nbre de travailleurs par équipe 20-(6+2)/2 = 6
iNb = iNb2 - iNb1                               'nbre de lignes (libres comprises) occupées par une équipe
'
Cells.Validation.Delete
If Target.Offset(-1, 0) = "ABS" Then
    sEq = Range("A1:A" & iRow).Find(what:="Equipe", lookat:=xlPart, LookIn:=xlValues, searchdirection:=xlPrevious)
    'MsgBox sEq 'si sous "abs", donne le nom de l'équipe en cours
    For x = iNb1 To iNbEnd Step iNb
        If Cells(x, 1) <> sEq And (Cells(x + 1, iCol) = "J" Or Cells(x + 1, iCol) = "REPOS") And Cells(x + 1, iCol + 1) <> "M" Then
            For y = 1 To iNbWk
    'WorksheetFunction.CountIf(Columns(iCol), Cells(x + (y * 2), 1)) = 0 pas encore été repris ailleurs.
'Cells(x + 1, iCol - 1) = Cells(x + 1, iCol) (même poste M Am ou N la veille du remplaçant)
'Cells(x + 1, iCol + 1) = Cells(x + 1, iCol) (même poste M Am ou N le lendemain du remplaçant)
    If Cells(x + (y * 2), 1) <> 0 And Cells(x + (y * 2), iCol) <> "ABS" _
            And Cells(x + 1, iCol - 1) = Cells(x + 1, iCol) _
            And Cells(x + 1, iCol + 1) = Cells(x + 1, iCol) _
            And WorksheetFunction.CountIf(Columns(iCol), Cells(x + (y * 2), 1)) = 0 Then
                        sFormula = sFormula & IIf(sFormula = "", "", ",") & Cells(x + (y * 2), 1)
    End If
            Next y
        End If
    Next x
    If sFormula <> "" Then Target.Validation.Add Type:=xlValidateList, Formula1:=sFormula
End If
End Sub

Pour la condition de ne pas travailler plus de 11 jours, j'ai un souci pour valider la plage concernée, à valider :

 And WorksheetFunction.CountIf(Columns((iRow-11)":" (iRow-1) , Cells(x + (y * 2)) < 11           '

J'ai quelques questions :

@Curulis c'est quoi les Dim en % et $ , et les

Cells.Validation.Delete .....
IIf(sFormula = "", "", ","

@brice c'est pour quoi le J jour exactement ?

13planning-brice.zip (242.81 Ko)

cdt

Salut Fronck,

Dim iRow% = Dim iRow as Integer, $ pour String, & pour Long, # pour Double : c'est plus court à écrire !

Cells.Validation.Delete ?
- pour être certain de ne pas créer une liste de validation sur une cellule en comportant déjà une = erreur ;
- pour éliminer de l'écran ces petites flèches inesthétiques.


A+

Fronck,

j'ai oublié...

sFormula = sFormula & IIf(sFormula = "", "", ",") & Cells(x + (y * 2), 1)

C'est simple, je construis ici les valeurs de la liste de validation sous forme d'une chaîne String avec la virgule comme séparateur.
La chaîne étant vide à l'entame du calcul, je teste si la chaîne a au moins un item pour placer une virgule avant l'inscription de la valeur suivante...


A+

salut Fronck et Curulis,

encore merci pour le temps passé dessus, j'avoue ça deviens très, très, complexe pour moi pour comprendre toutes les formules ,

j'ai encore un petit probléme ...

ça ne me propose pas la personne disponible pour un matin lorsqu'il est de matin le lendemain.

je mets un exemple .

le personnel de l’équipe 2 non absent devraient être proposés.

j’espère

10planning-brice-3.zip (243.80 Ko)

que je ne vous dérange pas trop avec mes demandes !

4doc2.zip (272.47 Ko)

Merci Curulis pour les explications.

brice, il était indiqué que l'employé devait pas être de matin le lendemain :

And Cells(x + 1, iCol + 1) <> "M"

Donc si je l'enlève, MEJECASE et FUSTER apparaissent disponibles.

Par contre je m'explique pas les doublons.

Pour tes incompréhensions de formules, j'ai mis ces commentaires :

'Cells(x + 1, iCol - 1) = Cells(x + 1, iCol) Même poste (même poste M Am ou N la veille du remplaçant)

'Cells(x + 1, iCol + 1) = Cells(x + 1, iCol) Même poste (même poste M Am ou N le lendemain du remplaçant)

Si çà t'aide pas dis moi.

Et un dernier truc pour réduire votre ascenseur horizontal, utile à la fin de l'année :

ep2

Voilà ce qu'il faut faire :

1- se positionner à la dernière colonne de la feuille en saisissant XFD1 dans la zone nom

2- A partir de la dernière colonne, sélectionner toutes les colonnes sans données enregistrées

3- Supprimer ces colonnes

4- Enregistrer le classeur

Cdt

salut fronck,

merci pour les explications , je pense que ça m'aide bien.

du coupj'ai transformé le + en - dans ta formule de départ et ça à l'air de marcher , dis moi ce que tu en penses ?

And Cells(x + 1, iCol + 1) <> "M"

j'ai une petite question, tous les filtres prennent en compte le roulement seulement initiale du personnel et non les remplacement ajoutés ?

exemple :

si je le mets comme remplaçant un jour de nuit, le lendemain je peux quand même le sélectionner pour un remplacement de matin

j'ai une question bête,

je voulais faire un bouton raz afin d'effacer les lignes de remplacement, je suis arrivé (ou presque) à faire une raz sur les colonnes mais je n'arrive pas à nommer des lignes j'ai toujours un message d'erreur ...

dans la macro comment nomme t-on une ligne ?

merci

Rechercher des sujets similaires à "listes deroulantes filtrees"