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 :

Oter protection sur passage cellule [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé Avatar de graphikris
    Homme Profil pro
    Pas tres doué
    Inscrit en
    Décembre 2012
    Messages
    1 215
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Pas tres doué
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2012
    Messages : 1 215
    Points : 523
    Points
    523
    Par défaut Oter protection sur passage cellule
    Bonjour,

    Je possède un fichier Excel dans lequel j'ai en Feuille 1 plusieurs tableaux (en mode tableau).
    Pour éviter que quelqu'un efface par inadvertance certaines cellules comportant des formules, j'ai protégé les cellules avec formules.
    Mais quand je veux incrémenter mon tableau, je suis obligé d'ôter cette protection.
    J'aurais voulu savoir s'il était possible d'ôter la protection dès que certaines cellules sont actives.

    Si par exemple H3 est protégée, dés que je déplace avec les flèches de direction sur H3 alors la protection s'ôte afin que le tableau s'incrémente d'une ligne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ActiveCell.FormulaR1C1 = "10"
        Range("Tableau2[Résultat]").Select
        ActiveSheet.Unprotect
        Selection.ListObject.ListRows.Add AlwaysInsert:=False
        Range("F4").Select
        ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
    Ici je saisi une donnée en F3 puis avec les flèches de direction je passe en G3 (cellule protégée mais rien ne doit se passer) et dès que je bascule sur H3 (si je tabule mon tableau s'incrémente).

    J'ai parcouru par mal de forum mais je n'ai rien trouvé.

    Il faudrait que la protection s'ôte dès que je suis sur les cellules suivantes :
    D3 - H3 - N3 - N8 - N13
    puis repasse en mode PROTECTION dès que je suis en D4

    MAIS SI IL EXISTE UNE LIGNE 4 ALORS CA SERA : D4 - H4 etc...

  2. #2
    Expert éminent sénior

    Profil pro
    Conseil, Formation, Développement - Indépendant
    Inscrit en
    Février 2010
    Messages
    8 492
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Conseil, Formation, Développement - Indépendant

    Informations forums :
    Inscription : Février 2010
    Messages : 8 492
    Points : 16 400
    Points
    16 400
    Par défaut
    Bonjour

    Je te propose le code suivant qui, en cas de modification (saisie) d'une ou plusieurs valeurs dans une feuille du classeur, vérifie si la feuille est protégée et si oui, si la ou les cellules modifiées sont situées juste sous un tableau.
    Le cas échéant, la saisie est annulée, le protection enlevée, la saisie rétablie ce qui provoque l'allongement du tableau, puis la protection rétablie.

    Pour cela la protection doit autoriser le VBA : un code est nécessaire à l'ouverture du fichier pour donner cette autorisation (qui a pu être enlevée si on déprotège puis reprotège manuellement). J'y ai placé le mot de passe : à adapter donc...

    Si on déprotège puis reprotège une feuille manuellement, le code pour les tableaux ne marche plus, car l'autorisation au VBA a sauté, si on ne ferme pas puis réouvre le classeur.
    Pour faciliter, on peut prévoir un bouton pour relancer un code identique à celui de l'ouverture afin de rétablir les autorisations sans fermer puis ouvrir.

    Dans le module Workbook
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    Private Sub Workbook_Open()
        Monpass = "toto"
        For Each Sh In ActiveWorkbook.Worksheets
            If Sh.ProtectContents Then ActiveSheet.Protect UserInterfaceOnly:=True, Password:=Monpass
        Next Sh
    End Sub
     
    Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
     
    Dim Y
     
    If Sh.ProtectContents Then
        For Each LO In Sh.ListObjects
     
            If Target.Row = LO.DataBodyRange.Rows.Count + 2 Then
                If Not (Intersect(Sh.Range(Sh.Cells(1, Target.Column), Sh.Cells(1000000, Target.Column)), LO.Range) Is Nothing) Then
                    Sh.Unprotect Password:=Monpass
                    Y = Target.Value
                    Application.EnableEvents = False
                    Application.Undo
                    Target = Y
                    Sh.Protect UserInterfaceOnly:=True, Password:=Monpass
                    Application.EnableEvents = True
                    Exit For
                End If
            End If
        Next LO
    End If
    End Sub
    Plus dans un module standard
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Option Explicit
    Public Monpass As String
    A toi de déverrouiller les colonnes d'Excel où la saisie est autorisée.

  3. #3
    Membre confirmé Avatar de graphikris
    Homme Profil pro
    Pas tres doué
    Inscrit en
    Décembre 2012
    Messages
    1 215
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Pas tres doué
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2012
    Messages : 1 215
    Points : 523
    Points
    523
    Par défaut
    Bonjour ert merci mais j'ai un code erreur
    "Sub ou Function non définie" dès que je saisi une donnée
    sur la ligne 8 du code dans Thisworkbook

    Cordialement

  4. #4
    Expert éminent sénior

    Profil pro
    Conseil, Formation, Développement - Indépendant
    Inscrit en
    Février 2010
    Messages
    8 492
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Conseil, Formation, Développement - Indépendant

    Informations forums :
    Inscription : Février 2010
    Messages : 8 492
    Points : 16 400
    Points
    16 400
    Par défaut
    Bonjour

    Parles-tu de la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    As-tu bien mis ce code dans le module du classeur et non dans un module standard ?

    Si non précise le code de la ligne qui coince

  5. #5
    Membre confirmé Avatar de graphikris
    Homme Profil pro
    Pas tres doué
    Inscrit en
    Décembre 2012
    Messages
    1 215
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Pas tres doué
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2012
    Messages : 1 215
    Points : 523
    Points
    523
    Par défaut
    Oui tout est mis correctement, je t'ai joins le fichier. Saisi une valeur en F3
    Fichiers attachés Fichiers attachés

  6. #6
    Expert éminent sénior

    Profil pro
    Conseil, Formation, Développement - Indépendant
    Inscrit en
    Février 2010
    Messages
    8 492
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Conseil, Formation, Développement - Indépendant

    Informations forums :
    Inscription : Février 2010
    Messages : 8 492
    Points : 16 400
    Points
    16 400
    Par défaut
    Bonjour

    Plusieurs remarques :
    • En repensant à ce code ce matin, je me suis dit qu'il faudrait le modifier car il partait du principe que les tableaux commencent en ligne 1 et donc que cela ne marcherait pas dans les autres cas : c'est justement ton cas, tu as une ligne au-dessus des tableaux qui commencent donc en ligne 2 et des tableaux les uns sous les autres.
    • Je l'ai donc modifié
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
      
      Dim Y
      
      If Sh.ProtectContents Then
          For Each LO In Sh.ListObjects
      
              If Target.Row = LO.DataBodyRange.Rows.Count + LO.HeaderRowRange.Row + 1 Then
                  If Not (Intersect(Sh.Range(Sh.Cells(1, Target.Column), Sh.Cells(1000000, Target.Column)), LO.Range) Is Nothing) Then
                      Sh.Unprotect Password:=Monpass
                      Y = Target.Value
                      Application.EnableEvents = False
                      Application.Undo
                      Target = Y
                      Sh.Protect UserInterfaceOnly:=True, Password:=Monpass
                      Application.EnableEvents = True
                      Exit For
                  End If
              End If
          Next LO
      End If
      End Sub
    • Concernant ton classeur :
      • comme je l'avais indiqué dans mon post, il faut que les colonnes où la saisie est autorisée n'aient pas de cellules verrouillées sinon on ne peut rien saisir même là où il n'y a pas de formule.
      • il est emm...dant de ne pouvoir agir sur les colonnes entières : j'ai défusionné les cellules de tes sur-titres. Le centrage sur plusieurs colonnes donne le même résultat visuel et évite cet emm...dement.
      • ton classeur était sans doute vérolé ou bien la copie depuis ce site a introduit des caractères invisibles mais gênants : j'ai déplacé l'onglet dans un nouveau classeur et le code marche sans problème
      • tu as une liste déroulante dans la première colonne de plusieurs tableaux : cette liste n'est pas disponible sous le tableau et le code réagissant à la saisie, cela oblige à saisir...
    • A propos de F3 : F3 fait partie du tableau et le code réagit quand on saisit sur la ligne située SOUS un tableau
    Fichiers attachés Fichiers attachés

  7. #7
    Membre confirmé Avatar de graphikris
    Homme Profil pro
    Pas tres doué
    Inscrit en
    Décembre 2012
    Messages
    1 215
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Pas tres doué
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2012
    Messages : 1 215
    Points : 523
    Points
    523
    Par défaut
    Merci c'est sympa de ta part pour m'avoir aider. Sans toi je serais dans la galère

  8. #8
    Expert éminent sénior

    Profil pro
    Conseil, Formation, Développement - Indépendant
    Inscrit en
    Février 2010
    Messages
    8 492
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Conseil, Formation, Développement - Indépendant

    Informations forums :
    Inscription : Février 2010
    Messages : 8 492
    Points : 16 400
    Points
    16 400
    Par défaut
    Bonjour

    J'ai continué à travailler sur le code et l'ai mis à disposition ici http://www.developpez.net/forums/d16...x/#post8778978

    Ceci tente de répondre au le problème des validations.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 29/07/2014, 15h53
  2. [Toutes versions] Protection sur une partie des cellules provoque une erreur à l'éxécution de la macro
    Par Invité dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 31/01/2012, 15h36
  3. [XL-2007] Oter une protection sur feuille le temps d'une macro
    Par jose_67 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 11/02/2010, 20h13
  4. [XL-2003] Protection onglet et autorisation sur certaines cellules
    Par Valcou dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 18/08/2009, 17h33
  5. [VBA-Excel] - protection plage de cellule sur i feuilles
    Par Chewi dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 01/02/2007, 16h52

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