[Résolu] Verrouiller à une date donnée

HelloDy

XLDnaute Junior
Bonjour tout le monde,

J'ai créé un classeur (ci-joint) avec 12 onglets (de septembre à août).
A l'intérieur de ces onglets certaines plages sont verrouillées et protégées en modification par mot de passe et les autres sont modifiables. Pour une meilleure compréhension j'ai colorié en jaune les cellules modifiables sur les 4 premiers onglets.

J'aimerais qu'une fois un mois terminé, toutes les cellules de l'onglet concerné soient protégées et donc non-modifiables (ex : au 1er octobre, que l'onglet "SEPT" soit entièrement non-modifiable pour un utilisateur n'ayant pas le mot de passe).

Si quelqu'un peut m'aider avec une petite macro ce serait super sympa ! ;)
Et si la macro pouvait être annotée avec des explications ce serait encore plus génial !

Merci d'avance !

Elo
 

Pièces jointes

  • Classeur HelloDY.xlsm
    500.2 KB · Affichages: 29

Robert

XLDnaute Barbatruc
Repose en paix
Bonjour Elo, bonjour le forum,

Si ton classeur va de Septembre 2018 à août 2019, le code ci-dessous (à placer dans le composant ThisWorkbook), agira à l'ouverture du fichier :

VB:
Private Sub Workbook_Open()
Dim TM As Variant 'déclare la variable TM (Tableau ds Mois)
Dim D As Date 'déclare la variable D (Date)
Dim I As Byte 'déclare la variable I (Incrément)
Dim M As Byte 'déclare la variable M (Mois)
Dim J As Byte 'déclare la variable J (incrément)

'définit le tableau des mois TM (c'eut été plus malin d'utiliser le même format pour tous, 4 premières lettres
'ou mois entier, ou numero !...)
TM = Array("SEPT", "OCT", "NOV", "DEC", "JAN", "FEV", "MAR", "AVRIL", "MAI", "JUIN", "JUIL", "AOÛT")
For I = 1 To Sheets.Count 'boucle 1 : sur tous les onglet du classeur
    For J = 0 To UBound(TM) 'boucle 2 : sur tous les mois du tableau TM
        M = I + 8 'définit le mois M (vu que l'on ne commence pas en janvier)
        D = DateSerial(2018, M + 1, 0) 'définit la date D (dernier jour du mois de l'onglet)
        If Date > D Then 'condition : Si la date du jour est supérieure à D
            Sheets(I).Cells.Locked = True 'protège toutes les cellules de l'onglet de la boucle 1
            O.Protect "Toto" 'protège l'onglet avec le mot de passe "Toto" (à adapter)
            Exit For 'sort de la boucle 2
        End If 'fin de la condition
    Next J 'prochain mois de la boucle 2
Next I 'prochain onglet de la boucle 1
End Sub

P.S. pour voir l'effet il faut modifier la date de ton ordinateur au, au moins, 01/10/2018 et penser à la remettre ensuite !...
 

HelloDy

XLDnaute Junior
Merci tout plein Robert :)

