XL 2010 bloquer cellule

eastwick

XLDnaute Impliqué
Bonjour à toutes et tous,

Je souhaiterais bloquer les cellules des colonnes Q et V à partir de la ligne 9 à partir du moment où elle ont un contenu. Une date colonne Q et la mention "Vu" pour la V.
Y inclure la possibilité de se rétracter avec une macro où un mot de passe.

En vous remerciant !
 

job75

XLDnaute Barbatruc
Bonjour eastwick, Laurent78,

Voyez le fichier joint et cette macro dans le code de la feuille :
VB:
Private Sub Worksheet_Change(ByVal R As Range)
Dim mem
Protect "toto", UserInterfaceOnly:=True 'feuille protégée
Application.ScreenUpdating = False
Application.EnableEvents = False 'désactive les évènements
On Error Resume Next
With Intersect(Range("Q9:Q" & Rows.Count), UsedRange)
    .Locked = False 'déverrouille
    mem = .Value
    .Replace "*/*", "#N/A", xlWhole
    .SpecialCells(xlCellTypeConstants, 16).Locked = True 'verrouille
    .SpecialCells(xlCellTypeConstants, 16) = mem
End With
With Intersect(Range("V9:V" & Rows.Count), UsedRange)
    .Locked = False 'déverrouille
    .Replace "Vu", "#N/A", xlWhole
    .SpecialCells(xlCellTypeConstants, 16).Locked = True 'verrouille
    .SpecialCells(xlCellTypeConstants, 16) = "Vu"
End With
Application.EnableEvents = True 'réactive les évènements
End Sub
Elle se déclenche quand on modifie ou valide une cellule quelconque.

A+
 

Pièces jointes

  • Classeur(1).xlsm
    24.2 KB · Affichages: 4

job75

XLDnaute Barbatruc
J'avais fait une erreur, voyez ce fichier (2) avec restitution par .Value = mem :
VB:
Private Sub Worksheet_Change(ByVal R As Range)
Dim mem
Protect "toto", UserInterfaceOnly:=True 'feuille protégée
Application.ScreenUpdating = False
Application.EnableEvents = False 'désactive les évènements
On Error Resume Next
With Intersect(Range("Q9:Q" & Rows.Count), UsedRange)
    mem = .Value
    .Locked = False 'déverrouille
    .Replace "*/*", "#N/A", xlWhole
    .SpecialCells(xlCellTypeConstants, 16).Locked = True 'verrouille
    .Value = mem
End With
With Intersect(Range("V9:V" & Rows.Count), UsedRange)
    .Locked = False 'déverrouille
    .Replace "Vu", "#N/A", xlWhole
    .SpecialCells(xlCellTypeConstants, 16).Locked = True 'verrouille
    .SpecialCells(xlCellTypeConstants, 16) = "Vu"
End With
Application.EnableEvents = True 'réactive les évènements
End Sub
 

Pièces jointes

  • Classeur(2).xlsm
    24.3 KB · Affichages: 6

job75

XLDnaute Barbatruc
Pour tester j'ai recopié la plage Q9:V39 sur 62 000 lignes.

Avec la macro précédente l'exécution se fait en 5 secondes quelle que soit la modification, c'est trop long.

Voyez ce fichier (3) et cette macro, l'exécution est en général immédiate :
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim P As Range, i&, mem
Protect "toto", UserInterfaceOnly:=True 'feuille protégée
Application.ScreenUpdating = False
Application.EnableEvents = False 'désactive les évènements
On Error Resume Next
With Intersect(Target, Range("Q9:Q" & Rows.Count), UsedRange)
    Set P = .Areas(1)
    For i = 2 To .Areas.Count
        Set P = Range(P, .Areas(i)) 'concatène les zones disjointes
    Next
    mem = P
    P.Locked = False 'déverrouille
    P.Replace "*/*", "#N/A", xlWhole
    P.SpecialCells(xlCellTypeConstants, 16).Locked = True 'verrouille
    P = mem
End With
With Intersect(Target, Range("V9:V" & Rows.Count), UsedRange)
    .Locked = False 'déverrouille
    .Replace "Vu", "#N/A", xlWhole
    .SpecialCells(xlCellTypeConstants, 16).Locked = True 'verrouille
    .SpecialCells(xlCellTypeConstants, 16) = "Vu"
End With
Application.EnableEvents = True 'réactive les évènements
End Sub
 

Pièces jointes

  • Classeur(3).xlsm
    725.4 KB · Affichages: 2
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 097
Messages
2 085 256
Membres
102 839
dernier inscrit
Tougtoug