Partage
  • Partager sur Facebook
  • Partager sur Twitter

[VBA] Lock de cellule en fonction d'une autre

Sujet résolu
    13 février 2019 à 9:55:47

    Bonjour,

    Sur un de mes fichiers Excel j'aurais besoin de bloquer deux cellules en fonction de la valeur d'une autre. Pour cela j'ai utilisé un code VBA qui est supposé fonctionner. Le voici : 

    Private Sub Worksheet_Change(ByVal Target As Range)

        Call Deverrouille

        If Range("AW20").Value = "Internal" Then

            'Range("J21").ClearContents

            Range("J21").Locked = True

            Range("G21").Locked = False

        ElseIf Range("AW20").Value = "Outsourced" Then

            'Range("G21").ClearContents

            Range("G21").Locked = True

            Range("J21").Locked = False

        End If

        Call Verrouille

    End Sub

    Précision : Verrrouille et Déverrouille servent à enlever et remettre la protection de la feuille Excel. 

    A savoir que ma cellule AW20 contient une validation des données, l'utilisateur peut uniquement choisir Internal ou Outsourced. Suivant les cas je souhaite bloquer une case et débloquer l'autre et inversement. Cette partie fonctionne mais dès que je souhaite rajouter la ligne pour supprimer le contenu d'une case alors le programme plante lorsque je change la valeur de AW20. Passer de Internal à Outsourced ou inversement fait planter Excel et celui-ci se ferme tout seul. Aucune idée de la raison pour laquelle ça se produit. 

    J'ai essayé un .Clear au lieu du ClearContents. J'ai également essayé de mettre un .Value = "" mais dans tous les cas le programme plante. 

    Merci d'avance pour votre réponse ! 

    Pierre

    • Partager sur Facebook
    • Partager sur Twitter
      13 février 2019 à 10:47:27

      Salut,

      Utilise le bouton </> pour poster du code.

      La protection est un peu chiante à utiliser. Quel est le code de Deverrouille et Verrouille ?

      Si AW20 est pas en Locked = False alors c'est normal que ça plante, tu n'as pas le droit de modifier sa valeur.

      Tu peux utiliser une option quand tu protèges la feuille qui permet d'autoriser la macro à faire des modifications sans se soucier de l'état protégé ou non des cellules. Mais il faudra déprotéger / reprotéger à chaque fois que tu ouvriras le fichier.

      Il faut mettre UserInterfaceOnly à True quand tu protèges avec ça : https://docs.microsoft.com/fr-fr/office/vba/api/excel.worksheet.protect

      -
      Edité par Stormweaker 13 février 2019 à 10:47:58

      • Partager sur Facebook
      • Partager sur Twitter
        13 février 2019 à 10:57:14

        Merci pour la réponse !

        Voila le code de verrouiller et déverrouiller : 

        Sub Deverrouille()
        
            ActiveSheet.Unprotect Password:="*****"
            
        End Sub
        
        Sub Verrouille()
        
            ActiveSheet.Protect Password:="*****", DrawingObjects:=False, Contents:=True, Scenarios:= _
                False, AllowFormattingCells:=True, AllowFormattingColumns:=True, _
                AllowFormattingRows:=True, AllowInsertingColumns:=True, AllowInsertingRows _
                :=True, AllowInsertingHyperlinks:=True, AllowDeletingColumns:=True, _
                AllowDeletingRows:=True, AllowSorting:=True, AllowFiltering:=True, _
                AllowUsingPivotTables:=True
        End Sub
        Je n'essaie pas de modifier la valeur de AW20, je ne fais que la lire pour savoir ce que l'utilisateur a choisi. Et normalement celle-ci est débloquée puisque c'est uniquement une validation des données qui se trouve dessus. 


        • Partager sur Facebook
        • Partager sur Twitter
          13 février 2019 à 14:14:22

          Donne le message d'erreur complet et l'endroit qui fait planter.
          • Partager sur Facebook
          • Partager sur Twitter
            13 février 2019 à 14:54:00

            Il n'y a pas de message d'erreur c'est juste excel qui semble essayer de faire quelque chose (souris qui est en rond de chargement) et ensuite excel se ferme tout seul. 

            Cela se produit quand je rajoute une ligne pour effacer le contenu de la cellule avant de la bloquer. Quand il y a juste le blocage tout marche normalement donc j'en déduis que le problème vient de l'effacement de cellule.
            • Partager sur Facebook
            • Partager sur Twitter
              13 février 2019 à 17:03:09

              Si tu décommentes les Range.ClearContents du code de ton premier message, Excel tourne dans le vide et crash ?

              Tu as essayé d'utiliser le débogueur pour faire une exécution pas à pas ?

              • Partager sur Facebook
              • Partager sur Twitter
                14 février 2019 à 9:17:19

                Je viens de trouver la solution ! 

                En fait la cellule ClearContents était avant les lock et consistent en une modification de cellule ce qui rappelait la macro à chaque fois sans la laisser se terminer. Comme la macro tournait en boucle infinie, Excel finissait par planter. 

                J'ai donc ajusté le code comme ci-dessous et ajouté une formule pour que la macro ne tourne que si c'est la case AW20 qui est modifiée. 

                Private Sub Worksheet_Change(ByVal Target As Range)
                    
                    If Target.Address = "$AW$20" Then
                    
                        Call Deverouille
                        
                        If Range("AW20").Value = "Internal" Then
                            
                            Range("J21").Locked = True
                            Range("G21").Locked = False
                            Range("J21").ClearContents
                            
                        ElseIf Range("AW20").Value = "Outsourced" Then
                        
                            Range("G21").Locked = True
                            Range("J21").Locked = False
                            Range("G21").ClearContents
                            
                        End If
                        
                        Call Verouille
                        
                    End If
                    
                End Sub



                Voila merci quand même Stormweaker pour les réponses, ca m'aura un peu aidé ;) 

                • Partager sur Facebook
                • Partager sur Twitter

                [VBA] Lock de cellule en fonction d'une autre

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                • Editeur
                • Markdown