Verrouillage ligne

Bonsoir le forum,

je deviens fou, j'ais un petit fichier excel qui tourne impeccable, et je pensais maîtriser le verrouillage des lignes après la saisie de la date en colonne 6 (par macro)

Mais impossible de verrouiller les cellules de la ligne ainsi saisie et je me retrouve avec des données non protégées, j'ai essayer une dizaine de code pour changer l’état des cellules, mais rien ni fait, alors que utilise cette méthode dans plein d'autre fichier et sa fonctionne impeccable.

si un oeil neuf peut voir ou mon code pêche

j'ai très souvent l'erreur l'indice n'appartient pas à la méthode range....

L’idée du fichier est qu'il est utilisable qu'avec le clavier numérique

PS : une petite erreur dans le message d'erreur pour la colonne 2 le nombre de caractère à saisir est 10 et non 9

8demonstration.xlsm (624.34 Ko)

Bonjour,

Je vois un problème avec les conditions, si j'inscris -1234, la condition sur la ligne suivante est vrai,

 Case 1: If Len(target.Value) = 5 Then Msg = "" Else Msg = "Le service est composé de 5 chiffres. Merci !"

pour vérifier que les caractères inscrit soient entre 0 et 9, il faut vérifier chacun d'eux,

For i = 1 To Len(Target)
  n = Mid(Target, i, 1)
  If n >= 0 And n <= 9 Then x = x + 1
Next
If x = 5 Then MsgBox "ok"  'ou bien If x <> 5 Then Target.ClearContents: Exit Sub

une autre possibilité serait d'utiliser des listes de validation.

bonsoir,

théoriquement les deux premières colonnes sont douchée ( code barre), la troisième est une selection d'image via un userform ( que j'ai chinter pour le forum), les colonnes 4 et 5 sont saisies manuellement. et la colonne 6 se remplit automatiquement si les 5 premières sont non vides

Donc théoriquement j'ai pas trop besoin de vérifier les caractères saisies mais sur le principe tu as raison et je garde l'astuce

pour la qte je ne vois pas de problème sauf s'il y a une limite au stock,

pour le code APHP vous pourriez ajouter une liste de validation sur la cellule cells(Target.Row, 5)

suite à la condition vrai sur la saisi de la colonne 4 (qte)

    With Target.Offset(, 1).Validation
        .Delete
        .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
        xlBetween, Formula1:="=code_APHP"  'plage des code APHP
        .IgnoreBlank = True
        .InCellDropdown = True
        .InputTitle = ""
        .ErrorTitle = ""
        .InputMessage = ""
        .ErrorMessage = ""
        .ShowInput = True
        .ShowError = True
    End With

Alors pour la qte pas de stock c'est le service qui depose qui valide la quantité de prelevement,

Les codes APHP correspond au matricule des agents qui travaillent dans les hôpitaux publics de Paris ma liste ne serai jamais à jours car c'est un matricule unique donc à chaque embauche un numéro est attribué (même pour les stagiaires ) personnellement j'ai un matricule proche 410300 et je suis la que depuis 1 ans et demi, les nouveau arrivant (mois de mars ) ou un numéro proche 510000 soit environs 60000 numeros par an

Mais merci pour tes idées

une autre idée pour le cas des colonnes 1 et 2

je les incluraient plutôt dans la macro Worksheet_SelectionChange

pour être certain que la douchette est utilisée,

il ne resterait que le cas de colonne 5 à vérifier.

serait-il possible de lire ce matricule sur une BD à partir de l'information Application.UserName ?

Édit: une autre possibilité,

Private Sub Worksheet_Change(ByVal Target As Range)
valeur = Target.Value

'ici vérifier tous les conditions
'mettre la variable conditions = VRAI ou FAUX
'des que condition = FAUX aller à fin
If Not Condition Then GoTo fin

fin:
If conditions Then
    ActiveSheet.Unprotect Password:="xx"
    Cells(Target.Column, Target.Column) = x
    ActiveSheet.Protect Password:="xx"
    Exit Sub
Else
    ActiveSheet.Unprotect Password:="xx"
    Target .ClearContents
    MsgBox "raison"
    ActiveSheet.Protect Password:="xx"
