XL 2013 Dans calendrier automatique : interdire l'écriture dans plusieurs cellules selon les termes d'une autre cellule

carom

XLDnaute Nouveau
Bonjour tout le monde,

J'ai réussi à créer un calendrier automatique pour noter les absences des employés (en fichier joint). Je me suis aidée de tutos etc mais je n'ai pas réussi à trouver ma réponse sur les forums alors j'espère que vous pourrez m'aider.
Je souhaiterais que pour chaque mois et selon l'année sélectionnée, l'écriture soit bloquée dans certaines lignes selon certains jours.

Par exemple pour le mois de janvier de l'année 2019 :
- quand dans la colonne des dates (B) on trouve un samedi ou un dimanche, je souhaiterais bloquer l'écriture dans les cellules adjacentes sur toute la ligne pour chaque employé. Donc par exemple pour B10, j'aimerais qu'il soit impossible d'écrire de C10 à I10. Je sais que je pourrais verrouiller ces cellules manuellement mais en fait la ligne ne sera plus la même si je change d'année et que je passe en 2020. Est-il possible de faire quelque chose comme ça ?

- je souhaiterais également faire la même chose lorsque la date de la colonne est vide : par exemple pour février 2019 les cellules K34 à K36 sont vides et je souhaiterais qu'il soit impossible d'écrire dans les lignes correspondantes pour chaque employé.

- et si possible faire encore cela pour les jours fériés (ils s'affichent en vert) que j'ai calculé moi même dans la feuille "Jours fériés"

Le but de tout cela c'est que si par exemple un employé est en vacances du 11 janvier au 25 janvier, il est juste à écrire "V" au 11 janvier puis à étirer la colonne jusqu'au 25, et que le "V" ne s'inscrive pas dans les cellules correspondants aux jours fériés et we. Tout cela pour avoir un total des jours de congés ne prenant en compte que les jours travaillés et que l'employé n'est pas manuellement à supprimer chaque "V" ds les cellules we et jours fériés...

Voilà j'espère que mes explications sont assez compréhensibles !
Merci pour votre aide.

Caro
 

Pièces jointes

  • Calendrier absences Modèle 3.xlsx
    40.9 KB · Affichages: 19

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonsoir @carom, bienvenue sur XLD :),

Un essai en VBA avec une procédure évènementielle dans le module de code de la feuille "Calendrier".
J'ai créé deux noms: DataPlanning qui fait référence aux cellules du planning et Ferie2019 qui fait référence aux jours fériés de 2019.

DataPlanning:
=Calendrier!$C$6:$I$36;Calendrier!$L$6:$R$36;Calendrier!$U$6:$AA$36;Calendrier!$AD$6:$AJ$36;Calendrier!$C$42:$I$72;Calendrier!$L$42:$R$72;Calendrier!$U$42:$AA$72;Calendrier!$AD$42:$AJ$71;Calendrier!$C$78:$I$108;Calendrier!$L$78:$R$108
Ferie2019:
='Jours fériés'!$B$3:$B$17

Le code:
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim xrg, xcell, col&, jourSem&, laDate
Dim rgFerie As Range, estFerie As Boolean

  Application.ScreenUpdating = False
  Set xrg = Intersect(Range("DataPlanning"), Target)
  If xrg Is Nothing Then Exit Sub
  Application.EnableEvents = False
  For Each xcell In xrg
    col = 2 + 9 * ((xcell.Column - 2) \ 9)
    laDate = Cells(xcell.Row, col)
    If IsDate(laDate) Then jourSem = Weekday(Cells(xcell.Row, col), vbMonday)
    Set rgFerie = Sheets("Jours fériés").Range("Ferie2019").Offset(0, Range("f1") - 2019)
    estFerie = Application.WorksheetFunction.CountIf(rgFerie, laDate) > 0
    If laDate = "" Or jourSem >= 6 Or estFerie Then xcell.ClearContents
  Next xcell
  Application.EnableEvents = True
End Sub
 

Pièces jointes

  • carom- Calendrier absences Modèle 3- v1a.xlsm
    51.4 KB · Affichages: 20
Dernière édition:

carom

XLDnaute Nouveau
Olala mais c'est exactement ce que je voulais ! 10000 fois merci pour le temps que tu y as consacré, c'est juste parfait !!! :):):)
Je viens de passer 5 mn à créer des absences pour tout le monde jusqu'en 2032 ahahah.
Bref encore merci je suis trop contente ! :)
Bonne fin de dimanche
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Re @carom,

