Verrouillage conditionnel dans Excel 2010

Résolu
jacky - Modifié par Whismeril le 14/05/2014 à 09:41
 jacky - 15 mai 2014 à 00:09
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

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
14 mai 2014 à 08:22
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
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
14 mai 2014 à 09:43
Bonjour Uc, j'ai transformé ton commentaire en réponse, car les utilisateurs non connectés ne voient pas les commentaires du premier message.
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
14 mai 2014 à 09:42
Bonjour,
Message modifié pour ajouter les balises de code.
Voirici comment utiliser la coloration syntaxique.
0
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 344
14 mai 2014 à 11:04
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


0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
14 mai 2014 à 11:54
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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
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

.
0
Rejoignez-nous