Excel Verrouiller un onglet en fonction de la date

Bonjour le forum,

Je vous propose un sujet qui me dépasse...

Soit un classeur d'une dizaine de feuilles.

Chaque feuille représente une semaine (S01, S02, etc.)

Est-il possible de verrouiller S01 quand le calendrier passe à S02 et ainsi de suite?

D'avance merci pour vos éventuelles réponses et je précise que je suis très débutant sur VBA.

Bonjour,

Une piste mais comme tu dis n'avoir que 10 feuilles il va te falloir adapter. Je suis parti du principe que les feuilles se nomment "S" et le numéro de la semaine soit pour ce jour S38, semaine prochaine S39. A mettre dans le module du classeur et adapter le mot de passe ici, "ricolabasse" :

Private Sub Workbook_SheetActivate(ByVal Sh As Object)

    Dim NumSem As Integer

    NumSem = Format(Date, "ww", vbMonday, vbFirstFourDays)

    If NumSem <= CInt(Right(Sh.Name, 2)) Then
        Sh.Unprotect "ricolabasse"
    Else
        Sh.Protect "ricolabasse"
    End If

End Sub

Pour le module du classeur, depuis Excel Alt+F11, dans la petite fenêtre en haut à gauche, chercher ThisWorkbook et double cliquer dessus, dans la fenêtre principale d'édition de code qui vient de s'ouvrir coller ce que je t'ai posté et appliquer les modifs nécessaires.

Si tu n'y arrive pas, viens avec plus de précisions !

Bonjour Theze et merci pour ton retour rapide.

J'ai mis "10 feuilles" histoire de dire. En fait, l'idée serait plutôt de faire un an.

Donc là, j'ai fait S38 à S52. Je suppose qu'il faudra créer un nouveau classeur pour 2017.

J'ai copié ton code dans ThisWorkbook, et changé le mot de passe.

C'est un peu frustrant de coller à sa place ce qui fera fonctionner le truc sans pouvoir comprendre ce que ça raconte... mais bon, peut-être un jour...

Donc tel quel, dimanche à minuit, S38 sera verrouillée et ainsi de suite?

Et on peut aussi masquer une fois verrouillé?

Pour tout dire, ce classeur est destiné à des collaborateurs responsables de centres disséminés géographiquement. Ils saisissent hebdomadairement des éléments de leur activité destinés à du reporting, de la facturation clients et de la paye. Le verrouillage doit éviter la confusion et la saisie sur des semaines échues.

Re,

Et on peut aussi masquer une fois verrouillé?

Pour cacher la feuille, j'ai rajouté une ligne de code :

Private Sub Workbook_SheetActivate(ByVal Sh As Object)

    Dim NumSem As Integer

    'récupère le n° de semaine retourné par la fonction Format()
    NumSem = Format(Date, "ww", vbMonday, vbFirstFourDays)

    If NumSem <= CInt(Right(Sh.Name, 2)) Then
        Sh.Unprotect "ricolabasse" 'ôte la protection (elle est sencée ne pas encore exister)
    Else
        Sh.Protect "ricolabasse" 'protège avec le mdp
        Sh.Visible = False 'cache la feuille
    End If

End Sub

Le verrouillage doit éviter la confusion et la saisie sur des semaines échues.

Si c'est pour éviter tout risque de confusion de feuille pour qu'il n'y est pas de risque d'erreur OK car celui qui comprend VBA va dans l'éditeur et modifie ce qu'il veut et même, supprime tout le code. Il te faudrait protéger le projet VBA "Outils"-->"Propriété de VBAProject..." onglet "Protection" cocher la case "Verrouiller le projet pour l'affichage", entrer un mot de passe, le confirmer puis enregistrer et fermer le classeur. A la réouverture, le fait de double cliquer sur le projet (fenêtre en haut à gauche) ou de cliquer sur la croix va afficher une boite demandant le mdp. Attention, la protection est plus que relative car en deux minutes elle peut être supprimé par quelqu'un qui c'est y faire.

Super, merci beaucoup!

En fait, j'aurais dù plancher plus profond en amont pour éviter d'y retourner...

L'idée de tout verrouiller et tout masquer, et ne laisser visible et accessible que la semaine active? (n'hésite pas àme dire si j'abuse...)

Encore merci.

Eric

Bon, je crois que j'ai abusé, je m'en excuse.

Sincèrement merci pour ta contribution.

Eric

Bonjour,

Désolé mais je n'ai pas eu trop de temps !

tu désire quoi ? cacher les feuilles qui représentent les semaines passées ? c'est ce que fait le second code que j'ai posté.

Dans l'idéal, ce serait n'afficher que la semaine active déverrouillée, les autres (passées et futures), verrouillées et masquées.

OK, dans ce cas là, il te faut modifier un peu le code. Tout d'abords, le code est transféré dans la procédure Open() du classeur et une boucle est utilisée pour afficher la bonne feuille et masquer les autres.

Marche à suivre :

Tu supprimes du module du classeur le code que je t'ai donné précédemment et tu le remplaces par celui-ci :

Private Sub Workbook_Open()

    Dim Fe As Worksheet
    Dim NumSem As Integer

    'récupère le n° de semaine retourné par la fonction Format()
    NumSem = Format(Date, "ww", vbMonday, vbFirstFourDays)

    For Each Fe In Worksheets

        'contrôle si les 2 derniers caractères forment bien un nombre
        'car si une feuille a un nom non compatible, CInt() génère une erreur
        If IsNumeric(Right(Fe.Name, 2)) Then

            If NumSem = CInt(Right(Fe.Name, 2)) Then

                Fe.Unprotect "ricolabasse" 'déprotège
                Fe.Visible = True 'affiche la feuille

            Else

                Fe.Protect "ricolabasse" 'protège avec le mdp
                Fe.Visible = False 'cache la feuille

            End If

        End If

    Next Fe

End Sub

Tu affiches toutes les feuilles (pour le test) puis tu enregistres le classeur et tu le fermes ensuite tu le ré-ouvres pour voir le résultat, tu doit n'avoir de visible que la feuille "S38" ou toutes autres feuilles n'ayant pas un nom compatible (différent de (S01, S02), S03, S38, etc...)

Ok, c'est super!

Je suis en déplacement la semaine prochaine.

Je transmets à mon collègue qui me rendra compte du résultat et reviens vers toi.

C'est tout de même un sacré niveau de compétence que tu partages.

Encore merci.

Au delà de te remercier, quel moyen ai-je pour contribuer à soutenir ce que vous faites ? (je suppose que tu n'es pas seul)

Eric

Rechercher des sujets similaires à "verrouiller onglet fonction date"