Programmer verrouillage de cellules

Bonjour à tous,

J'ai créé un tableau de gestion des temps pour une quinzaine de salariés. (image jointe)

J'aimerais trouver une solution pour que l'employeur puisse "valider" une semaine et que cela verrouille les cellules de la semaine concernée pour empêcher toute modification ultérieure.

J'ai pensé à une case à cocher mais je n'arrive pas à empêcher que tout utilisateur puisse cocher/décocher la case.

Auriez-vous des idées ?

Merci,

Cloé

excelimg

Bonjour,

Bien entendu, c'est possible. Mais une image ne sert pas dans ce cas, il faut nous joindre le fichier éventuellement avec les données impersonnalisées.

Bonjour Raja,

Je joins un fichier excel avec une feuille type.

Je réfléchis à me servir d'une mise en forme conditionnelle pour mettre en gras par exemple, et verrouiller ainsi toutes les cellules en gras.

Merci de votre réponse,

Cloé

37test-excel.xlsx (235.26 Ko)

Bonjour,

un premier exemple à minima.

Un double-clic sur une cellule validation Employeur (en R) (dé)verrouille les lignes après demande d'un mot de passe.

Si la semaine est verrouillée Employeur passe en fond vert

Le mot de passe est dans le code (actuellement = password), il faudrait éventuellement verrouiller le projet (dans VBE) en plus si tu crains que certains aille fouiller dedans.

On peut aussi faire en sorte que le mot de passe n'apparaisse pas en clair dans boite de dialogue mais bon, s'il est seul dans son bureau...

eric

45test-excel.xlsm (248.02 Ko)

Bonjour Eric,

Merci pour ta réponse.

J'ai ouvert le fichier mais malheureusement je ne comprends pas le fonctionnement du code...

J'essaie de double cliquer sur une cellule Employeur mais rien ne se passe.

Edit : J'ai compris d'où venait le problème, mon 2e fichier VBA était ouvert et cela posait problème visiblement. Ton code fonctionne, je vais voir si cela répond totalement à nos attentes.

Merci à toi en tout cas

As-tu accepté les macros (en jaune au-dessus de la feuille à l'ouverture) ?

Et le niveau de sécurité choisi le permet-il ? Si tu as choisi "Désactiver toutes les macros sans notification' tu ne verras pas grand chose.

Edit: ah ben tu as trouvé finalement

Oui sur ton fichier ca marche impeccable.

Par contre, j'ai copié collé le code dans mon fichier contenant toutes les feuilles par salariés, et ca ne marche pas.

Dans quel onglet de VBA dois-je le coller ?

ThisWorkbook ? Chaque onglet concerné ?

Merci encore,

Tel qu'il est conçu c'est dans les modules des feuilles concernées qu'il faut le mettre.

Modif pour ThisWorkbook :

Private Sub Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)
    If Sh.[C20] <> "Pointages" Then Exit Sub ' tester si feuille ok
    If Target.Column = 18 And Target.Row > 23 Then
        If InputBox("mot de passe ?") = "password" Then
            Cancel = True
            ActiveSheet.Unprotect "password"
            Target.EntireRow.Locked = Not Target.Locked
            Target.Interior.ColorIndex = IIf(Target.Locked, 35, xlNone)
            ActiveSheet.Protect Password:="password", DrawingObjects:=True, Contents:=True, Scenarios:=True, AllowFiltering:=True
            ActiveSheet.EnableSelection = xlNoRestrictions
        End If
    End If
End Sub

à toi de fignoler le test de la feuille pour éviter les déclenchements intempestifs, comme je ne connais pas les autres feuilles...

Merci beaucoup pour ton aide Eric, c'est super.

Très bonne fin de journée à toi

Cloé

Bonjour,

J'ai mis en place le code que Eric m'a fourni pour mettre un mot de passe au double clic + mot de passe de ma cellule Employeur.

J'aimerais juste enlever le fait de devoir taper un mot de passe (pour gagner du temps). Sachant que la cellule Employeur ne peut pas être sélectionnée par les autres utilisateurs, il n'y a que l'employeur qui pourra double cliquer et ainsi enclencher la macro.

J'ai donc modifié le code comme ceci :

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

    If Target.Column = 18 And Target.Row > 23 Then
        'If InputBox("mot de passe ?") = "motdepasse" Then
            Cancel = True
            ActiveSheet.Unprotect "motdepasse"
            Target.EntireRow.Locked = Not Target.Locked
            Target.Interior.ColorIndex = IIf(Target.Locked, 35, xlNone)
            ActiveSheet.Protect Password:="motdepasse", DrawingObjects:=True, Contents:=True, Scenarios:=True, AllowFiltering:=True
            ActiveSheet.EnableSelection = xlNoRestrictions
        'End If
    End If
End Sub

