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). Et comme c'était ennuyeux de pas avoir de VBA alors que je n'y connais pas grand chose, je me suis dit : Mettons du VBA !

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 Sub

Bonjour,

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 Sub

Cdlt

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 Sub

Cdlt

Rechercher des sujets similaires à "verrouillage bout ligne completion"