[Résolu] Verrouillage cellule conditionnel dynamique VBA

Max60150

XLDnaute Junior
Bonjour le forum, sa faisait longtemps !

Alors voila mon problème cette fois:
Je ne peux pas poster mon projet puisqu'il s'agit d'un gros fichier avec des informations professionnelles, et le retravailler pour pouvoir le mettre en ligne me prendrais trop de temps, je vais donc esssayer de résumer !

J'utilise quelques listes déroulantes, certaines en "formulaire" et d'autres en "ActiveX" selon les besoins.
Ici, j'aimerai qu'en fonction du choix effectué sur une liste déroulante de contrôle formulaire, certaines cellules soient vérrouillées. Le tout en VBA, car j'aimerai éviter l'option validation de donnée.
Je voudrais vraiment que les cellules soient simplement vérrouillées !
La page est elle verrouillée par défaut, il s'agirait donc même plutôt de dévérouiller uniquement quelques cellules si je choisi le premier choix de ma liste, et de revérouiller ces dernières si le choix est différent.
Le tout de manière "dynamique". En farfouillant sur le net j'ai trouvé des bouts de code qui avaient l'air de fonctionner un peu, mais qui ne fonctionnaient qu'une fois en gros. J'aimerai vraiment que mes petites cellules se verrouillent/deverouillent aussi vite que je change de choix dans ma liste déroulante.

Est-ce possible ?

Je suis preneur de toute information ou idée, et présent pour toute question.

Merci d'avance !
 
Dernière édition:

Robert

XLDnaute Barbatruc
Repose en paix
Re : Verrouillage cellule conditionnel dynamique VBA

Bonjour Max, bonjour le forum,

Je ne peux pas poster mon projet puisqu'il s'agit d'un gros fichier avec des informations professionnelles, et le retravailler pour pouvoir le mettre en ligne me prendrais trop de temps, je vais donc esssayer de résumer !
Créer un petit exemple avec une liste déroulante correspondant à ton problème avec une poignée de données bidons ne doit pas, non plus, demander tant de travail que ça... Mais puisque tu as la flemme, moi encore plus...
 

Max60150

XLDnaute Junior
Re : Verrouillage cellule conditionnel dynamique VBA

Bonjour Max, bonjour le forum,


Créer un petit exemple avec une liste déroulante correspondant à ton problème avec une poignée de données bidons ne doit pas, non plus, demander tant de travail que ça... Mais puisque tu as la flemme, moi encore plus...

J'ai pas réfléchi assez longtemps effectivement, j'ai simplement pensé à la masse de chose a effacer de mon fichier pro pour pouvoir le poster, et n'ai même pas envisagé le fait d'en faire un tout bidon qui décrive l'idée.
Sorry :eek:

Voilà qui est fait !

Alors quelques explications complémentaires du coup:

Donc l'idée serait:

Mes cellules grises sont verrouillées, par défaut et sans changement possible (imaginons des cellules avec des formules qui affichent un résultat, il ne faut pas que les utilisatuers puissent y toucher ou même voir la formule).