Cela fonctionne, mais il faut faire 2 doubles clic pour faire toute la macro.

Au 1er double clic, ma cellule devient blanche et toutes les lignes sont déverrouillées. Au 2e double clic la cellule devient verte et les cellules sont toutes verrouillées.

Y a t-il un moyen d'éviter de devoir faire 2 doubles clic ?

Merci beaucoup pour l'aide précieuse !

Cloé

Bonjour,

c'est une bascule.

1er double-clic verrouille

2nd double-clic déverrouille si tu as des modifs à effectuer.

Si tu n'en veux pas remplace avec Target.EntireRow.Locked = True

Accessoirement tu n'as pas laissé des Worksheet_BeforeDoubleClick() sur certaines feuilles ?

eric

J'ai finalement laissé les codes dans chaque feuille.

La bascule est intéressante, mais y a t-il un moyen pour que cela commence par Verrouiller en 1er double clic ?

Actuellement le 1er double clic Deverrouille.

Merci à toi,

Cloé

Comme c'est une bascule ça dépend de l'état de tes cellules au départ, et plus particulièrement celles de R qui sert de référence.

Par défaut elles sont verrouillées, donc sélectionnes-les et déverrouille-les et la macro commencera par les verrouiller.

D'accord j'ai saisis la nuance !

En fait ce qui pose problème dans ce cas, c'est que dans ma plage de cellule à la semaine, certaines cases sont verrouillées et d'autres non. Cela permet à nos salariés de ne pouvoir remplir que ce qui doit être rempli par eux.

Je cherche donc à modifier le code pour que le "If ....Locked" se rapporte à une cellule déverrouillée de base, pour que le 1er double clic enclenche donc un verrouillage total de la plage. C'est possible ?

Je pense à quelque chose type Target.Offset(1) .... ?

En quoi ça gène de déverrouiller R ? Avec une sélection 3D des feuilles tu les fais toutes en 1 fois.

Sinon prend G, Q ou T qui sont fusionnées sur la semaine. Autrement il faudra calculer la plage selon la ligne cliquée, et si tu es amenée à inséerer une ligne il faudra rependre la macro.

eric

Bonjour Eric,

J'ai souhaité verrouiller les cellules "Employeur" comme ca je n'ai pas besoin d'entrer un mot de passe à chaque validation, je n'ai qu'à double cliquer. Comme les salariés ne pourront pas sélectionner la cellule, ils ne pourront pas valider de leur côté.

J'ai trouvé comment verrouiller les lignes si une de mes cellules étaient déverrouillées grâce à tes conseils

Voilà mon code du coup :

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

    If Target.Column = 18 And Target.Row > 23 Then
       ' If InputBox("mot de passe ?") = "motdepasse" Then _
       Activer si l'on souhaite mettre un mot de passe pour valider
            Cancel = True
            ActiveSheet.Unprotect "motdepasse"

            Target.EntireRow.Locked = Not Target.Offset(0, -11).Locked
            'Les 7 lignes de la semaine se verrouillent si quand on clique _
            sur "employeur", la cellule en colonne G est déverrouillée

            Target.Interior.ColorIndex = IIf(Target.Locked, 35, xlNone)
            ActiveSheet.Protect Password:="motdepasse", DrawingObjects:=True, Contents:=True, Scenarios:=True, AllowFiltering:=True
            ActiveSheet.EnableSelection = xlNoRestrictions
       ' End If
    End If

End Sub

Je te remercie beaucoup pour ton aide.

Tu parles de sélection 3D pour faire toutes les feuilles en 1 fois ? Je ne connais pas je vais essayer de chercher sur le forum.

Cloé

Bonjour,

si tu veux t'appuyer sur une autre colonne change le 18 dans :

If Target.Column = 18 and ...

Sélection 3D :

Clic 1er feuille, shift-clic dernière feuille

Toutes les modif seront appliquées sur toutes les feuilles sélectionnées.

Ne pas oublier de revenir à 1 feuille sélectionnée dès que tu as fini.

eric

Ah super pour la sélection 3D.

Par contre comme dans le code il y a :

ActiveSheet.Unprotect "motdepasse"

Ca me met une erreur quand je le fais sur plusieurs feuilles.

Désolé je débute sur la programmation ! C'est impressionnant tout ce que l'on peut faire.

Ah ben non, ce sont les modifs sur feuille qui se répercutent sur la sélection.

La protection d'une feuille c'est feuille par feuille, et il faut les déprotéger pour les modifier.

Si tu veux le faire par macro :

dim sh as worksheet
for each sh in worksheets
            ActiveSheet.Unprotect "motdepasse"
next sh

eric

D'accord, merci à toi.

Je met le sujet en résolu !

Bon après-midi,

Cloé

Rechercher des sujets similaires à "programmer verrouillage"