Pour l'utilisation de ton planning, il serait sans doute utile (si ce n'est pas déjà fait) d'apprendre aux utilisateurs la validation par la combinaison des deux touches Ctrl+Entrée. C'est bien plus rapide que le copier/tirer. Tous ceux à qui je l'ai montré l'utilise désormais. Cela prend moins de 5 minutes pour faire la démo à l'utilisateur.
  • faire une sélection de cellules (plage contiguë ou non)
  • tapez le texte (en l'occurence pour ton exemple un "M", "P" ou "V")
  • validez par Ctrl+Entrée au lieu de la seule touche Entrée
  • => le texte a été mis dans chaque cellule de la plage sélectionnée
 

carom

XLDnaute Nouveau
Juste un petit truc, il y a une mini erreur dans le DataPlanning qui du coup ne prend pas le 31 août en compte, mais je n'arrive pas à y accéder pour faire la modif. Est-ce que tu peux me dire comment faire stp ?
Sinon sans l'erreur ça doit donner ça :
DataPlanning:
=Calendrier!$C$6:$I$36,Calendrier!$L$6:$R$36,Calendrier!$U$6:$AA$36,Calendrier!$AD$6:$AJ$36,Calendrier!$C$42:$I$72,Calendrier!$L$42:$R$72,Calendrier!$U$42:$AA$72,Calendrier!$AD$42:$AJ$72,Calendrier!$C$78:$I$108,Calendrier!$L$78:$R$108,Calendrier!$U$78:$AA$108,Calendrier!$AD$78:$AJ$108
Merci ! :)
 

job75

XLDnaute Barbatruc
Bonjour carom, mapomme,

Une autre manière de faire :
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
Set Target = Intersect(Target, UsedRange)
If Target Is Nothing Then Exit Sub
Dim fer As Range, col%, c As Range
Set fer = Sheets("Jours fériés").[3:13]
Application.EnableEvents = False
On Error Resume Next
For Each Target In Target
    If Not Target.HasFormula Then
        For col = Target.Column - 1 To 1 Step -1
            Set c = Cells(Target.Row, col)
            If c.HasFormula Then
                If Weekday(c, 2) > 5 Or Application.CountIf(fer, c) Then Target = ""
                Exit For
            End If
        Next col
    End If
Next Target
Application.EnableEvents = True
End Sub
A+
 

Pièces jointes

  • Calendrier absences Modèle 3(1).xlsm
    58.1 KB · Affichages: 8
Dernière édition:

mapomme

XLDnaute Barbatruc
Supporter XLD
RE @carom ,

Juste un petit truc, il y a une mini erreur dans le DataPlanning qui du coup ne prend pas le 31 août en compte, mais je n'arrive pas à y accéder pour faire la modif. Est-ce que tu peux me dire comment faire stp ?

Effectivement, dans ma définition de DataPlanning, j'ai oublié le 31 août :mad:. Mille excuses o_O
Pour le corriger (si tu ne l'as pas déjà fait :rolleyes:)
  • aller dans le menu Formule \ Gestionnaire de nom
  • sélectioner le nom DataPlanning
  • et remplacer sa définition par la tienne tout simplement
Le fichier joint comporte la correction.

edit : bonne nuit @job75 ;)
 

Pièces jointes

  • carom- Calendrier absences Modèle 3- v1b.xlsm
    51.4 KB · Affichages: 11
Dernière édition:

job75

XLDnaute Barbatruc
2 mots sur ma macro du post #7 :

- le calendrier peut être positionné n'importe où sur la feuille

- en contrepartie on peut entrer des formules dans les cellules "interdites".

Si l'on veut interdire l'entrée de formules il faut fixer les colonnes, voyez ce fichier (2) avec :
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
Set Target = Intersect(Target, [C:J,L:S,U:AB,AD:AJ], UsedRange)
If Target Is Nothing Then Exit Sub
Dim fer As Range, col%, c As Range
Set fer = Sheets("Jours fériés").[3:13]
Application.EnableEvents = False
On Error Resume Next
For Each Target In Target
    For col = Target.Column - 1 To 1 Step -1
        Set c = Cells(Target.Row, col)
        If c.HasFormula Then
            If Weekday(c, 2) > 5 Or Application.CountIf(fer, c) Then Target = ""
            Exit For
        End If
    Next col
Next Target
Application.EnableEvents = True
End Sub
 

Pièces jointes

  • Calendrier absences Modèle 3(2).xlsm
    57.9 KB · Affichages: 19

carom

XLDnaute Nouveau
Bonjour @mapomme @job75
Je reviens vers vous après un petit moment mais voulant me servir du calendrier pour remplir les congés 2020 je me suis rendue compte qu'en fait il fallait compter les samedi et que donc pour les w-e l'écriture ne devait être bloquée que dans les lignes en face des dimanches... Alors j'ai bien essayé de reprendre votre travail et de faire ça toute seule, mais je n'y arrive pas trop du tout ^^'. Si vous pouviez me donner un petit coup de main ou m'expliquer comment faire ça serait super.
Merci beaucoup !
 

job75

XLDnaute Barbatruc
Bonjour carom, mapomme,

Il vient tout de suite à l'esprit de remplacer aux posts #7 ou #9 :
VB:
If Weekday(c, 2) > 5 Or Application.CountIf(fer, c) Then Target = ""
par :
VB:
If Weekday(c) = 1 Or Application.CountIf(fer, c) Then Target = ""
A+
 

Discussions similaires