Je me permets de vous solliciter car je ne suis pas très à l'aise avec les macros, or je pense que seules celles-ci sont à même de répondre à mon besoin.
Dans un fichier excel (cf. PJ) portant sur de la gestion de stock je souhaiterais :
1. que la date et l'identifiant de la personne qui renseigne une cellule (exemple : numéro de lot, en colonne I) se renseignent automatiquement sur la même ligne respectivement dans les colonnes Y et Z.
2. que ces cellules en colonnes Y et Z se verrouillent automatiquement dès qu'elles se remplissent
3. que la ligne se verrouille automatiquement à l'enregistrement à l'exception de 2 cellules : celle indiquant la consommation, en colonne N, et celle indiquant la date de la dernière consommation en colonne O.
J'ai cherché et trouvé une réponse que je peux adapter pour chaque point (remplissage automatique en fonction du remplissage d'une autre cellule, verrouillage de cellule automatique après remplissage et verrouillage à l'enregistrement), mais dès que j'essaie de faire les trois ensemble, ça plante. Aussi, si vous pouviez m'aider, ce serait très gentil de votre part.
Et idéalement, si vous pouviez joindre l'explication ce serait top, si jamais je devais faire des adaptations à posteriori.
Private Sub Worksheet_Change(ByVal Target As Range)
Dim TS As ListObject 'déclare la variable TS (Tableau Structuré)
Dim PT As Range 'déclare la variable PT (Olage du Tableau)
Dim LI As Integer 'déclare la variable LI (LIgne)
Me.Unprotect 'déprotège l'onglet
Set TS = Me.ListObjects("Tableau1") 'définit le tableau structuré TS
Set PT = TS.DataBodyRange 'définit la plage PT
If Target.Count > 1 Then Exit Sub
If Intersect(Target, PT.Columns("I")) Is Nothing Then Exit Sub 'si le changement a lieu ailleurs qu'en colonne I, sort de la procédure
LI = Target.Row - TS.HeaderRowRange.Row 'définit la ligne LI
PT.Locked = True 'verrouille les cellule de la plage PT
If Target = "" Then PT.Item(LI, 25) = "": PT.Item(LI, 26) = "": Exit Sub
PT.Item(LI, "Y") = Date
PT.Item(LI, "Z") = Environ("username")
PT.Columns("I").Locked = False 'déverrouille la colonne I
PT.Columns("N:O").Locked = False 'dévérouille les colonne N et O
Me.Protect 'protège l'onglet
End Sub
Merci beaucoup, par contre ce n'est pas tout à fait ce que je cherche à faire.
Là, j'ai bien le remplissage automatique des cellules en colonne Y et Z, mais ça verrouille toute la ligne immédiatement, sauf les colonnes I, N et O. Et si je modifie ces colonnes, cela déverrouille tout.
Je pense que j'ai mal expliqué ce que je souhaitais faire, désolé.
Je voudrais que l'utilisateur puisse remplir (presque) n'importe quelle case d'une ligne vierge entre les colonne A et Y mais qu'une case spécifique (en colonne I, dans mon exemple) génère le remplissage des cellules en Y et Z. Ces dernières faisant office de signature électronique, je souhaitais qu'elles ne soient pas modifiables (d'où mon souhaite de les verrouiller immédiatement).
Un fois tous les champs remplis, je souhaitais un verrouillage de la ligne nouvellement créée sauf les champs destinés à être modifiés (colonnes N et O).
J'avais trouvé un fichier dans un forum (je ne sais plus si c'était ici), avec la macro suivante qui permettait le verrouillage case par case après remplissage (là, il y avait une notion de couleur de cellule non applicable dans mon cas) :
VB:
'Verrou automatique
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
ActiveSheet.Unprotect "ADMIN"
Set isect = Application.Intersect(Target, Range("H21:M66")) 'à adapter
If Not isect Is Nothing Then
If Target.Interior.Color = RGB(255, 0, 0) And Target.Value <> "" Then
Target.Locked = True
Else
Target.Locked = False
End If
End If
ActiveSheet.Protect "ADMIN"
End Sub
Je souhaitais appliquer cette macro pour la signature électronique, mais je pèche au niveau de l'intégration...
En ce qui concerne le verrouillage de la ligne, j'avais trouvé un autre fichier avec cette autre macro :
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
' NB : La protection est associée à un mot de passe : "mp"
If Not Intersect(Target, Range("S2:S20")) Is Nothing Then 'Valable seulement pour la Plage S7:S120
'Suppression de la protection de la feuille
ActiveSheet.Unprotect
If Range("s" & Target.Row).Select <> "" Then
Target.EntireRow.Locked = True
End If
ActiveSheet.protect DrawingObjects:=True, Contents:=True, Scenarios:=True
End If
End Sub
Là, l'idée était de ne pas verrouiller automatiquement la ligne après remplissage de la cellule en colonne S, mais à l'enregistrement. Ce qui aurais du me permettre de créer des lignes sans déverrouiller toute la feuille. Et comme précédemment, ne comprenant pas tout, je ne sais pas trop comment adapter.
Petit oubli de ma part aussi, il y a une fonction de tri/filtre sur la première ligne que je souhaite pouvoir utiliser...