End If
End Sub

par exemple pour votre fichier le code serait:

Private Sub Worksheet_Change(ByVal Target As Range)
Dim Msg As String
valeur = Target.Value
cdt = False

If Target.Column > 5 Then Exit Sub
If Target.Count > 1 Then Exit Sub
If Target.Value = "" Then Exit Sub

Select Case Target.Column
    Case 1: Msg = "Le service est composé de 5 chiffres. Merci !"
    Case 2: Msg = "Le NIP du patient est composé de 9 chiffres. Merci !"
    Case 3: Msg = "Selectionner la feuille de demande. Merci !"
    Case 4: Msg = "Saisissez Le nombre de prélèvements (tubes, lames, etc...). Merci !"
    Case 5: Msg = "Saisissez votre code APH. Merci !"
End Select

Select Case Target.Column
    Case 1: If Not Len(Target.Value) = 5 Then GoTo fin
    Case 2: If Not Len(Target.Value) = 10 Then GoTo fin
    Case 3: If Not Len(Target.Value) > 0 Then GoTo fin
    Case 4: If Not Len(Target.Value) > 0 Then GoTo fin
    Case 5: If Not Len(Target.Value) > 1 Then GoTo fin
End Select

cdt = True

fin:
If cdt Then
    ActiveSheet.Unprotect Password:="xx"
    Target = valeur

    If Application.CountA(Range("A" & Target.Row & ":E" & Target.Row)) = 5 Then
      Range("A" & Target.Row & ":E" & Target.Row).Locked = True
    End If

    ActiveSheet.Protect Password:="xx"
    Exit Sub
Else
    Target.ClearContents
    MsgBox Msg
End If
End Sub

Si j'ai bien compris le Application.UserName ne récupère que l'identifiant du propriétaire excel?

Ton code est plus épurer, moi qui adore le Goto, j'aurai pu y pensée

et merci pour l'idée des colonnes 1 et 2

Je viens de trouver mon erreur mon ActiveSheet.Unprotect Password:="xx"

était en commentaire, et trop en amont du code,

du coup on a :

ActiveSheet.Unprotect Password:="xx"
                target.Offset(, 1).Value = Now
                Range("A" & target.Row).Resize(1, 6).Locked = True

Et la ma ligne est verrouillée et non sectionnable

Si tu as d'autres idées je suis preneur

un autre essai...

Private Sub Worksheet_Change(ByVal Target As Range)
Dim Msg As String
cdt = False

If Target.Column > 5 Then Exit Sub
If Target.Count > 1 Then Exit Sub
If Target.Value = "" Then Exit Sub

Select Case Target.Column
    Case 1: Msg = "Le service est composé de 5 chiffres. Merci !"
    Case 2: Msg = "Le NIP du patient est composé de 9 chiffres. Merci !"
    Case 3: Msg = "Selectionner la feuille de demande. Merci !"
    Case 4: Msg = "Saisissez Le nombre de prélèvements (tubes, lames, etc...). Merci !"
    Case 5: Msg = "Saisissez votre code APH. Merci !"
End Select

Select Case Target.Column
    Case 1: If Not Len(Target.Value) = 5 Then GoTo fin
    Case 2: If Not Len(Target.Value) = 10 Then GoTo fin
    Case 3: If Not Len(Target.Value) > 0 Then GoTo fin
    Case 4: If Not Len(Target.Value) > 0 Then GoTo fin
    Case 5: If Not Len(Target.Value) > 1 Then GoTo fin
End Select

cdt = True

fin:
If cdt Then
    If Application.CountA(Range("A" & Target.Row & ":E" & Target.Row)) = 5 Then
     ActiveSheet.Unprotect Password:="xx"
       Range("A" & Target.Row & ":E" & Target.Row).Locked = True
     ActiveSheet.Protect Password:="xx"
    End If
Else
    Target.ClearContents
    MsgBox Msg
End If
End Sub

C'est le même que le précédent ?

Sinon je vais vite allez dormir !

Encore merci! et bravo

j'ai pas d'autre idées, alors bonne nuit

Rechercher des sujets similaires à "verrouillage ligne"