Boite de dialogue sous condition
bonjour
je fais face a un petit probleme que voici:
sur mon planning,,dans l'onglet "affectation nuit",je voudrais qu'il y ai une boite de dialogue("attention ce collaborateur n'a pas encore été affecté hors zone rouge") qui apparaisse lorsque un collaborateur est affecté x fois dans la zone rouge sans avoir été affecté dans l'autre zone,entre deux repos.
merci de votre aide et bon dimanche
Bonjour Mipec,
Plusieurs choses:
- x fois, dis-tu? Si tu commences avec des mystères, on ne va pas pouvoir beaucoup t'aider!
- la zone rouge est, j'imagine, cette zone entre les 2 lignes rouges?
- comment repère-t-on les repos?
- d'autres données sur l'écran ont-elles une quelconque importance pour ton calcul?
- peux-tu illustrer un cas précis sur ton fichier? x (
) nuits, les repos, la situation à problème...
Si tu veux que nous comprenions ton monde, explique-le nous!
A+
curulis57 a écrit :Bonjour Mipec,
Plusieurs choses:
- x fois, dis-tu? Si tu commences avec des mystères, on ne va pas pouvoir beaucoup t'aider!
- la zone rouge est, j'imagine, cette zone entre les 2 lignes rouges?
- comment repère-t-on les repos?
- d'autres données sur l'écran ont-elles une quelconque importance pour ton calcul?
- peux-tu illustrer un cas précis sur ton fichier? x (
) nuits, les repos, la situation à problème... Si tu veux que nous comprenions ton monde, explique-le nous!
A+
>en fait le nombre de fois n'est pas tres important ,disons 2 fois
>oui la zone rouge est entre les deux lignes rouge
>les jours de repos ,sont identifier sur la ligne 4 de chaque feuilles d'affectation par un numéro(1,2,3)les jours de repos sont a différents moments de la semaine en fonction du numéro, les collaborateurs ont donc des jours de repos différents ,tout ca est géré dans la feuille "calendrier"
>pour te donner un exemple ,l'affectation d'olivier le 12 avril ,en "apro ND" doit donner lieux a l'affichage de la boite de dialogue avec l'avertissement, car il a plus de 2 affectation en zone rouge(a certains postes) sans un seul jour de travail dans l'autre zone(autres postes).
je ne sais pas si je suis très clair
Bonjour à tous et à toutes
Je vais faire plus simple , disons que il me faudrait une alerte tant que le collaborateur n'a pas été affecté au moins une fois hors zone rouge entre ses repos.
Personne pour un début de piste d'idée ?
Salut Mipec!
J'ai failli te perdre dans le flot de post!
Reprenons!
Voici une piste mais j'avoue ne pas bien comprendre ta notion de repos...
...sans avoir été affecté dans l'autre zone,entre deux repos.
Je traduis qu'il doit y avoir une colonne vide entre deux zones de repos en ligne 4 et que c'est ce chevauchement qui est interdit ??
Donc, pour être logique, ça voudrait dire que 3 nuits consécutives dans une période portant le même numéro en ligne 4 serait autorisé ??
Je suis parti dans cette direction! 8) A tester maintenant!
A toi de juger et de me rectifier en cas de besoin!
Private Sub Worksheet_Change(ByVal Target As Range)
'
iCol = Cells(2, Columns.Count).End(xlToLeft).Column
sCol = Split(Columns(iCol).Address(ColumnAbsolute:=False), ":")(1)
'
If Not Intersect(Target, Range("A20:" & sCol & 25)) Is Nothing Then
sFlag = Target.Value
For x = Target.Column - 1 To 2 Step -1
iFlag = 0
For y = 20 To 25
If Cells(y, x) = sFlag Then iFlag = 1
Next
If iFlag = 0 Then Exit sub
If Cells(4, x) <> Cells(4, Target.Column) Then
MsgBox "Attention! Ce collaborateur n'a pas encore été affecté hors zone rouge!"
Exit For
End If
Next
End If
'
End Sub
A+
salut curules
en fait le collaborateur doit être au moins une fois dans sa semaine de travail hors zone rouge
merci pour le code,peux tu me l'expliquer ligne par ligne,mon niveau de vba me permet pas le décodage
curulis57 a écrit :Je traduis qu'il doit y avoir une colonne vide entre deux zones de repos en ligne 4 et que c'est ce chevauchement qui est interdit ??
Donc, pour être logique, ça voudrait dire que 3 nuits consécutives dans une période portant le même numéro en ligne 4 serait autorisé ??
re salut
heuuuu...non entre deux zones de repos(les week end) il y a une zone de travail...
un exemple pour illustrer ça(voir fichier joint):olivier a le repos 3,il est donc en repos le 7 et 8 avril,puis travaille du 9 au 14 puis de repos le 15,16,17 avril
et pendant sa semaine de travail,il doit avoir au moins une fois une des missions de la zone blanche sur le tableau(projection ,methode,vente)
j'ai essayé ton code,c'est pas mal,mais il ne prend pas en compte la possibilite d'une colonne vide(absence du collaborateur,maladie..)
dans le fichier joint,je n'ai pas eu la boite de dialogue a cause de la colonne L qui est vide alors que le collaborateur n'a pas eu de mission en zone blanche apres trois affectations,et meme lorsque je le met en colonne L en zone orange ca ne fait pas apparaitre la boite de dialogue...
ah et il y a un autre bug,lorsque j'efface le nom du collaborateur et sélectionne n'importe quelle cellule la boite de dialogue apparait
je rajoute une petite difficulté
Salut Mipec,
ça va! Je ne sais pas pourquoi mais tes explications m'ont semblé plus claires aujourd'hui!
Dans ce cas, tous les morcellements du monde ne sont pas grand'chose pour VBA! 8)
A tester!
A+
salut curulis
on touche au but
en dehors du fait que j'aimerais comprendre le code(qui fait quoi),il reste un petit bug,meme lorsque la regle de "au moins une affectation en zone blanche dans la semaine de travail "est respectée j'ai toujours le message qui s'affiche(voir fichier,le 9 avril olivier est en zone blanche et pourtant j'ai l'alerte lorsque je l'affecte le 13 et le 14)
il faudrait que j'ai la possibilite d'extraire un collaborateur de cette regle...
je me demandais si il n'etait pas possible de gerer tout ca a partir d'un menu afin de modifier les regles sans acceder directement au code?
Salut Mipec,
ça s'éclaire, ça s'éclaire!
Bon, ici, le calcul se fait entre deux zones 3 et le message ne s'ouvre que si il y a eu au moins 3 prestations en zone rouge sans aucune en zone blanche.
Attention ! Ce calcul démarre à la colonne d'encodage et calcule vers la gauche à la rencontre de la première période de repos 3 qu'il rencontre! Ce qui veut dire qu'il postule qu'on ne trafique pas l'horaire des jours passés!
Pas de souci pour ce que tu demandes (exclusion de la règle) MAIS je souhaiterais que tu sois précis, complet et CLAIR dans ton exposé!
A+
ok ,j'ai compris comment modifier le code pour changer les zones de repos(ex : 1),maintenant je voudrais changer le code pour pouvoir rajouter des zones(missions) rouges ou des zones(missions) blanches,car mon fichier va evoluer dans le temps et s'etofer d'autres missions,par exemple dans le fichier je veux inclure les missions "vente" et "design"(lignes 28 et 29)en zone blanche dans le code car cette zone ne semble pas etre pris en compte actuellement.
Salut Mipec,
je vais réfléchir à traduire ce que tu racontes!
Si je comprends bien, il te faut un système paramétrable à souhait, tant dans la ventilation des missions rouges et blanches que dans la constitution de la liste des collaborateurs concernés par cette règle, paramétrable elle-même, je suppose !?!?!
Fichtre!
Ben..., commence... explique un peu mieux ta vision des choses!
- ...
- ...
- ...
A+
curulis57 a écrit :Salut Mipec,
ça s'éclaire, ça s'éclaire!
Bon, ici, le calcul se fait entre deux zones 3 et le message ne s'ouvre que si il y a eu au moins 3 prestations en zone rouge sans aucune en zone blanche.
Attention ! Ce calcul démarre à la colonne d'encodage et calcule vers la gauche à la rencontre de la première période de repos 3 qu'il rencontre! Ce qui veut dire qu'il postule qu'on ne trafique pas l'horaire des jours passés!
Pas de souci pour ce que tu demandes (exclusion de la règle) MAIS je souhaiterais que tu sois précis, complet et CLAIR dans ton exposé!
A+
en fait, il faut que ce soit valable pour toutes les zones de repos,pas seulement le repos 3,il faut tenir compte de la zone de repos pour chaque collaborateur...
salut curulis,
si ca peux faire avancer,voila le codage de base du fichier (by Steelson) ...
Onglet "Calendrier" :
Il comporte les rythmes à raison de cycles de 42 jours
Il est auto-ajustable : en clair, selon la date du jour, il affiche le cycle encours, le cycle précédent et commence en fait la veille du cycle précédent par la formule :
=ENT(AUJOURDHUI()/42-1)*42
A la sélection de l'onglet, il pointera sur la date du jour ("gadget") :
Private Sub Worksheet_Activate()
Cells(Now() - [A2] + 1, 1).Select
End Sub
Il existe une colonne pour chaque "cycle" avec comme formule, par exemple :
=SI($B3<>D$1;1+D2;0)
Ceci permet de mettre un 0 quand le collaborateur est en repos, sinon d'incrémenter de 1. Pourquoi ? cela permettra ensuite, pour un jour donné, de savoir quel est le numéro du jour de "sa" semaine, et donc quand "sa" semaine a commencé ! Par ce biais, on peut contrôler qu'il n'a pas déjà eu la même mission sur cette semaine.
Onglet "Compétences" : pas de macros, pas de formules, mais c'est la base des informations sur les collaborateurs et les missions. C'est ici et uniquement ici qu'on peut les mettre à jour !
Pour chaque collaborateur, est donné aussi le "cycle" d'affectation.
Onglet "Indisponibilites" : d'abord les collaborateurs sont liés par une formule simple à l'onglet précédent.
Les dates commencent quand on veut (date sur fond jaune) et sont ensuite incrémentées de 1.
A l'ouverture, sont rappelés sur fond de couleur les jours de repos par la macro un peu plus complexe :
Private Sub Worksheet_Activate()
Dim i%, j%, qui$, equipe%, ceJour As Long, numJour%, derH%, derV%
derV = Sheets("Competences").[A65000].End(xlUp).Row
derH = [B1].End(xlToRight).Column
Range(Cells(2, 2), Cells(derV, derH)).Interior.ColorIndex = 2
For i = 2 To derV
qui = Sheets("Competences").Cells(i, 1)
equipe = Sheets("Competences").Cells(i, 2)
For j = 2 To derH
ceJour = Cells(1, j)
numJour = Sheets("Calendrier").[A2].Offset(ceJour - Sheets("Calendrier").[A2], equipe + 2)
If numJour = 0 Then Cells(i, j).Interior.ColorIndex = 40
Next j
Next i
End Sub
Quand on clique sur une cellule ou sur une plage de cellules, la macro suivante se déclenche (macro évenementielle) :
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
On Error GoTo fin
If Target.Row > 1 And Target.Column > 1 Then
If Cells(Target.Row, 1) <> 0 And Cells(Target.Row, 1) <> "" And Cells(1, Target.Column) <> "" Then MotifAbsences.Show
End If
fin: Exit Sub
End Sub
Elle lance donc l'appel au menu déroulant dont le code est le suivant et permet d'affecter un motif d'indisponibilité à la plage sélectionnée :
Private Sub UserForm_Activate()
Dim i%
Me.motif_indispo.AddItem ("") ' pour pouvoir effacer
For i = 2 To Sheets("Parametres").[A65000].End(xlUp).Row
Me.motif_indispo.AddItem (Sheets("Parametres").Cells(i, 1) & " - " & Sheets("Parametres").Cells(i, 2))
Next i
End Sub
Private Sub motif_indispo_Click()
Selection.Value = Left(Me.motif_indispo.Value, InStr(Me.motif_indispo.Value, " - "))
Me.motif_indispo.Clear
Me.Hide
End Sub
Onglet "Affectation" :
Les missions sont liées avec celles définies dans l'onglet "Competences" avec un simple changement colonne > ligne par la fonction suivante :
=DECALER(Competences!$A$1;;LIGNE()-2)
Quand on clique sur une case, le menu déroulant s'affiche (macro éveénementielle) :
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
On Error GoTo fin
If Target.Row > 3 And Target.Column > 1 And Target.Count = 1 Then
ligne = Target.Row
colonne = Target.Column
If Cells(Target.Row, 1) <> 0 And Cells(Target.Row, 1) <> "" And Cells(1, Target.Column) <> "" Then AideAffectation.Show
End If
fin: Exit Sub
End Sub
Le menu déroulant est géré par cette macro :
Private Sub UserForm_Activate()
Dim CelH As Range, CelV As Range
Dim i%, qui$, equipe%, ceJour As Long, numJour%
Me.emploi.Caption = Cells(ligne, 1) & " - " & Cells(1, colonne)
Me.equipier.AddItem ("") ' pour pouvoir effacer
For i = 2 To Sheets("Competences").[A65000].End(xlUp).Row
qui = Sheets("Competences").Cells(i, 1)
equipe = Sheets("Competences").Cells(i, 2)
ceJour = Cells(1, colonne)
numJour = Sheets("Calendrier").[A2].Offset(ceJour - Sheets("Calendrier").[A2], equipe + 2)
Set CelV = Range(Cells(1, colonne), Cells([A65000].End(xlUp).Row, colonne))
Set CelH = Range(Cells(ligne, Application.max(2, colonne - numJour + 1)), Cells(ligne, colonne - numJour + 6))
If WorksheetFunction.CountIf(CelV, qui) = 0 _
And WorksheetFunction.CountIf(CelH, qui) < 1 _
And numJour <> 0 _
And Sheets("Indisponibilites").Cells(i, ceJour - Sheets("Indisponibilites").[B1] + 2) = "" _
And Sheets("Competences").Cells(i, ligne - 1) <> "" _
Then Me.equipier.AddItem (qui)
Next i
End Sub
Private Sub equipier_Click()
Cells(ligne, colonne) = Me.equipier.Value
Me.equipier.Clear
Me.Hide
End Sub
Bonjour
Je relance mon sujet dont la résolution à bien avancée,le code à bien avancé, reste juste à prendre en compte les différentes phases de repos
Salut Mipec,
je chassais quelques fâcheux Gremlins sur un autre projet!
Je regarde ton fichier ce soir!
8)
A+
Salut curulis
Fais attention c'est dangereux comme animal
Salut Mipec,
voilà, le système de configuration des zones rouges et blanches est au point.
Tu pourras ne sélectionner qu'une ligne ou plusieurs et le changement s'opérera à la volée.
Pour repérer ces zones lors du calcul -zones rouges-repos- (je ne sais pas comment appeler ça
Veux-tu que les couleurs de ligne qui illustrent ces changements de zone ne soient affichés qu'à partir de la date du changement?
Il me faudrait pour cela un autre fichier que celui-ci que je puisse tester grandeur nature.
Je modifie ce soir la procédure de calcul.
A+