Verrouillage conditionnel dans Excel 2010 [Résolu]

Signaler
-
 jacky -
Bonjour,

Voilà mon problème, j'ai fait un code pour verrouiller ou déverrouiller une plage de cellules selon le résultat d'une autre cellule. Le code marche bien si je saisie 1 dans une cellule de la colonne GY, mais comme le chiffre est le résultat d'une formule, ça bug. Si quelqu'un est en mesure de m'éclairer, merci d'avance.

Voici le code utilisé :

    Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Application.Intersect(Target, Range("GY:GY")) Is Nothing Then
        ActiveSheet.Unprotect "toto"
        If Target.Value = 1 Then
        Target.Offset(0, -84).Locked = True
        Target.Offset(0, -85).Locked = True
        Target.Offset(0, -86).Locked = True
        Target.Offset(0, -87).Locked = True
        Target.Offset(0, -88).Locked = True
        Target.Offset(0, -89).Locked = True
        Target.Offset(0, -90).Locked = True
        Else
        Target.Offset(0, -84).Locked = False
        Target.Offset(0, -85).Locked = False
        Target.Offset(0, -86).Locked = False
        Target.Offset(0, -87).Locked = False
        Target.Offset(0, -88).Locked = False
        Target.Offset(0, -89).Locked = False
        Target.Offset(0, -90).Locked = False
        End If
    ActiveSheet.Protect "toto"
    End If
    End Sub

Sachant que le résultat des lignes dans la colonne GY est:
=SI(OU(EP12="P";FM12<>0);1;0), pour la ligne 12, mais la formule est sur toute les lignes.

5 réponses

Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
229
Bonjour,
Les calculs par formule ne provoquent pas d'évènement Change
Tu peux par contre utiliser l'évènement Calculate, mais dans ce cas, il te faudra tester sur chaque cellule de la colonne GY
Messages postés
14855
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 octobre 2020
444
Bonjour Uc, j'ai transformé ton commentaire en réponse, car les utilisateurs non connectés ne voient pas les commentaires du premier message.
Messages postés
14855
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 octobre 2020
444
Bonjour,
Message modifié pour ajouter les balises de code.
Voirici comment utiliser la coloration syntaxique.
Messages postés
29743
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
13 octobre 2020
338
Bonjour,
Comme te l'a indiqué Ucfoutu, tu peux utiliser la méthode CALCULATE ...ce qui t'obligera à parcourir toute ta colonne GY pour t'assurer qu'un 1 n'est pas apparu.

Sinon tu continues à utiliser la méthode change... mais au lieux de l'appliquer sur ta plage de cellule qui contient ta formule.(GY).. tu vérifies sur tes ta plage de cellule EP et FM (celles qui constituent ta formule).
=> Si EP x ou Fm x change... tu regardes si GY x= 1


Private Sub Worksheet_Change(ByVal Target As Range)
colonne = Split(Target.Address, "$")(1)
If colonne = "EP" Or colonne = "FM" Then
 valGY = Cells(Target.Row, "GY").Value
 

 Select Case valGY
    Case 0:
      Debug.Print "Ligne : " & Target.Row & " GY = 0"
      Range("DM" & Target.Row & ":DV" & Target.Row).Locked = False
    Case 1:
      Debug.Print "Ligne : " & Target.Row & " GY = 1"
      Range("DM" & Target.Row & ":DV" & Target.Row).Locked = True
    Case Else
      Debug.Print "Ligne : " & Target.Row & "  GY = autre chose.." & valGY
      Range("DM" & Target.Row & ":DV" & Target.Row).Locked = False
 
 End Select
 
End If

End Sub


Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
229
Bonjour, Jordane45
Oui, en espérant que les cellules des colonnes EP et FM ne contiennent pas elles-mêmes des résultats de formules Excel.
On ne dira jamais assez que les "panachages" (formules Excel et VBA) ne sont pas la meilleure manière de gérer un classeur Excel.
Bonjour, ucfoutu et Jordane45

Merci de vos conseils et remarques, je suis en Nouvelle-Calédonie, ce qui explique le décalage dans ma réponse.
J'avais également trouver la solution de passer par le menu - Données - Validation. Néanmoins le code de Jordan45 fonctionne bien, en ajustant un peu :
- Ajout du "Unprotec" et le "Protec",
- Remplacement de la colonne EP par la colonne B
Car comme le signal ucfoutu, EP est une recopie de B.
j'ai juste du refaire la saisie dans la colonne B pour mettre à jour la protection ou pas des cellules.
Il est vrai que le panachage VBA Formules ne font pas bon ménage, mais là j'avais pas trop le choix ou les compétences pour faire autrement.
Un très grand merci à vous deux, ci-dessous le code de Jordan45 corrigé de 3 fois rien :

Private Sub Worksheet_Change(ByVal Target As Range)
colonne = Split(Target.Address, "$")(1)
If colonne = "B" Or colonne = "FM" Then
 valGY = Cells(Target.Row, "GY").Value

ActiveSheet.Unprotect "toto"
 
 Select Case valGY
    Case 0:
      Debug.Print "Ligne : " & Target.Row & " GY = 0"
      Range("DM" & Target.Row & ":DV" & Target.Row).Locked = False
    Case 1:
      Debug.Print "Ligne : " & Target.Row & " GY = 1"
      Range("DM" & Target.Row & ":DV" & Target.Row).Locked = True
    Case Else
      Debug.Print "Ligne : " & Target.Row & "  GY = autre chose.." & valGY
      Range("DM" & Target.Row & ":DV" & Target.Row).Locked = False
 
 End Select
 
End If
 ActiveSheet.Protect "toto", DrawingObjects:=True, Contents:=True, Scenarios:=True _
        , AllowFormattingCells:=True, AllowFormattingColumns:=True, _
        AllowFormattingRows:=True, AllowFiltering:=True
End Sub


EDITE PAR Jordane45 : Ajout des balises de code !
http://codes-sources.commentcamarche.net/faq/10686-le-nouveau-codes-sources-comment-ca-marche#balises-code

.