Verrouillage d'un bout de ligne après complétion d'une cellule
Bonjour à tous amateurs (et moins amateurs) d'Excel !
Je suis à la recherche d'un petit coup de main !
J'ai un tableau accessible par plusieurs acteurs, ce tableau est divisé en 3 sections (1 par acteur
J'ai donc, non sans peine, réussi à intégrer une macro qui me permet de réaliser un émargement dès que la case validation de chaque section et remplie, ainsi l'acteur valide et j'ai un horodatage. Merveilleux.
Je cherche maintenant à verrouiller sa section de ligne dès lors que l'émargement est réalisé (ou n'importe quel autre case en fait, puisque je devrais être en capacité de l'adapter.)
Mais voilà, malgré le florilège de tuto, et de cas similaire, je suis dans l'incapacité d'y arriver. J'ai bien trouver comment verrouiller chaque cellule après complétion, mais.. je vois déjà venir le truc du "Oui bah voilà, je peux même pas me tromper une fois, c'est nul ce tableau", alors que si ILS valident, ça sera LEUR faute =D
Quelqu'un peut jeter un oeil svp ?
Objectif :
Verrouillage des zones A:M / N:T / U:AA dès que la case de la colonne L / S / Z est horodatée.
Les acteurs n'ont pas à modifier les données dès lors qu'ils ont validé !
Merci à ceux qui m'aideront, après je m'amuserai à ajouter un petit message "Es tu sûr de vouloir envoyer ces données dans le cosmos ?" / "Sir Yes Sir " / "Wait"
+ Code
Private Sub Worksheet_Change(ByVal Target As Range)
ActiveSheet.Unprotect "toto"
If Range("M4") = "Ok" Then
Range("A4:L4").Locked = True
ActiveSheet.Protect "toto"
End If
Dim wCellColumn, xCellColum, yCellColumn As Integer
Dim wTimeColumn, xTimeColumn, yTimeColumn As Integer
Dim wRow, wCol, xRow, xCol, yRow, yCol As Integer
Dim wDPRg, wRg, xDPRg, xRg, yDPRg, yRg As Range
'Ici se trouve les colonnes à identifier en fonction des variables (voir ci dessous la lettre "w,x,y" pour chaque acteur
wCellColumn = 29
xCellColumn = 13
yCellColumn = 20
wTimeColumn = 28
xTimeColumn = 12
yTimeColumn = 19
wRow = Target.Row
xRow = Target.Row
yRow = Target.Row
wCol = Target.Column
xCol = Target.Column
yCol = Target.Column
'Code Vx Signature Assistant pour sa partie, Indiquer les colonnes "x" signature et date
If Target.Text <> "" Then
If xCol = xCellColumn Then
Cells(xRow, xTimeColumn) = Now()
Else
On Error Resume Next
Set xDPRg = Target.Dependents
For Each xRg In xDPRg
If xRg.Column = xCellColumn Then
Cells(xRg.Row, xTimeColumn) = Now()
End If
Next
End If
End If
'CodeVy Signature CDP pour sa partie, Indiquer les colonnes "y" signature et date
If Target.Text <> "" Then
If yCol = yCellColumn Then
Cells(yRow, yTimeColumn) = Now()
Else
On Error Resume Next
Set yDRPg = Target.Dependents
For Each yRg In yDPRg
If yRg.Column = yCellColumn Then
Cells(yRg.Row, yTimeColumn) = Now()
End If
Next
End If
End If
'Code Vw Signature IC pour sa partie, Indiquer les colonnes "y" signature et date
If Target.Text <> "" Then
If wCol = wCellColumn Then
Cells(wRow, wTimeColumn) = Now()
Else
On Error Resume Next
Set wDRPg = Target.Dependents
For Each wRg In wDPRg
If wRg.Column = wCellColumn Then
Cells(wRg.Row, wTimeColumn) = Now()
End If
Next
End If
End If
End SubBonjour,
Vous pourriez faire quelque chose dans ce genre, une macro évènementielle qui réagit à la sélection de la cellule, et si la date à été rentrée et validée par OK, alors il devient impossible de saisir une nouvelle valeur.
Option Compare Text
Private Sub Worksheet_selectionChange(ByVal Target As Range)
If Target.Row > 2 Then
If Target.Column <= 13 And Cells(Target.Row, "M") = "Ok" And Cells(Target.Row, "L") <> "" Then
MsgBox "la plage est déjà datée et validée, vous ne pouvez plus la modifier"
Range("A1").Select
ElseIf Target.Column > 13 And Target.Column <= 20 And Cells(Target.Row, "T") = "Ok" And Cells(Target.Row, "S") <> "" Then
MsgBox "la plage est déjà datée et validée, vous ne pouvez plus la modifier"
Range("O1").Select
ElseIf Target.Column > 20 And Target.Column <= 29 And Cells(Target.Row, "AC") = "Ok" And Cells(Target.Row, "AB") <> "" Then
MsgBox "la plage est déjà datée et validée, vous ne pouvez plus la modifier"
Range("U1").Select
End If
End If
End SubCdlt
Bonjour Arturo83,
Merci pour ton retour rapide.
Ta solution est intéressante et aurait pu largement suffire, j'ai simplement deux problèmes qui se posent à moi :
- L'horodatage ne se fait plus lorsque je rentre "Ok", il faut revenir une fois sur la cellule de validation pour voir l'horodatage apparaître
- L' accès aux cases est certes "limité", mais lorsque je retourne sur le case "Ok", une troisième fois (1 écriture, 2 apparition horodatage), la date de l'horodatage change même si la saisie est empêchée.
Ok, je pensais que c'était l'intervenant qui devait mettre la date.
Maintenant, dès qu'une cellule est vide dans M, T ou AC, et que l'utilisateur met "Ok", la date et l'heure sont incorporée dans la colonne précédente et la plage devient interdite.
Pour cela il faut mettre en remarque le verrouillage de la feuille dans la macro "Worksheet_Change".
le code:
Option Compare Text
Private Sub Worksheet_selectionChange(ByVal Target As Range)
If Target.Row > 2 Then
If Target.Column <= 13 And Cells(Target.Row, "M") = "Ok" Then
If Cells(Target.Row, "L") = "" Then Cells(Target.Row, "L") = Date & " " & Time
MsgBox "la plage est datée et validée, vous ne pouvez plus la modifier"
Range("A1").Select
ElseIf Target.Column > 13 And Target.Column <= 20 And Cells(Target.Row, "T") = "Ok" Then
If Cells(Target.Row, "S") = "" Then Cells(Target.Row, "S") = Date & " " & Time
MsgBox "la plage est datée et validée, vous ne pouvez plus la modifier"
Range("O1").Select
ElseIf Target.Column > 20 And Target.Column <= 29 And Cells(Target.Row, "AC") = "Ok" Then
If Cells(Target.Row, "AB") = "" Then Cells(Target.Row, "AB") = Date & " " & Time
MsgBox "la plage est datée et validée, vous ne pouvez plus la modifier"
Range("U1").Select
End If
End If
End SubCdlt