Mais ça ne marche pas :(

J'ai placé la macro dans ThisWorkbook, sauvegardé et fermé mon fichier. J'ai changé la date de l'ordi au 7 octobre 2018, et quand j'ouvre le fichier j'ai un message d'erreur :
upload_2018-7-7_17-59-31.png


La ligne suivante est surlignée :

Sheets(I).Cells.Locked = True 'protège toutes les cellules de l'onglet de la boucle 1

J'ai fait quelque chose de travers ? :confused:

Si ça peut aider y'a moyen de modifier les noms des onglets en mettant les mois entiers ou les 4 premières lettres, ça me pose pas de problème.
 

Staple1600

XLDnaute Barbatruc
Bonjour le fil, le forum

@HelloDy
J'aimerais qu'une fois un mois terminé, toutes les cellules de l'onglet concerné soient protégées et donc non-modifiables (ex : au 1er octobre, que l'onglet "SEPT" soit entièrement non-modifiable pour un utilisateur n'ayant pas le mot de passe).
[Pour infos]
Avec ou sans mot de passe, la classeur restera modifiable.
(C'est inhérent à la protection illusoire d'Excel, il existe moult de façons de passer outre la protection des feuilles d'un classeur, ou d'un projet VBA)
Il est bon de le savoir avant d'écrire du code VBA de "protection" qui sera caduque en moins de 27 secondes ;)
[/Pour infos]

EDITION1: Houps, j'avions point vue passer Robert
Bonsoir Robert

EDITION2: Bonsoir job75
 

Robert

XLDnaute Barbatruc
Repose en paix
Re,

Il y avait une erreur dans mon code et je pense aussi que l'onglet doit être protégé. Il faudrait alors déprotéger, changer et reprotéger...

VB:
Private Sub Workbook_Open()
Dim TM As Variant 'déclare la variable TM (Tableau ds Mois)
Dim D As Date 'déclare la variable D (Date)
Dim I As Byte 'déclare la variable I (Incrément)
Dim M As Byte 'déclare la variable M (Mois)
Dim J As Byte 'déclare la variable J (incrément)

'définit le tableau des mois TM (c'eut été plus malin d'utiliser le même format pour tous, 4 premières lettres
'ou mois entier, ou numero !...)
TM = Array("SEPT", "OCT", "NOV", "DEC", "JAN", "FEV", "MAR", "AVRIL", "MAI", "JUIN", "JUIL", "AOÛT")
For I = 1 To Sheets.Count 'boucle 1 : sur tous les onglet du classeur
    For J = 0 To UBound(TM) 'boucle 2 : sur tous les mois du tableau TM
        M = I + 8 'définit le mois M (vu que l'on ne commence pas en janvier)
        D = DateSerial(2018, M + 1, 0) 'définit la date D (dernier jour du mois de l'onglet)
        If Date > D Then 'condition : Si la date du jour est supérieure à D
            Sheets(I).Unprotect "Toto"
            Sheets(I).Cells.Locked = True 'protège toutes les cellules de l'onglet de la boucle 1
            Sheets(I).Protect "Toto" 'protège l'onglet avec le mot de passe "Toto" (à adapter)
            Exit For 'sort de la boucle 2
        End If 'fin de la condition
    Next J 'prochain mois de la boucle 2
Next I 'prochain onglet de la boucle 1
End Sub
 

job75

XLDnaute Barbatruc
Bonjour HelloDy, Robert, JM,

Voici une autre méthode qui utilise le mois se trouvant en cellule A1 :
Code:
Private Sub Workbook_Open()
Dim datref As Date, w As Worksheet, dat As String
datref = Date
datref = CDate("1/10/18") 'uniquement pour tester, autrement supprimer cette ligne
For Each w In Worksheets
    dat = Split(w.Cells(1), ":")(1) 'le mois en A1
    dat = "1 " & Replace(Replace(dat, "FE", "Fé"), "DE", "Dé")
    w.Protect "Toto", UserInterfaceOnly:=True 'mot de passe à adapter
    If IsDate(dat) Then If CDate(dat) < datref Then w.Cells.Locked = True
Next
End Sub
Adapter bien sûr le mot de passe.

A+
 
Dernière édition:

job75

XLDnaute Barbatruc
Re,

Concernant les remarques - répétées moult fois, c'est fatigant - de JM sur les protections Excel :

- je n'ai pas sous la main (car ça ne m'intéresse pas) les outils pour "craquer" un mot de passe

- et pourtant je ne suis pas un débutant

- donc pour moi les protections sont utiles et efficaces.

A+
 

HelloDy

XLDnaute Junior
Merci pour vos réponses Robert, Staple1600 et job75 :)

Je n'ai pas pu tester vos solutions parce que c'est ENFIN le weeeeeek-end !!!! Je testerai tout ça mardi.

En ce qui concerne la "facilité" de passer outre ces protections, ce fichier sera utilisé par des personnes encore moins douées que moi (oui oui y'en a !) qui utilisent tellement mal excel que je suis obligée de tout protéger sinon ils font n'importe quoi :rolleyes: Ah mes chers collègues... ^^

Bisous à tous et encore merci, je viendrai râler mardi si y'a encore des soucis ;)
 

Staple1600

XLDnaute Barbatruc
Re

En ce qui concerne la "facilité" de passer outre ces protections, ce fichier sera utilisé par des personnes encore moins douées que moi (oui oui y'en a !) qui utilisent tellement mal excel que je suis obligée de tout protéger sinon ils font n'importe quoi :rolleyes: Ah mes chers collègues... ^^
;)
C'est pas en Excel qu'il faut être doué, juste savoir lire et utiliser un moteur de recherche.
Il y a bien quelqu'un parmi tes collègues qui correspond à ces deux critères ;), non ?

[avis personnel]
Plutôt que la coercition, je choisirai la formation.
Expliquer aux collègues comment fonctionne le classeur, ça permet de moins travailler ;)
Bah oui, faut bien prendre du temps pour bien expliquer.
Donc ça en fait des réunions de formation ;)
[/avis personnel]
 

Discussions similaires

Statistiques des forums

Discussions
312 330
Messages
2 087 335
Membres
103 521
dernier inscrit
Excellover 21