Creer un pop up alerte avec beaucoup de conditions

Bonjour a tous , voilà je suis occupé de finaliser un planning annuel , gérant plusieurs équipes ...

les agents sont sur les lignes et les jours dans les colonnes .

travaillant 12h , nous ne pouvons travailler plus de 4 jours par semaines CIVILS ...

Chaque jours travaillé est renseigné dans la case par : "J" qui signifie JOUR , "N" qui signifie NUIT "F"... formation "CP" congé payé et d'autres ....

je souhaite créer une macro qui , pour chaque semaine civil ( donc une plage de 7 colonnes a partir d'une case référence du lundi )

et pour chaque ligne ( chaque agent )

me signale par un popup un message ... du style " ATTENTION temps de travail Hebdomadaire dépassé !!! "

donc si dans la ligne 12 , l'agent Durant a dans la plage de B12à H12 2N+3J ==> lancement du pop up

je débute dans la macro , j'ai essayer en récupérant des codes de droite a gauche mais je galere ....

je ne veux pas utiliser forme conditionnelle car déja utilisé pour des codes couleurs ... et trop lourd a mettre en place

il me faudrait un calcul de type glissant ....

a oui , j'ai eu des bout de code macro que j'ai mis , du codage simple , mais il fonctionne seulement quand je clique sur " play" dans VBA ... , une fois que j'ai enregistré et quitté VBA , celà ne marche pas dans excel .. y a t'il qq chose pour lancer automatiquement la fonction macro ??? d'avance merci

ps : je dispose du planning en fichier si besoin..

encore merci

bonjour

pour lancer la macro : il faut en passer par une procedure evennementielle ; ton code actuel est dans un module ;tu le colles dans la feuille apres avoir choisi change ou selection_change ;il va falloir modifier le debut car dans ce cas on ne parle plus de sub ..

ou alors avec le meme principe tu peux appeler la macro

if........... then le nom de ta macro

cordialement

55envoie-site.xlsm (101.55 Ko)

Bonjour , j'ai reussi a rentrer un code en macro :

Private Sub Worksheet_Calculate()

If Worksheets("2015").Range("I49").Value = 5 Then

MsgBox Range("c5") & " a dépassé la durée légale en " & Range("I3"), vbExclamation

End If

donc , je recois un message de ce genre " Nom de la personne qui se trouve en C5 a dépassé la durée légale en semaine x qui se trouve en I3 .....

j'aimerai a ne pas avoir a recopier ce code 30 fois pour chaque agent et 52 fois pour chaque semaine ....

je vous laisse le fichier avec macro .. merci d'avance aux personne qui pourront m'aider

je pense qu'il faut mettre un code avec la fonction décaler ???

si il existe une autre méthode , car actuellement je fait la somme des J,des N des JD dans une cellule I49 et le message apparait si cette cellule depasse 5 ...

si on peux directement intégré si de la cellule I4 à O4 , la somme des texte "J" "N" "JD" supérieur a 4 alors msgbox .....

je vous envoie le fichier encore merci pour ceux ou celle qui pourront m'aider

Bonjour,

L'évènement Evaluate() est un mauvais choix à mon avis : tout est recalculé à la moindre saisie.

Tu vas vite te lasser :

  • du ralentissement de la feuille.
  • des boites qui vont s'ouvrir en permanence tant que tu n'auras pas corrigé.

Je te propose d'alerter uniquement au moment de la saisie :

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim pl As Range, nb As Long, msg As String
    If Intersect(Target, [E5:NE32]) Is Nothing Or Target.Count > 1 Then Exit Sub
    Set pl = Target.Offset(, -Weekday(Cells(4, Target.Column), vbMonday) + 1).Resize(, 7)
    nb = Application.CountIf(pl, "j") + Application.CountIf(pl, "n") + Application.CountIf(pl, "jd")
    msg = Cells(Target.Row, "C") & ", " & Cells(3, pl.Column) & " : "
    msg = msg & vbLf & "ATTENTION temps de travail Hebdomadaire dépassé !!!"
    msg = msg & vbLf & vbLf & "Annuler ?"
    If nb >= 5 Then
        If MsgBox(msg, vbYesNo + vbExclamation, msg) = vbYes Then
            Application.EnableEvents = False
            Application.Undo
            Application.EnableEvents = True
        End If
    End If
End Sub

à mettre dans le module de la feuille (pas dans un module standard ajouté)

Actuellement valable que si tu modifies tes cellules une par une.

Adapter [E5:NE32] si évolution de la plage (ou utiliser une plage nommée)

eric

Bonsoir Eriic , ton code m'interesse , je l'ai copié , il fonctionne mais plante a quelque endroit , j'essai de le comprendre ....

par contre il est vrai qu'avec ma méthode le fichier excel est long et pénible pour les erreurs ....

j'ai trouvé , il plante uniquement au début de l'année sur les 5 premiers jours , surement du a interrogation des 7 jours ... je pense ...

j'ai donc modifié mon souhait et impec !!!

Juste un petit truc LOL

quand je sélectionne une case et que je sélectionne N ( et que je suis au max des jours travaillé )

il me mets bien le message d'erreur

par contre si je prends la première nuit et que je fais "copier" ( tu sais le petit carée en bas de chaque cellule pour dupliqué ... )

là il ne me dis rien ... alors soit je trouve le moyen de bloqué la duplication ou alors ... un morceau de code a mettre ???

en tout cas merci , le code n'est pas trop compliqué , je vais même essayer le réutiliser pour d'autre controle sur le planning ..


j'ai trouvé un code interessant :

Private Sub Workbook_Activate()

PETITE QUESTION ENCORE :

je souhaite utiliser ton code , mais avec une condition en plus , j'aimerais par exemple que maintenant si je mets CP dans la case A3 ( la premiere de la selection ) et que çà tombe un SAMEDI ( jour ecrit 3 ligne au dessus dans tout les colonnes ... )

il me mets la meme chose , il dois juste manque un if quelque part ????

j'ai modifié legerement ton code , pour vraiment empecher qu'il fasse continuer :

Private Sub Worksheet_Change(ByVal Target As Range)

c'est tout bon

merci !!!!!!!!!!!!!

Bonjour,

si je prends la première nuit et que je fais "copier"

C'est ce que je te disais dans Actuellement valable que si tu modifies tes cellules une par une.

A tester :

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim pl As Range, c As Range, nb As Long, msg As String
    If Intersect(Target, [E5:NE32]) Is Nothing Then Exit Sub
    For Each c In Target
        Set pl = c.Offset(, -Weekday(Cells(4, Target.Column), vbMonday) + 1).Resize(, 7)
        If pl.Column < 5 Then Exit For
        nb = Application.CountIf(pl, "j") + Application.CountIf(pl, "n") + Application.CountIf(pl, "jd")
        msg = Cells(c.Row, "C") & ", " & Cells(3, pl.Column) & " : "
        msg = msg & vbLf & "ATTENTION temps de travail Hebdomadaire dépassé !!!"
        msg = msg & vbLf & vbLf & "Annuler ?"
        If nb >= 5 Then
            If MsgBox(msg, vbYesNo + vbExclamation, msg) = vbYes Then
                Application.EnableEvents = False
                Application.Undo
                Application.EnableEvents = True
            End If
        End If
    Next c
End Sub

J'ai ajouté le contrôle sur les premières colonnes.

Par contre l'annulation annule toute la modification, pas seulement celles en trop, sinon il faut supprimer cette annulation.

j'aimerais par exemple que maintenant si je mets CP dans la case A3 ( la premiere de la selection ) et que çà tombe un SAMEDI ( jour ecrit 3 ligne au dessus dans tout les colonnes ... )

il me mets la meme chose , il dois juste manque un if quelque part ????

Quelle que soit la valeur mise, juste une des 3 ou juste cp ?

Je vois sur ton tableau que tu n'en as pas mis le dimanche non plus. Pas concerné ?

Plutôt qu'une alerte on peut envisager de boucler sur la plage modifiée et vider ces cellules. Ce qui permet de faire plusieurs semaines en copiant.

eric

bonjour , voici le fichier complet

j'ai enlever la protection copie pour le moment pour travailler dessus

donc tu verras en bas a gauche une liste de donnée ( CP J NS .... )

J , N , JS , NS et JD etant des jours de travail

CP REC .... repos

j'aimerais une macro qui :

si je mets tel lettre ' CP ou REC ' et que dans la ligne 2 de la colonne ou cette lettre se trouve il y a samedi ou dimanche, alors je mets erreur comme pour le dépassement des jours hebdo mais en disant par exemple " PAS DE CP LE SAMEDI OU DIMANCHE " ....

en gros , impossible de poser un CP un samedi , dimanche ....

par la suite j'essaierai de faire de moi meme la meme chose mais avec les fériés

bon en attendant je vais essayer ton nouveau code

merci merci bonne journée :)

