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 If

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

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

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

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

Re,

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 Sub

Merci 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

Case 4: If Len(Target.Value) >1 Then Msg = "" Else Msg = "Saisir pour la colonne 4. Merci !"

Mais ca ne fonctionne pas

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

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

Rechercher des sujets similaires à "verification contenu continuer"