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é ,la zone orange peut être morcelée,comme dans le fichier joint

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

Personne ?

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 ), la macro ira lire en [AAA] le chiffre 1 (zone rouge) ou 0 (zone blanche).

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+

Rechercher des sujets similaires à "boite dialogue condition"