XL 2019 Remplissage automatique de cellules, verrouillage de ces cellules et verrouillage à l'enregistrement

Theobaldinho

XLDnaute Nouveau
Bonjour,

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.

Cordialement,


Thibaut
 

Pièces jointes

  • Gestion de stock.xlsm
    28.8 KB · Affichages: 17

Robert

XLDnaute Barbatruc
Repose en paix
Bonjour Theo et bienvenu, bonjour le forum,

Peut-être comme ça :

VB:
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
 

Theobaldinho

XLDnaute Nouveau
Bonjour Robert,

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...

A plus

Theobaldinho
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
314 653
Messages
2 111 579
Membres
111 206
dernier inscrit
Dante76