Microsoft 365 Verrouiller lignes en fonction d'une DATE

Fransez

XLDnaute Nouveau
Bonjour à tous,

Avez-vous une solution pour le problème suivant svp? 👇

L'idée serait de verrouiller la saisie des lignes entières de la colonne G à H et de la colonne J à L si la date en H1 est supérieure aux dates de la colonne C. Les autres colonnes sont déjà verrouillées.

Le fichier est verrouillé avec le mot de passe "0000".

Merci d'avance!
 

Pièces jointes

  • Grille horaire.xlsm
    88.3 KB · Affichages: 6
Solution
C
Re,

Je pensais que mon code était assez explicite 🤔

Il est vrai que je ne l'ai testé que dans les cellules du tableau en question
Il suffit d'ajouter un test pour la ligne modifiée
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
  ' Vérifier si saisi en dehors du tableau
  If Target.Row < 5 then Exit Sub
  ' Vérifier si saisi dans les cellules G à H et J à L
  If Not Intersect(Range("G:H,J:L"), Target) Is Nothing Then
  ' Etc...'
C

Compte Supprimé 979

Guest
Bonjour Fransez

Une possibilité avec l'évènement "Change" dans la feuille
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
  ' Vérifier si saisi dans le tableau
  If Target.Row < 5 then Exit Sub
  ' Vérifier si saisi dans les cellules G à H et J à L
  If Not Intersect(Range("G:H,J:L"), Target) Is Nothing Then
    ' Vérifier si la date est inférieure ou non à H1
    If Range("C" & Target.Row) < Range("H1") Then
      Application.EnableEvents = False
      Application.Undo
      Application.EnableEvents = True
      MsgBox "Vous ne pouvez plus rien saisir sur la ligne du : " & vbCr _
        & Format(Range("C" & Target.Row), "dddd d mmmm yyyy"), vbCritical, "OUPS..."
    End If
  End If
End Sub

Sinon à l'activation d'une feuille on peut appeler ce genre de code
VB:
Sub ProtectionLigne()
  Dim dLig As Long, Lig As Long
  With ActiveSheet
    ' Supprimer la protection de la feuille
    .Unprotect Password:="0000"
    ' Dernière ligne
    dLig = .Range("C" & Rows.Count).End(xlUp).Row
    ' Parcourir chaque ligne
    For Lig = 5 To dLig
      ' Si la date est inférieure
      If .Range("C" & Lig) < .Range("H1") Then
        ' On protège les cellules
        .Range("G" & Lig & ":H" & Lig & ",J" & Lig & ":L" & Lig).Locked = True
      Else
        Exit For
      End If
    Next Lig
    ' On reprotège la feuille
    .Protect Password:="0000"
  End With
End Sub

@+
 
Dernière modification par un modérateur:

Fransez

XLDnaute Nouveau
Bonjour Fransez

Une possibilité avec l'évènement "Change" dans la feuille
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
  ' Vérifier si saisi dans les cellules G à H et J à L
  If Not Intersect(Range("G:H,J:L"), Target) Is Nothing Then
    ' Vérifier si la date est inférieure ou non à H1
    If Range("C" & Target.Row) < Range("H1") Then
      Application.EnableEvents = False
      Application.Undo
      Application.EnableEvents = True
      MsgBox "Vous ne pouvez plus rien saisir sur la ligne du : " & vbCr _
        & Format(Range("C" & Target.Row), "dddd d mmmm yyyy"), vbCritical, "OUPS..."
    End If
  End If
End Sub

Sinon à l'activation d'une feuille on peut appeler ce genre de code
VB:
Sub ProtectionLigne()
  Dim dLig As Long, Lig As Long
  With ActiveSheet
    ' Supprimer la protection de la feuille
    .Unprotect Password:="0000"
    ' Dernière ligne
    dLig = .Range("C" & Rows.Count).End(xlUp).Row
    ' Parcourir chaque ligne
    For Lig = 5 To dLig
      ' Si la date est inférieure
      If .Range("C" & Lig) < .Range("H1") Then
        ' On protège les cellules
        .Range("G" & Lig & ":H" & Lig & ",J" & Lig & ":L" & Lig).Locked = True
      Else
        Exit For
      End If
    Next Lig
    ' On reprotège la feuille
    .Protect Password:="0000"
  End With
End Sub

@+
Merci BrunoM45 pour ton retour malheureusement je n'arrive pas à faire fonctionner ton code vb. Je ne peux plus modifier ma date en H1 une fois le code appliqué. As-tu une résolution? Merci
 

Lolote83

