Verrouillage automatique après saisie

Résolu/Fermé
JN - 6 sept. 2012 à 18:45
eriiic Messages postés 24569 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 28 décembre 2023 - 8 sept. 2012 à 16:31
Bonjour,

J'ai crée sur Excel une base de donnée utilisant un grand nombre de formule, choix déroulant et validation de donnée.
J'aimerais que lorsque je coche la première cellule d'une ligne, l'ensemble des cellules de cette dites ligne se verrouille (à l'exception de la première pour que je puisse déverrouiller la ligne si nécessaire) dans le but de sécuriser la base de données après chaque nouvelle série de donnée.
Le faire par la validation de donnée est impossible car j'utilise déja cette fonction pour le remplissage des données.
Je pense donc le faire par la feuille de code mais je ne m'y connais du tout en code...

Un grand merci pour le temps que vous passerez a me lire et me répondre...

Jean-Noël

2 réponses

eriiic Messages postés 24569 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 28 décembre 2023 7 209
Modifié par eriiic le 6/09/2012 à 19:48
Bonsoir,

une proposition en vba :
Private Sub Worksheet_Change(ByVal Target As Range)   
    'activation protection générale   
    If Target = [A1] And [A1] = "" Then ActiveSheet.Unprotect   
    ' protection des lignes   
    If Target.Column = 1 And Target.Row > 1 Then   
        ActiveSheet.Unprotect   
        If LCase(Target) = "x" Then   
            Target.Offset(0, 1).Resize(1, 10).Locked = True   
        Else   
            Target.Offset(0, 1).Resize(1, 10).Locked = False   
        End If   
    End If   
    If [A1] = "x" Then ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True   
End Sub

Mettre un x en A1 pour activer la protection générale. Le supprimer pour ôter la protection de la feuille et permettre toutes les modifications (formats, etc) sans être embêté par la protection.

Un x en colonne A verrouille 10 cellules sur la ligne (adapter le 10 dans le code) si A1 n'est pas vide.
Déverrouiller toutes les cellules au départ.

exemple : https://www.cjoint.com/?BIgtUSPpQJF

eric


Jamais tu ne répondras à un mp non sollicité...
Bon, ça c'est fait.
0
Dsl mais même l'exemple que vous m'avez mis en pièce jointe ne fonctionne pas...
Je voudrais que si je mets un "x" dans la case A2, toutes les cellules la ligne 2 soit bloquées (non modifiable) et que si je décoche la cellule A2 les cellules de la ligne 2 redeviennent modifable.

(si je mets le x en A3, ce sera pareil mais uniquement pour la ligne 3; et ainsi de suite...)

Encore merci pour le temps consacré à me répondre...
0
eriiic Messages postés 24569 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 28 décembre 2023 7 209
7 sept. 2012 à 19:18
L'exemple fonctionne très bien.
Seulement il faut accepter les macros, et que la sécurité d'excel soit réglée pour te proposer de les accepter.

eric
0
Je les avais bien accepter... mais j'ai trouvé l'erreur (qui venait de moi...), en effet la case A1 de ma base de donnée n'était pas un "x"...

Un grand merci
0
Puis-je abuser????
En fait j'ai adapté le code pour qu'il verrouille 149 cellules de la ligne concernée.
Mais, subtilité que je n'avais pas précisé, certaines colonnes comprennent des formules. Afin que l'agent ne modifie pas ces données j'avais initiallement bloqué ces celulles.
Lorsque que je bloque la ligne avec le "x" dans la première cellule elles sont toutes bloquées (ce que je voulais) mais lorsque je débloque en enlevant le "x" toutes les cellules de la ligne redeviennent accessible, je souhaiterais que les cellules à formule restent bloquées (comme dans la configuration de départ)

Les colonnes qui devraient rester en permanence bloquées sont:
B
U
AO à AX (AO et AX compris)
CX
DB

Encore un grand merci
Et promis après j'arrête ;)


Jean-Noël
0
eriiic Messages postés 24569 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 28 décembre 2023 7 209
Modifié par eriiic le 7/09/2012 à 23:37
Bonsoir,

On va faire plus général : si une cellule contient une formule elle n'est pas déverrouillée :
Private Sub Worksheet_Change(ByVal Target As Range) 
    Const nbcol As Long = 10 
    Dim col As Long 
    'activation protection générale 
    If Target = [A1] And [A1] = "" Then ActiveSheet.Unprotect 
    ' protection des lignes 
    If Target.Column = 1 And Target.Row > 1 Then 
        ActiveSheet.Unprotect 
        If LCase(Target) = "x" Then 
            Target.Offset(0, 1).Resize(1, nbcol).Locked = True 
        Else 
            For col = 1 To nbcol 
                If Left(Target.Offset(0, col).Formula, 1) <> "=" Then Target.Offset(0, col).Locked = False 
            Next col 
        End If 
    End If 
    If [A1] = "x" Then ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True 
End Sub

J'ai mis le nombre de colonnes en constante au début du code. Ca ne fait qu'une valeur à changer en cas de modif.
Teste et dis.

eric
0
Salut,
J'ai donc remplacé le premier code par le nouveau.
Malheureusement rien n'est protégé lorsque je mets le "x" dans la première cellule...
0