Vérification du contenu d'une cellule avant de continuer
Bonjour à tous,
Le titre n'est pas complet il manque : " La macro !"
Bref je suis donc devant un petit problème, que je n'arrive pas à contourner( ou à résoudre)
Dans mon fichier Excel je saisie 4 données ( via une douchette) à chaque donnée saisie je passe à la cellule adjacente sans problème. Lorsque les 4 saisie sont faite je passe à la ligne suivante avec ce code :
i = Range("A1048576").End(xlUp).Row + 1
j = ActiveCell.Column
If j < 4 Then
Cells(i - 1, j + 1).Select
Else
Cells(i, 1).Select
End If
Mais j'aimerai pouvoir verifier le nombre de digit saisie dans chaque cellule avant de poursuivre du coup pour la première cellule le nombre de digit = 5 donc mon code devient
i= Range("A1048576").End(xlUp).Row + 1
j = ActiveCell.Column
If Len(Cells(i - 1, 1)) = 5 Then
If j < 4 Then
Cells(i - 1, j + 1).Select
Else
Cells(i, 1).Select
End If
Else
MsgBox ("Saisir le service Merci !")
End IfEt là encore aucun problème par contre pour les données saisies en colonne 2 je n'arrive pas à introduire la vérification pour 11 digit et idem en colonne 3 pour 13 digits. et je dois également en cas d'erreur introduire une messagebox pour le signaler à l'utilisateur...
je me perd sans doute dans les If et il y a peut êtres plus simple pour aborder ceci.
Si vous avez des idées je vous en remercie,
Bonjour,
Peut être comme ceci ?
Sub Test()
Dim OK As Boolean
i = Cells(Rows.Count, 1).End(xlUp).Row + 1 'avec Rows.Count sinon, ça foire si c'est un .xls et non un .xlsx !
j = ActiveCell.Column
Select Case j
Case 1: If Len(Cells(i - 1, 1)) = 5 Then OK = True Else OK = False
Case 2: If Len(Cells(i - 1, 1)) = 11 Then OK = True Else OK = False
Case 3: If Len(Cells(i - 1, 1)) = 13 Then OK = True Else OK = False
End Select
If OK = True Then
If j < 4 Then Cells(i - 1, j + 1).Select Else Cells(i, 1).Select
Else
MsgBox ("Saisir le service Merci !")
End If
End SubJe test cela dans la soirée merci pour cette réponse rapide et qui as vue de nez repond à mon problème.
Il va falloir que je approfondisses ces histoires de Case. ...
Sinon peut te on associer la valeur de la case à une msgbox?
Car mon message devra varié selon la cellule testée.
Merci
Re,
avec une variable String que tu adapte dans le Select Case :
Sub Test()
Dim Msg As String
i = Cells(Rows.Count, 1).End(xlUp).Row + 1
j = ActiveCell.Column
Select Case j
Case 1: If Len(Cells(i - 1, 1)) = 5 Then Msg = "" Else Msg = "Saisir pour la colonne 1. Merci !"
Case 2: If Len(Cells(i - 1, 1)) = 11 Then Msg = "" Else Msg = "Saisir pour la colonne 2. Merci !"
Case 3: If Len(Cells(i - 1, 1)) = 13 Then Msg = "" Else Msg = "Saisir pour la colonne 3. Merci !"
End Select
If Msg = "" Then
If j < 4 Then Cells(i - 1, j + 1).Select Else Cells(i, 1).Select
Else
MsgBox Msg
End If
End SubBonsoir Theze,
Bon et bien c'est presque parfait mais je reste bloqué sur deux petits problèmes qui me semblaient simple,
La message box se déclenche dès qu'une nouvelle cellule vierge est sélectionnée, je n'arrive pas à exclure le message dans le cas ou la valeur de la cellule= "" lorsque le curseur la sélectionne.
Mais j'aimerai que cette valeur déclenche le message si la cellule n'as pas été remplit...
Et il faudrait pouvoir sortir de la sub après chaque message d'erreur et / ou rester sur la cellule qui n'as pas été correctement compléter
et la je bloque aussi
J'espères que je suis à peu près claire, c'est jamais facile d'expliquer comment résoudre un probleme quant on a pas réussi soit même
Bonjour,
Pour sortir d'une Sub(), utilise l'instruction "Exit Sub"
Comme je ne sais pas comment tu déclenche ta macro, je ne peux pas vraiment t'aider !
Tu utilises une procédure évènementielle de la feuille, "Worksheet_Change" ou "Worksheet_SelectionChange" peut être ?
Bonjour Theze,
yes exactement, à chaque modification d'une cellule de l'onglet la macro se déclenche. Voici mon code complet pour l'instant
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Msg As String
ActiveSheet.Unprotect Password:="xx"
If Target.Cells <> "" Then ' préparation du verrouillage des cellules lorsqu'elle sont saisie
Target.Locked = True
Else
Target.Locked = False
End If
i = Cells(Rows.Count, 1).End(xlUp).Row + 1
j = ActiveCell.Column
Select Case j
Case 1: If Len(Cells(i - 1, 1)) = 5 Then Msg = "" Else Msg = "Saisir pour la colonne 1. Merci !"
Case 2: If Len(Cells(i - 1, 1)) = 11 Then Msg = "" Else Msg = "Saisir pour la colonne 2. Merci !"
Case 3: If Len(Cells(i - 1, 1)) = 13 Then Msg = "" Else Msg = "Saisir pour la colonne 3. Merci !"
End Select
If Msg = "" Then
If j < 4 Then Cells(i - 1, j + 1).Select Else Cells(i, 1).Select
Else
MsgBox Msg
End If
ActiveSheet.protect Password:="xx"
end subre bonjour à tous,
Bon je bloque toujours sur cette petite macro, après réflexion ( et d'après ton poste) je penses que deux macro doivent êtres rédiger une qui gère les changements de sélection et une qui check pour chaque modification, es ce une bonne idée ??? ( j'ai essayer mais je dois m'emmêler les pinceaux entre les deux et j'y arrive toujours pas
Si vous avez d'autres idées je suis prenneur
Et Merci pour les réponses déjà fournies.
Je suis sur mon iPhone et ce soir je ne suis pas disponible mais je regarde demain matin pour te pondre un code qui te convienne !
Ok Merci,
y a pas d'urgence, mais j'avoue que ca m'énerve de tournée autour de la solution sans l'atteindre, Si tu as du temps ce week end je suis preneur, mais ne te pourri pas tes journées avec ca
Bon je continue de chercher on ne sais jamais j'ai déjà eu quelques illuminations
Bon, j'ai trouvé un petit moment pour pondre un code, à voir si il te convient :
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Msg As String
'seulement pour les colonnes de A à D (ne fait rien pour celles au dessus)
If Target.Column > 4 Then Exit Sub
'si la cellule est vide, sortie de procédure
If Target.Value = "" Then Exit Sub
ActiveSheet.Unprotect Password:="xx"
'verrouille si la cellule n'est pas vide.
'Il serait peut être mieux de la verrouiller si la saisie est conforme c'est à dire dans la partie [If Msg = "" Then]
Target.Locked = Target.Value <> ""
Select Case Target.Column
Case 1: If Len(Target.Value) = 5 Then Msg = "" Else Msg = "Saisir pour la colonne 1. Merci !"
Case 2: If Len(Target.Value) = 11 Then Msg = "" Else Msg = "Saisir pour la colonne 2. Merci !"
Case 3: If Len(Target.Value) = 13 Then Msg = "" Else Msg = "Saisir pour la colonne 3. Merci !"
End Select
If Msg = "" Then
If Target.Column < 4 Then Target.Offset(, 1).Select Else Target.Offset(1, -3).Select
Else
MsgBox Msg
Target.Select 're-sélectionne la cellule pour une autre saisie !
Target.Value = ""
End If
ActiveSheet.Protect Password:="xx"
End SubRe,
Petite correction, j'ai oublié de prendre en compte le fait que Target.Count peut être supérieur à 1:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Msg As String
'seulement pour les colonnes de A à D (ne fait rien pour celles au dessus)
If Target.Column > 4 Then Exit Sub
'par exemple si sélection de plusieurs cellules puis appui sur suppr
If Target.Count > 1 Then Exit Sub
'si la cellule est vide, sortie de procédure
If Target.Value = "" Then Exit Sub
ActiveSheet.Unprotect Password:="xx"
'verrouille si la cellule n'est pas vide.
'Il serait peut être mieux de la verrouiller si la saisie est conforme c'est à dire dans la partie [If Msg = "" Then]
Target.Locked = Target.Value <> ""
Select Case Target.Column
Case 1: If Len(Target.Value) = 5 Then Msg = "" Else Msg = "Saisir pour la colonne 1. Merci !"
Case 2: If Len(Target.Value) = 11 Then Msg = "" Else Msg = "Saisir pour la colonne 2. Merci !"
Case 3: If Len(Target.Value) = 13 Then Msg = "" Else Msg = "Saisir pour la colonne 3. Merci !"
End Select
If Msg = "" Then
If Target.Column < 4 Then Target.Offset(, 1).Select Else Target.Offset(1, -3).Select
Else
MsgBox Msg
Target.Select 're-sélectionne la cellule pour une autre saisie !
Target.Value = ""
End If
ActiveSheet.Protect Password:="xx"
End SubMerci je test ça dès que je ai excel sous le coude. Bonne idée de gérer via la target plus tôt que ce que je essayai de mettre en place avec l.activesheet.
Bonne soirée et bon week-end
Bonjour Theze,,
Impeccable je viens de tester grandeur nature c'est exactement ca qu'il me faut.
Parcontre j'arrive pas à modifier ton code pour deux petit détails :
- -ajouter la verification de la saisie en colonne 4 pour que le nombre de caractère soit sup à 1
Mais ca ne fonctionne pasCase 4: If Len(Target.Value) >1 Then Msg = "" Else Msg = "Saisir pour la colonne 4. Merci !"
--écrire la date et l'heure( = now) dans la colonne E lorsque les 4 premières colonnes sont remplit. As tu une idée pour réaliser ceci ?
J'ai effectivement suivi ton conseil pour le verrouillage des cellules que j'ai déplacer après le "If msg ...." c'est beaucoup plus cohérent avec la vérification de saisie.
A bientôt
Bonjour,
Testes pour voir :
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Msg As String
'ActiveSheet.Unprotect Password:="xx"
'seulement pour les colonnes de A à D (ne fait rien pour celles au dessus)
If Target.Column > 4 Then Exit Sub
'par exemple si sélection de plusieurs cellules puis appui sur suppr
If Target.Count > 1 Then Exit Sub
'si la cellule est vide, sortie de procédure
If Target.Value = "" Then Exit Sub
'verrouille si la cellule n'est pas vide.
'Il serait peut être mieux de la verrouiller si la saisie est conforme c'est à dire dans la partie [If Msg = "" Then]
Target.Locked = Target.Value <> ""
Select Case Target.Column
Case 1: If Len(Target.Value) = 5 Then Msg = "" Else Msg = "Saisir pour la colonne 1. Merci !"
Case 2: If Len(Target.Value) = 11 Then Msg = "" Else Msg = "Saisir pour la colonne 2. Merci !"
Case 3: If Len(Target.Value) = 13 Then Msg = "" Else Msg = "Saisir pour la colonne 3. Merci !"
Case 4: If Len(Target.Value) > 1 Then Msg = "" Else Msg = "Saisir pour la colonne 4. Merci !"
End Select
If Msg = "" Then
If Target.Column < 4 Then Target.Offset(, 1).Select Else Target.Offset(1, -3).Select
If Target.Column = 4 Then
If Target.Offset(, -3).Value <> "" _
And Target.Offset(, -2).Value <> "" _
And Target.Offset(, -1).Value <> "" _
And Target.Value <> "" Then
Target.Offset(, 1).Value = Now
End If
End If
Else
MsgBox Msg
Target.Select 're-sélectionne la cellule pour une autre saisie !
Target.Value = ""
End If
'ActiveSheet.Protect Password:="xx"
End SubMERCI Theze,
c'est juste parfait, je comprend pas pourquoi ma ligne pour la verif de la colonne 4 ne fonctionnait pas. Je pense avoir tester à fond ton code ( simple n plus) et dans tous les sens!
j'ai hâte d'avoir le même genre d’idée quand je fais une macro....
Je Valide et à très bientôt sur le net
Merci à toi et à la prochaine !