XL 2016 Protéger Plage avec condition

Amigo

XLDnaute Occasionnel
Bonjour à tous
J'ai un planning qui s'ouvre à la date du jour.
Je souhaite protéger la zone avec un mot de passe dès le début jusqu'à aujourd'hui -1.
J'ai essayé de bidouiller un code en fouillant sur le site mais pas réussi (voir ci-joint) vu mon niveau moins d'un débutant en VBA. Il protège toute la feuille au lieu de la plage.
Merci par avance pour votre aide
Cordialement

VB:
Dim témoin As Boolean

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim MaxLig As Long, MaxCol As Integer, Lig As Long, Col As Long, C As Integer, coul As Long, champ As Range
Set f1 = Sheets("Année")
    MaxLig = f1.Range("A9").End(xlDown).Row
    MaxCol = f1.Cells(8, Columns.Count).End(xlToLeft).Column
        For Col = 3 To MaxCol
            If f1.Cells(8, Col).Value = Date Then
               Set champ = f1.Cells(9, 3).Resize(MaxLig, Col - 1)
            Exit For
                    If Not Intersect(Target, champ) Is Nothing And Not témoin Then
                       témoin = True
                       ActiveSheet.Unprotect Password:=Monpass
                       Target.Locked = True
                       ActiveSheet.Protect Password:=Monpass
                       témoin = False
                    End If
            End If
        Next Col
End Sub
 

Pièces jointes

  • Planning+fonction_compte_couleur.xlsm
    58 KB · Affichages: 7
Dernière édition:

TooFatBoy

XLDnaute Barbatruc
Bonjour,

Une proposition :
VB:
Private Sub Worksheet_Activate()
'
Dim MaxLig As Long
Dim MaxCol As Integer, MaColonne As Integer

    ActiveSheet.Protect UserInterfaceOnly:=True, DrawingObjects:=True, Contents:=True, Scenarios:=True, Password:=Monpass

    Set f1 = Sheets("Année")
    MaxLig = f1.Range("A9").End(xlDown).Row
    MaxCol = f1.Cells(8, Columns.Count).End(xlToLeft).Column

    On Error GoTo Fin
    MaColonne = Application.Match(CDbl(Date - 1), f1.Range(Cells(8, 3), Cells(8, MaxCol)), 0) + 2
    f1.Range(Cells(9, 3), Cells(MaxLig, MaxCol)).Locked = False
    If MaColonne > 3 Then f1.Range(Cells(9, 3), Cells(MaxLig, MaColonne - 1)).Locked = True

Fin:

End Sub
 

Amigo

XLDnaute Occasionnel
Bonjour TooFatBoy et le forum
Les premiers tests sont très concluants.
Je me suis permis de modifier la ligne de code ci-après en supprimant le (-1) pour bloquer les cellules de aujourd'hui -1 étant donné que la recherche se fait à (Date-1).
Je continuerai les tests sur mon fichier initial au travail.
Encore merci
Cordialement
VB:
MaColonne > 3 Then f1.Range(Cells(9, 3), Cells(MaxLig, MaColonne - 1)).Locked = True
 

Staple1600

XLDnaute Barbatruc
Bonjour @Amigo, @TooFatBoy ,le fil

@Amigo
Une autre solution (sans VBA)
Mais je ne sais si elle est disponible sur Excel 2016
En passant par Révision
Tu sélectionnes la plage de cellules que toi seul peut modifier
Et le mot de passe défini ne s'adresse qu'à la plage définie.
Protection.png
 

TooFatBoy

XLDnaute Barbatruc
Je me suis permis de modifier la ligne de code ci-après en supprimant le (-1) pour bloquer les cellules de aujourd'hui -1 étant donné que la recherche se fait à (Date-1).
Au temps pour moi : j'avais mal compris ton histoire de "-1" dans ta question, alors que maintenant après une bonne nuit de sommeil je vois bien que c'était parfaitement clair. Désolé.

En fait dans ma macro j'aurais dû chercher "Date" et non "Date-1".
 

Staple1600

XLDnaute Barbatruc
Re,