XLDnaute Barbatruc
Re bonjour,
Le code de BrunoM45 reprotège le classeur une fois la macro exécutée.
Vu que ta cellule H1 est aussi protégée, tu ne peux la modifier.
Solution, faire en sorte que ta cellule H1 ne soit pas protégée en décochant la case Verrouillée
1633010780070.png

@+ Lolote83
 

Fransez

XLDnaute Nouveau
Re bonjour,
Les doublons occasionnent malheureusement des réponses de droite et de gauche.
Notre ami BRUNOM45 (que je salut au passage) à répondu sur ce fil alors qu'une première réponse (répondant je pense à ta première demande a été faite sur ce fil)
Lien = https://www.excel-downloads.com/thr...en-fonction-dune-date.20060730/#post-20458109
Cordialement
@+ Lolote83
La solution que tu as proposé @Lolote83 permet bien de bloquer la saisie et je t'en remercie mais on peut supprimer les heures précédemment saisies. L'idée étant que le responsable valide les horaires saisies en les bloquant (saisie/suppression).
La réponse de @BrunoM45 se rapproche plus du but. Le code VB fonctionne pour bloquer la saisie et la suppression. Le problème est que je ne peux plus modifier la date de validation en H1 une fois le code appliqué.
Avez-vous une solution?
Merci
 

Fransez

XLDnaute Nouveau
Re bonjour,
Le code de BrunoM45 reprotège le classeur une fois la macro exécutée.
Vu que ta cellule H1 est aussi protégée, tu ne peux la modifier.
Solution, faire en sorte que ta cellule H1 ne soit pas protégée en décochant la case Verrouillée
Regarde la pièce jointe 1116956
@+ Lolote83
Bien vu @Lolote83! J'ai appliqué une "autorisation de modification des plages" en H1 et si le responsable veut la sélectionner pour la modifier j'ai vu que le verrouillage comme solution. Peut-être qu'il y a plus simple?
1633011050029.png
 

Fransez

XLDnaute Nouveau
Re bonjour,
Le code de BrunoM45 reprotège le classeur une fois la macro exécutée.
Vu que ta cellule H1 est aussi protégée, tu ne peux la modifier.
Solution, faire en sorte que ta cellule H1 ne soit pas protégée en décochant la case Verrouillée
Regarde la pièce jointe 1116956
@+ Lolote83
J'ai essayé cette solution mais même sans verrouiller H1 je ne peux rien y saisir
 

Lolote83

XLDnaute Barbatruc
Re bonjour,
Je ne comprends pas.
Si ta cellule H1 n'est pas verrouillée (voir post#5), une fois la feuille protégée, tu devrais pouvoir y accéder sans aucun problème.
Voir fichier joint
Aucun MDP sur le classeur joint pour protection/déprotection
@+ Lolote83
 

Pièces jointes

  • Copie de FRANSEZ - Protection cellule.xlsx
    10.8 KB · Affichages: 1

Fransez

XLDnaute Nouveau
Re bonjour,
Je ne comprends pas.
Si ta cellule H1 n'est pas verrouillée (voir post#5), une fois la feuille protégée, tu devrais pouvoir y accéder sans aucun problème.
Voir fichier joint
Aucun MDP sur le classeur joint pour protection/déprotection
@+ Lolote83
Merci pour ta réponse @Lolote83
J'ai replacé la date en I1 et le code vb fonctionne alors que la cellule est verrouillée
Pour l'application d'une "autorisation de modification des plages" en I1, est-ce qu'il est obligatoire de fermer le fichier pour que cette option fonctionne de nouveau?
 

Pièces jointes

  • Grille horaire.xlsm
    266.3 KB · Affichages: 1
C

Compte Supprimé 979

Guest
Re,

Je pensais que mon code était assez explicite 🤔

Il est vrai que je ne l'ai testé que dans les cellules du tableau en question
Il suffit d'ajouter un test pour la ligne modifiée
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
  ' Vérifier si saisi en dehors du tableau
  If Target.Row < 5 then Exit Sub
  ' Vérifier si saisi dans les cellules G à H et J à L
  If Not Intersect(Range("G:H,J:L"), Target) Is Nothing Then
  ' Etc...'
 
Dernière modification par un modérateur:

Fransez

XLDnaute Nouveau
Re,

Je pensais que mon code était assez explicite 🤔

Il est vrai que je ne l'ai testé que dans les cellules du tableau en question
Il suffit d'ajouter un test pour la ligne modifiée
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
  ' Vérifier si saisi en dehors du tableau
  If Target.Row < 5 then Exit Sub
  ' Vérifier si saisi dans les cellules G à H et J à L
  If Not Intersect(Range("G:H,J:L"), Target) Is Nothing Then
  ' Etc...'
Merci @BrunoM45 option complémentaire parfaite!
 

Discussions similaires