IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Protéger seulement une ligne en VBA


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Femme Profil pro
    Dut geii Nimes
    Inscrit en
    Mars 2015
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 28
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Dut geii Nimes
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2015
    Messages : 73
    Points : 43
    Points
    43
    Par défaut Protéger seulement une ligne en VBA
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address <> "$A$11" Then Exit Sub
    Me.Unprotect
    Range("B11:J11").Locked = Range("A11").Value <> ""
    Me.Protect
    End Sub

    Bonjour

    Voici un code que j'ai écris, je souhaite pouvoir verrouiller les cellules B11 à J11 lorsque la cellule A11 n'est pas vide.
    Sauf que lorsque je teste, c'est toute la feuille qui se verrouille et pas seulement ces cellules la.
    J'ai mis une autorisation pour que seul quelques utilisateurs puissent modifier la cellule A11.

    Si quelqu'un a une piste ou une solution

    Je suis preneuse

    Merci d'avance

  2. #2
    Membre émérite
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 814
    Points : 2 949
    Points
    2 949
    Billets dans le blog
    10
    Par défaut
    Bonjour,

    Peut-être comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address <> "$A$11" Then Exit Sub
    With Me
       .Unprotect
       .Cells.Locked = False 'on déverouille toutes les cellules de la feuille
       .Range("B11:J11").Locked = Range("A11").Value <> "" 'on ne vérouille que celles que l'on veut
       .Protect
    End With
    End Sub
    Cordialement,
    Franck

  3. #3
    Expert éminent sénior Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Points : 32 866
    Points
    32 866
    Par défaut
    Perso, j'aurais mis ActiveSheet plutôt que Me.

    Et j'utiliserai des parenthèses pour lever l'ambiguïté de l'égalité et de l'inégalité sur la même ligne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Private Sub Worksheet_Change(ByVal Target As Range)
        If Target.Address <> Range("A11").Address Then Exit Sub
        ActiveSheet.Unprotect
        Range("B11:J11").Locked = (Range("A11").Value <> "")
        ActiveSheet.Protect
    End Sub
    Sauf que lorsque je teste, c'est toute la feuille qui se verrouille et pas seulement ces cellules la.
    A priori, il n'y a rien dans ce code qui verrouille d'autres cellules que B11:J11.
    Les autres cellules n'étaient-elles pas verrouillées avant ?
    Il faut garder à l'esprit que l'état "verrouillé" est l'état par défaut d'une cellule.
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

  4. #4
    Membre du Club
    Femme Profil pro
    Dut geii Nimes
    Inscrit en
    Mars 2015
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 28
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Dut geii Nimes
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2015
    Messages : 73
    Points : 43
    Points
    43
    Par défaut
    Citation Envoyé par pijaku Voir le message
    Bonjour,

    Peut-être comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address <> "$A$11" Then Exit Sub
    With Me
       .Unprotect
       .Cells.Locked = False 'on déverouille toutes les cellules de la feuille
       .Range("B11:J11").Locked = Range("A11").Value <> "" 'on ne vérouille que celles que l'on veut
       .Protect
    End With
    End Sub

    Merci super ça fonctionne tres bien comme ca

    J'ai une autre question si tu peux m'aider pour la suite

    Alors je voudrai faire la même chose pour chaque ligne, la méthode que j'ai trouvé est de copié plusieurs fois le code et de modifier 11 par 12, puis par 13 puis par 14 etc...
    Mais je pense que c'est possible de le faire avec une boucle un peu comme en maths dans les algorithme, est ce que tu aurai quelque piste pour m'aider sachant que je dois aller jusqu'à la ligne 50 000

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address <> "$A$12" Then Exit Sub
    With Me
       .Unprotect
       .Cells.Locked = False 'on déverouille toutes les cellules de la feuille
       .Range("B12:J12").Locked = Range("A12").Value <> "" 'on ne vérouille que celles que l'on veut
       .Protect
    End With
    End Sub
    [/QUOTE]

  5. #5
    Membre du Club
    Femme Profil pro
    Dut geii Nimes
    Inscrit en
    Mars 2015
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 28
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Dut geii Nimes
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2015
    Messages : 73
    Points : 43
    Points
    43
    Par défaut
    Citation Envoyé par Menhir Voir le message
    Perso, j'aurais mis ActiveSheet plutôt que Me.

    Et j'utiliserai des parenthèses pour lever l'ambiguïté de l'égalité et de l'inégalité sur la même ligne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Private Sub Worksheet_Change(ByVal Target As Range)
        If Target.Address <> Range("A11").Address Then Exit Sub
        ActiveSheet.Unprotect
        Range("B11:J11").Locked = (Range("A11").Value <> "")
        ActiveSheet.Protect
    End Sub
    Coucou

    j'ai testé aussi, ça fonctionner mercii
    mais du coup peux tu m'expliquer la différence entre ActiveSheet.Protect et Me.protect, je sais que ActiveSheet fait référence à la feuille...

  6. #6
    Membre émérite
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 814
    Points : 2 949
    Points
    2 949
    Billets dans le blog
    10
    Par défaut
    On ne fait pas de boucle dans l'événement Change pour réaliser ce que tu souhaites.

    Tu veux que, à chaque saisie en colonne A, soit :
    Axx est vide ==> on déverrouille les cellules contenues en B:J de cette ligne
    Axx est non vide ==> On verrouille les cellules contenues en B:J de cette ligne

    Il te faut donc, dans l'événement Change() traiter l'ensemble de la colonne A.

    Pour cela, il te faut déjà virer :
    Pour ne pas déverrouiller toutes les cellules à chaque fois (sinon obligé de boucler et ==> cf début).
    Ce code, une fois que tu l'as fait une fois (même manuellement), n'a plus lieu d'être.
    Ton code devient donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Column = 1 And Target.Row > 10 And Target.Cells.Count = 1 Then
       With Me
          .Unprotect
          .Range("B" & Target.Row & ":J" & Target.Row).Locked = (Target.Value <> "") 'on ne verrouille que celles que l'on veut
          .Protect
       End With
    End If
    End Sub
    J'ai ajouté les parenthèses de Menhir que je salue au passage.
    Cordialement,
    Franck

  7. #7
    Expert éminent sénior Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Points : 32 866
    Points
    32 866
    Par défaut
    Citation Envoyé par Bisbis27 Voir le message
    Alors je voudrai faire la même chose pour chaque ligne, la méthode que j'ai trouvé est de copié plusieurs fois le code et de modifier 11 par 12, puis par 13 puis par 14 etc...
    Ca n'est pas possible. Il ne peut pas y avoir plus d'une Worksheet_Change par onglet.
    Par contre, il est possible de faire en sorte que cette macro traite plusieurs cas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Private Sub Worksheet_Change(ByVal Target As Range)
        If Target.Column <> 1 Or Targer.Row < 11 Then Exit Sub
        ActiveSheet.Unprotect
        Range("B" & Target.Row & ":J" & Target.Row).Locked = (Target.Value <> "")
        ActiveSheet.Protect
    End Sub
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

Discussions similaires

  1. Réponses: 5
    Dernier message: 06/08/2012, 03h31
  2. Rerendre seulement une ligne d'une liste
    Par monstor dans le forum JSF
    Réponses: 0
    Dernier message: 25/02/2009, 17h31
  3. Comment insérer une ligne dans vba
    Par chou-estelle dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 20/12/2008, 15h04
  4. Sélectionner une ligne en VBA Excel
    Par NEC14 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 12/11/2008, 15h28
  5. Réponses: 8
    Dernier message: 17/03/2006, 08h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo