Verrouillage automatique après saisie

Résolu
JN -  
eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   -
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

  1. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
     
    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
  2. JN
     
    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
    1. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
       
      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
    2. JN
       
      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
    3. JN
       
      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
    4. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
       
      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
    5. JN
       
      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