Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2016 Protection en écriture cellules selon condition

Michel_ja

XLDnaute Occasionnel
Bonjour à tous,
j'aimerai savoir s'il est possible de protéger en écriture, certaines cellules d'une même ligne ou pourquoi pas l'ensemble des cellules de la ligne, en fonction du texte (ou contenu) d'une cellule de cette même ligne.
Si le texte de la cellule A6 est "Done" alors toute la ligne est protéger en écriture. Les lignes à protéger ne se suivent pas obligatoirement, donc je me demande s'il y faut faire cela sous forme de boucle ?

Merci beaucoup.
Michel
 

Michel_ja

XLDnaute Occasionnel
Bonjour BrunoM45,
tout d'abord merci d'avoir répondu à mon besoin. Le résultat est super.
Comment pourrait-on modifier ton code pour que ce ne soit plus une private Sub qui se déclenche lors d'un événement ? Je ne suis pas encore familier avec Target qui je pense est la "cellule cible" où se fait l'événement.
Est ce qu'on pourrait avoir une boucle qui check le texte d'une cellule pour l'ensemble des lignes d'une range (qu'on définit avec une variable) et qui la protêge en écriture à ce moment là ? Je n'ai pas besoin du MsgBox.
J'ai commencé un début de code mais ça se gâte puisque il n'y a plus "Application" dans ce cas.
Merci beaucoup.

Sub Protection_PastData()

Dim AllData As Range
Dim Derligne As Long
Dim i As Long
Derligne = Range("L" & Rows.Count).End(xlUp).Row
Set AllData = Range("A6" & ":EX" & Derligne)
For i = 7 To Derligne

If Range("CL" & i).Value = "Done" Then

'If Target.Column <> 1 Then
' Interdire la modification
Application.EnableEvents = False
Application.Undo
Application.EnableEvents = True
'End If
' Passer la ligne en gris si pas déjà fait
Range("A" & LignePast.Row).Resize(, Columns("R").Column).Interior.Color = 14277081
Else
' Sinon effacer la couleur si existe
Range("A" & LignePast.Row).Resize(, Columns("R").Column).Interior.Color = xlNone
End If
Next LignePast
End Sub
 

Michel_ja

XLDnaute Occasionnel
J'ai essayé avec le code suivant mais ça bloque au niveau de Application.Undo qui d'après ce que j'ai lu en anglais sur des sites ne s'applique qu'à la dernière opération effectuée. Ce qui explique sûrement le private sub dans la solution de BrunoM45!
Vous auriez une solution ?
Merci encore.

Sub Protection_PastData()
Dim AllData As Range
Dim DerligneV10 As Long
Dim Row As Integer
DerligneV10 = Range("L" & Rows.Count).End(xlUp).Row
Set AllData = Range("A6" & ":EX" & DerligneV10)

For Row = 7 To DerligneV10

If Range("CL" & Row).Text = "Done" Then
Application.EnableEvents = False
Application.Undo
Application.EnableEvents = True
Range("A" & Row & ":RR" & Row).Interior.Color = 14277081
Else
' Sinon effacer la couleur si existe
Range("A" & Row & ":RR" & Row).Interior.Color = xlNone
End If
Next Row
End Sub
 

Dranreb

XLDnaute Barbatruc
Bonjour.
Et si c'est pas "Done" c'est vide ?
Avez vous essayé ma proposition du #2 ?
Notez que je ne comprends pas trop pourquoi la solution de BrunoM45 ne vous convient pas.
Est-ce parce qu'elle n'empêche pas d'essayer inutilement contrairement au verrouillage de la cellule ?
Notez que ce dernier implique de protéger la feuille, au moins sans mot de passe.
 
Dernière édition:
C

Compte Supprimé 979

Guest
Bonjour le fil, Dranreb ;-)
Michel_ja la solution que j'ai proposée est la plus optimisée, si elle ne convient pas je n'irais pas plus en avant
Bonne chance
 

Discussions similaires

Réponses
1
Affichages
312
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…