@Amigo
Merci pour ton retour
Ma proposition n'est qu'une alternative possible
Elle a le mérite de potentiellement intéresser le demandeur initiateur du fil et les lecteurs de celui-ci.
Sache tout de même, que cette protection, comme celle en VBA est illusoire.
Et pour répondre à ta question, je ne sais si on peut utiliser une plage dynamique.
A tester pour confirmer/infirmer.

EDITION:
Apparemment, ce n'est pas possible.
(même en mettant en référence un tableau structuré)

Donc le VBA est à utiliser pour cette condition de date.

Il faut d'une de moins d'une seconde à une minute et 23 secondes (*) pour outrepasser la protection Excel.
(*) çà c'est les nuits sans lune ;)
 
Dernière édition:

TooFatBoy

XLDnaute Barbatruc
Ma proposition n'est qu'une alternative possible
Elle a le mérite de potentiellement intéresser le demandeur initiateur du fil et les lecteurs de celui-ci.
Et toute solution est bonne à prendre. 👍


je ne sais si on peut utiliser une plage dynamique.
A tester pour confirmer/infirmer.

EDITION:
Apparemment, ce n'est pas possible.
(même en mettant en référence un tableau structuré)
Ce n'est pas possible non plus en utilisant une formule dans la définition du Nom d'une plage nommée ?
 

Staple1600

XLDnaute Barbatruc
Re

@Amigo
J'ai relu le 1er message
Je souhaite protéger la zone avec un mot de passe
Cela sous-entend que toi seul connait le mot de passe ?
Et que tu es le seul autorisé à modifier ce planning ?
Dans ce cas, si ce planning est utilisé chaque année, on connait plus ou moins la plage de cellules utilisée pour construire celui-ci
Si tel est le cas, la méthode Autoriser la modification des plages suffit non ?
Il suffit de définir plusieurs pages que toi seul peut modifier
Ou de prendre comme plage l'entièreté du planning.
Car au final si c'est toi qui définit le mot de passe, tu ne vas pas le diffuser à des tiers, non ?
 

Amigo

XLDnaute Occasionnel
Re Bonjour
@Staple1600
- Effectivement c'est moi seul qui connait le mot de passe.
- Par contre, plusieurs personnes pourraient intervenir et modifier seulement le jour J et ils ne sont pas autorisés à modifier les jours précédents.
-Votre solution me sera très utile pour un autre fichier que la zone est bien définie et limitée.
Cordialement
 

TooFatBoy

XLDnaute Barbatruc
Un Grand Merci
Désolé, la macro que je venais de poster ne correspondait pas exactement à ce que je voulais te proposer.

Celle-ci semble faire ce que je voulais te proposer (à tester) :
VB:
Private Sub Worksheet_Activate()
'
Dim MaxLig As Long
Dim MaxCol As Integer, MaColonne As Integer

    ActiveSheet.Protect UserInterfaceOnly:=True, DrawingObjects:=True, Contents:=True, Scenarios:=True, Password:=Monpass

    Set f1 = Sheets("Année")
    MaxLig = f1.Range("A9").End(xlDown).Row
    MaxCol = f1.Cells(8, Columns.Count).End(xlToLeft).Column

    On Error GoTo PasTrouve
    MaColonne = Application.Match(CDbl(Date), f1.Range(Cells(8, 3), Cells(8, MaxCol)), 0) + 2

    f1.Range(Cells(9, 3), Cells(MaxLig, MaxCol)).Locked = False
    If MaColonne > 3 Then f1.Range(Cells(9, 3), Cells(MaxLig, MaColonne - 1)).Locked = True
    GoTo Fin

PasTrouve:
    f1.Range(Cells(9, 3), Cells(MaxLig, MaxCol)).Locked = (f1.Range("C8") < Date)

Fin:

End Sub


Théoriquement dans ma proposition il devrait se passer ceci :

- Si la date d'aujourd'hui est trouvée : on déprotège tout le tableau, puis on protège tout ce qui est inférieur à aujourd'hui.

- Si la date d'aujourd'hui n'est pas trouvée : tout le tableau est protégé, ou déprotégé, selon si la première date du tableau (cellule C8) est inférieure, ou non, à la date d'aujourd'hui.
 
Dernière édition:

Discussions similaires

Réponses
13
Affichages
355

Statistiques des forums

Discussions
312 935
Messages
2 093 740
Membres
105 805
dernier inscrit
belgacem.nahali