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