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
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 SubJ'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
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