Validation des données 'différent de liste

Bonjour tout le monde.

Habituellement, dans une validation des données sur Excel, nous pouvons faire '=liste' , de manière à ce que les données de la liste uniquement soient acceptées en saisie.

Hors, je voudrais faire l'inverse, c'est à dire une liste qui recense les saisies interdites, et faire accepter ceci par la validation des donnés, qui refusera alors une saisie si cette dernière est une valeur appartenant à la liste en question.

Est ce possible ?

Merci par avance.

Bonjour,

Sur une liste faite à partir de la validation des données, je ne connais pas d'astuce de ce genre, par contre, on peut très bien utiliser l'évènement worksheet change pour faire ça, quand tu changes une cellule sur laquelle tu veux mettre une "validation des données", la macro continue et vérifie si la valeur fait partie de la liste interdite, si c'est le cas, affichage d'un message, on vide la cellule, on la resélectionne.

Voici un fichier exemple, tu pourras aller voir le code plus en détail :

Merci beaucoup, ca fontionne presque!

J'ai une liste prédéfinie, qui s'appelle par exemple "liste_historique". Comment déclaré une liste à laquelle j'ai donné un nom en guise d'interdit?

J'ai essayé liste = liste_historique

mais ça me fait une erreur de type "incompatibilité de type".

Mon code modifié =

Private Sub Worksheet_Change(ByVal Target As Range)

If Not Intersect(Target, Range("AT:AT")) Is Nothing Then 'restreint les cellules où on vérifie la valeur à A1

If Target = "" Then Exit Sub 'on quitte le programme si la cellule est vide

liste = liste_historique 'on déclare la liste des interdits ici, on peut le faire autrement

For i = LBound(liste, 1) To UBound(liste, 1) 'on parcourt la liste des interdits pour voir si la valeur en fait partie

If Target = liste(i) Then

MsgBox "La valeur saisie fait partie de la liste des interdits.", vbCritical, "Donnée invalide"

Target = "" 'on vide la cellule

Target.Select 'et on la resélectionne

Exit For 'comme on a plus besoin de chercher, on quitte la boucle

End If

Next i

End If

End Sub

Merci!

Bonjour,

tu y es presque, seulement, tu ne peux pas simplement lui donner le nom de la plage nommée, parce que VBA va comprendre que tu lui passe une variable, mais pas une variable du gestionnaire de noms, pour ce faire, il faut rajouter Range avec le nom de la plage nommée, voici le code en retour:

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("AT:AT")) Is Nothing Then 'restreint les cellules où on vérifie la valeur à A1
    If Target = "" Then Exit Sub 'on quitte le programme si la cellule est vide
        liste = Range(liste_historique) 'on déclare la liste des interdits ici, on peut le faire autrement
        For i = LBound(liste, 1) To UBound(liste, 1) 'on parcourt la liste des interdits pour voir si la valeur en fait partie
            If Target = liste(i, 1) Then
                MsgBox "La valeur saisie fait partie de la liste des interdits.", vbCritical, "Donnée invalide"
                Target = "" 'on vide la cellule
                Target.Select 'et on la resélectionne
                Exit For 'comme on a plus besoin de chercher, on quitte la boucle
            End If
        Next i
    End If
End If
End Sub

Tu avais oublié des end if, les tabulations aident bien à voir ce genre d'erreurs, liste = liste_historique a été remplacé par liste = Range(liste_historique), comme on change la façon de déclarer, on doit aussi changer un détail dans le tableau "liste", en le déclarant comme ça, il devient obligatoirement un tableau à deux dimensions, il faudra à chaque fois préciser la colonne, j'ai donc changé liste(i) par liste(i,1).

Bonjour et un immense merci encore pour tout tes conseils.

J'ai pris le code que tu m'a donné, mais il m'annonce un end if en trop (voir PJ). Ai-je fait une mauvaise manipulation?

capture

J'ai du coup sorti un END IF, mais j'ai le débogage ci-dessous.

Désolé, je ne suis pas assez calé VBA, et surtout cette notion de Worksheet_change, pour m'en sortir seul..

capture2

Re

En effet, il y a un If en trop, mais pas là où tu l'as supprimé, voici le code corrigé, merci de me dire si tu as encore un message d'erreur:

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("AT:AT")) Is Nothing Then 'restreint les cellules où on vérifie la valeur à A1
    If Target = "" Then Exit Sub 'on quitte le programme si la cellule est vide
    liste = Range(liste_historique) 'on déclare la liste des interdits ici, on peut le faire autrement
    For i = LBound(liste, 1) To UBound(liste, 1) 'on parcourt la liste des interdits pour voir si la valeur en fait partie
        If Target = liste(i, 1) Then
            MsgBox "La valeur saisie fait partie de la liste des interdits.", vbCritical, "Donnée invalide"
            Target = "" 'on vide la cellule
            Target.Select 'et on la resélectionne
            Exit For 'comme on a plus besoin de chercher, on quitte la boucle
        End If
    Next i
End If
End Sub

Encore un grand merci pour ta patience.

J'ai encore un code erreur, j'ai monté un fichier simplifié similaire à celui que lequel je travaille, tu trouveras en colonne AT la colonne de saisie.

Lorsque je saisie une date, quelle qu'elle soit, j'ai un débogage.

je te remercie encore grandement pour ton aide.

4test1202.xlsm (18.33 Ko)

Re,

De rien

En effet, on a une erreur, mais comme j'ai un fichier pour voir où ça pose problème, j'ai pu corrigé ça rapidement

Le souci vient de cette ligne:

liste = Range(liste_historique)

On donne encore une variable liste_historique non déclarée pour la référence de l'objet Range, du coup ça plante...

Il faut donner ce nom de plage en texte pour que ça fonctionne correctement:

liste = Range("liste_historique")

Voilà

Cela fonctionne, je te remercie grandement pour ton aide précieuse, efficace et rapide.

De rien

Par contre, seul toi peut passer le sujet en résolu, pas moi

oui pardon, je me suis trompé de bouton

Rechercher des sujets similaires à "validation donnees different liste"