75pour-envoie.xlsm (111.99 Ko)

Sans retour j'insiste :

Plutôt qu'une alerte on peut envisager de boucler sur la plage modifiée et vider ces cellules. Ce qui permet de faire plusieurs semaines en copiant.

eric

coucou , dans mon fichier , lorsque j'ai mis un 5 elements dans une semaine civile , il me mets erreur dépassement , j'appuie sur OK et ma derniere modification est enlevé ...

If MsgBox(msg, vbOKOnly + vbExclamation, msg) = vbOK Then

Application.EnableEvents = False

Application.Undo

c'est de çà que tu veux parler car je ne comprends pas ....

merci

Non, je te parle de ta dernière demande pour les congés.

Tu mets CP le 01/07 et le gars part en vacances 1 mois. Tu tires vers la droite sur 30 jours.

A quoi ça sert d'alerter 8 ou 10 fois puisqu'on sait qu'il n'en faut pas le samedi et le dimanche ?

Autant accepter, nettoyer les WE et ne pas être obligé de faire semaine par semaine. Non ?

eric

oui ca peut etre une idée .... la ca dépasse mes petite compétences en vba ...

par contre j'ai désactiver le systeme de glissement copier en tirant aussi ainsi que je copier coller ....

moi ce que je souhaiterais c'est un code qui :

si dans une plage A1:EN56(par exemple ) , j'ai tel valeur dans une case , et que x ligne au dessus de cette case j'ai Y ou Y1 alors ==> msgbox ... sinon tout va bien

je vois un peu pres comment faire mais j'arrive pas ....

apres ce code je peux l'adapter pour beaucoup d'autre chose et il n'est pas trop compliqué pour un novice comme moi ...

merci merci bonne nuit

Bonjour,

J'ai l'impression qu'on ne parle pas la même langue.

Ce que tu demandes là n'a rien à voir avec ce dont on parlait juste avant, que tu sembles complètement oublier.

Je m'arrête donc là.

Bonne continuation.

eric

Rechercher des sujets similaires à "creer pop alerte beaucoup conditions"