Mes cellules bleues, elles, sont toujours accessibles et modifiables. (imaginons des cellules d'entrée, les utilisateurs notent des valeurs qui servent dans des calculs ailleurs dans la page).

Mais surtout, mes cellules jaunes. Il faudrait par exemple que si je selectionner le choix 1, elle soient accessible et modifiables, donc pas verrouillées, pour pouvoir entrer des données.
Mais si le choix est différent de 1, il faudrait que ces cellules soient vérrouillées au même titre que les grises, voir même que le contenu soit effacé.
Et si possible que ce verrouillage/deverrouillage se fasse automatiquement, qu'il soit MAJ à chaque fois que je touche à ma liste déroulante.

Voilà, j'espère être clair, encore désolé pour le manque d'imagination, ce n'est pas de la flemme !

Je reste dispo !
 

Pièces jointes

  • XLD.xlsx
    12.7 KB · Affichages: 48
  • XLD.xlsx
    12.7 KB · Affichages: 46
  • XLD.xlsx
    12.7 KB · Affichages: 48

Robert

XLDnaute Barbatruc
Repose en paix
Re : Verrouillage cellule conditionnel dynamique VBA

Bonjour Max, bonjour le forum,

Ce code affecté au contrôle :

Code:
Sub Macro1()
Dim PL As Range 'déclare la variable PL (PLage)

Set PL = Range("D8:D12") 'définit la plage PL (à adapter à ton cas)
ActiveSheet.Unprotect 'déprotège l'onglet
Select Case Range("D3").Value 'agit en fontion de la valeur de la cellule D3
    Case 1 'cas 1
        PL.Locked = True 'verrouille la plage PL
    Case Else 'tous les autres cas
        PL.Locked = False 'déverrouille la plage PL
End Select 'fin de l'action en fonction de la valeur de la cellule D3
ActiveSheet.Protect
End Sub

Bien sûr, l'onglet Feuil1 est protégé au départ. Toutes les cellules sont verrouillées sauf D3 et la plage D13:D18.
Le fichier :
 

Pièces jointes

  • Max_v01.xlsm
    20.2 KB · Affichages: 56
  • Max_v01.xlsm
    20.2 KB · Affichages: 55
  • Max_v01.xlsm
    20.2 KB · Affichages: 61

Max60150

XLDnaute Junior
Re : Verrouillage cellule conditionnel dynamique VBA

Bonjour Max, bonjour le forum,

Ce code affecté au contrôle :

Code:
Sub Macro1()
Dim PL As Range 'déclare la variable PL (PLage)

Set PL = Range("D8:D12") 'définit la plage PL (à adapter à ton cas)
ActiveSheet.Unprotect 'déprotège l'onglet
Select Case Range("D3").Value 'agit en fontion de la valeur de la cellule D3
    Case 1 'cas 1
        PL.Locked = True 'verrouille la plage PL
    Case Else 'tous les autres cas
        PL.Locked = False 'déverrouille la plage PL
End Select 'fin de l'action en fonction de la valeur de la cellule D3
ActiveSheet.Protect
End Sub

Bien sûr, l'onglet Feuil1 est protégé au départ. Toutes les cellules sont verrouillées sauf D3 et la plage D13:D18.
Le fichier :

Bonjour Robert, j'ai oublié de te saluer tout à l'heure,

Et merci de ton aide !

Sur mon exemple sa marche nickel, c'est exactement le résultat que je recherche, j'ai même bidouillé un peu pour pouvoir utiliser un mot de passe pour la protection et sa fonctionne bien.
La ou il y a un problème, c'est que je n'arrive pas à réutiliser le code dans mon programme pro..
J'ai bien changé la plage de cellule, la cellule de référence pour le test, enfin je pense avoir tout fais comme il se doit, mais je n'arrive pas à retrouver le même résultat :(

Y a t il une page spécifique ou je dois implanter le code dans l'interface de code VBA?
Tant que j'y suis, si je peux abuser de ta gentillesse, pourrais tu m'indiquer ou je dois placer un morceau de code pour verrouiller, par mot de passe, toutes les feuilles de mon classeur à l'ouverture (ThisWorkBook?)
J'ai trouvé ce code en farfouillant, est-ce que c'est correct et compatible avec le code que tu m'as fournis tout à l'heure?
Code:
Private Sub verr_Open()
  For i = 1 To Sheets.Count
    With Sheets(i)
      .Protect Password:="123", DrawingObjects:=True, Contents:=True, Scenarios:=True
    End With
  Next
End Sub


Merci encore !
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : Verrouillage cellule conditionnel dynamique VBA

Bonjour Max, bonjour le forum,

Y a t il une page spécifique ou je dois implanter le code dans l'interface de code VBA?
Désolé mais j'ai pas compris ta question...

Sinon as tu bien vérifié les choses suivantes dans ton fichier PRO :
• Au départ toutes les cellules sont verrouillées
• tu sélectionnes la plage libre et tu déverrouilles
• tu sélectionnes la cellule liée au contrôle et tu déverouilles
• dans le code de la Macro1, tu adaptes la plage PL à ton cas. Si c'est une page disjointe (par exemple A1:A50 / C1:C50) utilise :

Code:
Set PL = Application.Union(Range("A1:A50"), Range("C1:C50"))
En pièce jointe la version 2 avec le code de protection à l'ouverture et le code de la macro adapté à la protection :
 

Pièces jointes

  • Max_v02.xlsm
    22 KB · Affichages: 40

Max60150

XLDnaute Junior
Re : Verrouillage cellule conditionnel dynamique VBA

Bonjour Robert,

Premièrement, oublis ma question, je parlais de l'arborescence dans l'éditeur de code. J'ai pris exemple sur le fait que tu aies placé ton code dans un module, et j'en ai profité pour réorganiser mon code correctement.

Pour mon problème, je pense avoir trouvé la source.. En fait, sur mon fichier pro, j'ai utilisé des listes déroulantes ActiveX.
Du coup, la cellule associée ne renvoi pas un nombre mais la chaine de caractère complète séléctionnée dans la liste déroulante.
J'ai bien essayé de changer le test sur D3 pour qu'il test l'égalité de la chaîne, mais j'ai l'impression que sa ne fonctionne pas..

Code:
Sub Macro1()
Dim PL As Range 'déclare la variable PL (PLage)

Set PL = Range("D8:D12") 'définit la plage PL (à adapter à ton cas)
ActiveSheet.Unprotect "123" 'déprotège l'onglet
Select Case Range("D3").Value 'agit en fontion de la valeur de la cellule D3
    Case "Choix 1" 'cas 1
        PL.Locked = True 'verrouille la plage PL
    Case Else 'tous les autres cas
        PL.Locked = False 'déverrouille la plage PL
End Select 'fin de l'action en fonction de la valeur de la cellule D3
ActiveSheet.Protect "123"
End Sub

Est-il possible d'arriver au même résultat que précedemment, mais avec un test sur une chaîne de caractère au niveau du Case?

Je ne peu pas changer mes listes déroulantes, car j'ai besoin d'agir sur certaines propriétés qui ne sont disponibles qu'en ActiveX.


Merci encore pour ton aide :)
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : Verrouillage cellule conditionnel dynamique VBA

Bonjour Max, bonjour le forum,

Oui c'est possible et le code que tu as écris est correct mais, toujours pareil... Voir post #2... Combien de fois faudra-t-il te le répéter...
 

Max60150

XLDnaute Junior
Re : Verrouillage cellule conditionnel dynamique VBA

Re,

Honnêtement je pensais que le code suffisait pour ma question, et j'ai un peu la tête pleine a force de me creuser sur cette question, et d'autres en parallèle !

MeaCulpa, voici le fichier modifié.

*toujours joindre ton fichier, toujours joindre ton fichier, toujours joindre ton fichier*
J'oublierai plus :rolleyes:
 

Pièces jointes

  • Max_v02.1.xlsm
    21.5 KB · Affichages: 38

Robert

XLDnaute Barbatruc
Repose en paix
Re : Verrouillage cellule conditionnel dynamique VBA

Bonjour Max, bonjour le forum,

C'est vrai que le code suffisait mais c'est juste une question de flemme...
Avec ce type de contrôle c'est déjà plus simple... J'ai supprimé le Module1, la liaison avec la cellue D3. Le code se trouve dans le composant Feuil1(Feul1). il agit au changement dans la ComboBox1.
Le code :

Code:
Private Sub ComboBox1_Change()
Dim PL As Range 'déclare la variable PL (PLage)

Set PL = Range("D8:D12") 'définit la plage PL (à adapter à ton cas)
ActiveSheet.Unprotect "123" 'déprotège l'onglet
ActiveCell.Select 'enlève le focus à la ComboBox1
Select Case Me.ComboBox1.Value 'agit en fontion de la valeur de la ComboBox1
    Case "Choix 1" 'cas 1
        PL.Locked = True 'verrouille la plage PL
    Case Else 'tous les autres cas
        PL.Locked = False 'déverrouille la plage PL
End Select 'fin de l'action en fonction de la valeur de la cellule D3
ActiveSheet.Protect "123" 'protège l'onglet
End Sub
Le fichier :
 

Pièces jointes

  • Max_v03.xlsm
    23.9 KB · Affichages: 48

Max60150

XLDnaute Junior
Re : Verrouillage cellule conditionnel dynamique VBA

Re,

Parfait, merci beaucoup Robert !
Tu m'as beaucoup aidé, sur ce problème, mais indirectemet sur d'autres également.

Ma petite interface prend forme au fur et à mesure que j'en apprend sur le VBA, et tu m'a bien appris :)
Mon intêret pour le VBA croît également au fur et a mesure, on peut vraiment faire des trucs sympa !

Pour la flemme, je comprend, j'imagine que tu aides pas mal de gens, simultanément qui plus est.
Pas évident de se rappeller de tout, et si tu passes 5 min a retrouver le fichier relatif à chaque sujet, c'est ingérable !
J'y penserai si j'ai a nouveau besoin d'aide, pour l'instant j'ai de quoi avancer.

Merci encore, je passe le thread en résolu, j'imagine qu'il pourra être utile à d'autres personnes.

Bonne continuation :)
 

Discussions similaires

Réponses
9
Affichages
171

Statistiques des forums

Discussions
312 329
Messages
2 087 334
Membres
103 520
dernier inscrit
Azise