Verrouiller une plage en fonction d'une valeur donnée

olggapt

XLDnaute Junior
Bonjour les amis !

Je cherche une macro me permettant de verrouiller une plage (par exemple A1: D1) en fonction de la valeur apparaissant dans une cellule extérieure à cette plage.

Par exemple : si mon interrupteur se trouve en E1 :
si E1=1 la plage A1: D1 est verrouillée
si E1=0 la plage A1: D1 n'est plus verrouillée

Par ailleurs je souhaite décliner cette possibilité sur chacune des lignes de mon tableau qui comporte 10 lignes identiques
de A1:E1 à A10:E10

Une idée ?
 
Dernière édition:

nyko283

XLDnaute Occasionnel
Re : Verrouiller une plage en fonction d'une valeur donnée

Bonjour olgapt,

la feuille doit etre proteger avec ou sans mdp mais avec Userinterfaceonly:=True
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Range("F1:F10"), Target) Is Nothing Then ' interrupteur en colonne F 
    If Target.Value = 1 Then 'si la cellule F1 est egale a 1 alors a1:e1 verrouiller , si autre valeur deverrouiller.
        Range("A" & Target.Row & ":E" & Target.Row).Locked = True
    Else
        Range("A" & Target.Row & ":E" & Target.Row).Locked = False
    End If
End If
End Sub
 

olggapt

XLDnaute Junior
Re : Verrouiller une plage en fonction d'une valeur donnée

Bonjour nyko283 et merci de ton aide.

Toutefois, comment reproduire cet interrupteur sur chacune de mes 10 lignes (interrupteur différent à chaque ligne)
Quel est l'intérêt d'utiliser Userinterfaceonly ? je ne connais pas cette fonction.

A bientôt !
 

nyko283

XLDnaute Occasionnel
Re : Verrouiller une plage en fonction d'une valeur donnée

Bonjour à tous,

Alors dans ce code, tu as en fait 10 interrupteurs, tous dans la colonne F le 1er en cellule F1 pour la ligne 1 puis F2 pour la ligne 2,... jusqu'a 10. donc tu as bien un interrupteur indépendant pour chacune des 10 lignes. Range("F1:F10")

si c'est la plage de cellules qui est differentes à chaque ligne, il faudrat que tu reproduisent 10 fois le code en changeant la plage
VB:
 Intersect(Range("F1:F10")
par
VB:
 Intersect(Range("F1")
puis pour F2,... en modifiant a chaque fois l'étendu de la plage
VB:
Range("A" & Target.Row & ":E" & Target.Row).Locked
par ta plage à verrouiller a chaque ligne.

Pour Userinterfaceonly , c'est un paramètre de la proprièté "Protect" (Protection de la feuille), qui permet de verrouiller une feuille pour que l'utilisateur ne puisse pas modifier, mais laisse libre cours aux macros, evitant ainsi de devoir déverrouiller avant chaque execution puis reverouiller apres.

exemple :
VB:
ActiveSheet.Protect Password:="Monmdp", UserInterfaceOnly:=True

j'espere avoir repondu a tes interrogations.
 
Dernière édition:

olggapt

XLDnaute Junior
Re : Verrouiller une plage en fonction d'une valeur donnée

(re)bonjour !

Ton code marche très bien mais je n'arrive pas à le perfectionner...
En effet, comment faire quand le nombre de lignes bouge c'est à dire qu'il peut y en avoir plus de 10 sans savoir combien ?

J'ai nommé ma dernière ligne "FinLignes"
Entre la ligne 1 et FinLignes, le nombre de lignes est variable car l'utilisateur est susceptible d'en ajouter à sa guise.
Il faudrait donc que je puis faire varier (F1:F10) comme (F1:"FinLignes")

Une idée ?
 

olggapt

XLDnaute Junior
Re : Verrouiller une plage en fonction d'une valeur donnée

Bonjour. Merci de ton aide.
Ta formule semble effectivement évidente ! je n'y avais pas pensé...
je ne suis pas un expert du VBA mais je me débrouille (je pratiquais le Basic il y a longtemps).

Je voudrais te solliciter à nouveau si tu es OK.

J'ai introduit des variables (x, y, z...) dans la macro d'un feuille Excel. J'ai bien pris garde de les déclarer au niveau du module et non de la procédure afin de les maintenir vivantes.
Or, quand je change de feuille, les variables ne sont plus reconnues !
Elles ne sont même pas mises à zéro, elles disparaissent purement et simplement.
Comment dois-je les déclarer pour les maintenir sur l'ensemble du classeur ?
merci !
 

nyko283

XLDnaute Occasionnel
Re : Verrouiller une plage en fonction d'une valeur donnée

Bonjour,

Pour tes variables declare les dans un module ( attention pas un module de feuille, par exemple dans le module 1) et public egalement.

cela devrait le faire.
 

Discussions similaires

Statistiques des forums

Discussions
312 103
Messages
2 085 306
Membres
102 859
dernier inscrit
Diallokass