La validation de données bouge dans mon tableau

Bonjour à tous,

J'ai un tableau avec dans une des colonnes la description du type de critère et dans la colonne à sa gauche une colonne vide où je remplirai le résultat du critère.

S'il s'agit d'un critère booléen, je souhaite bloquer toutes les cellules de résultat où est indiqué "booléen" à sa droite pour qu'on ne puisse qu'inscrire 0, 1 ou NA.

S'il s'agit d'un critère textuel, je souhaite bloquer toutes les cellules de résultat où est indiqué "text" à sa droite pour qu'on ne puisse inscrire que du texte.

De même pour les dates et les critères numériques.

Je faisais la sélection et la validation de données aisément, en filtrant les critères ou en les classant.

Le problème, c'est que la validation de données se bloque sur "l'adresse" de sa cellule et non pas sur le contenu de la cellule en elle-même. Je m'explique, quand j'ai fait la validation de données de toutes les cellules correctement, il suffit que je trie ce même tableau en tenant compte de la cellule D comme trieur, tout se décale et un critère textuel peut alors se trouver bloqué et ne pouvoir recevoir que des dates... et cela change à chaque nouveau tri.

Savez-vous s'il existe une solution à ce problème?

un grand merci.

Marie

Bonjour,

As tu un fichier de démo à partager pour rendre ton problème moins abstrait pour nous ?

Bonjour,

Eh voici. Il suffit que vous triiez le tableau par rapport aux critères et vous verrez le problème apparaitre.

Merci pour votre aide.

4aide-excel.xlsx (38.59 Ko)

Un essai avec une macro à placer dans le module VBA de la feuille concernée (feuille 1 dans le fichier exemple) :

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

If Target.Column = 7 Then 'Si la cellule selectionnée appartient à la colonne G
    Select Case Target.Offset(0, 1).Value 'Contrôlé le contenu de la colonne suivante (colonne H)
        Case "Boolean"
            With Target.Validation
                .Delete
                .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:="=Feuil2!$A$1:$C$1"
                .ErrorTitle = "Critère booléen"
            End With
        Case "Date"
            With Target.Validation
                .Delete
                .Add Type:=xlValidateDate, AlertStyle:=xlValidAlertStop, Operator:=xlNotEqual, Formula1:="1/1/1900"
                .ErrorTitle = "Saisissez une date"
            End With
        Case "Numeric"
            With Target.Validation
                .Delete
                .Add Type:=xlValidateDecimal, AlertStyle:=xlValidAlertStop, Operator:=xlNotEqual, Formula1:="34567890"
                .ErrorTitle = "Saisissez un nombre"
            End With
        Case "Text"
            With Target.Validation
                .Delete
                .Add Type:=xlValidateCustom, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:="=ESTTEXTE(G95)"
                .ErrorTitle = "Saisissez un texte"
            End With
    End Select
End If

End Sub

La macro se déclenche automatiquement lors de la sélection d'une cellule de la colonne G, et recréée à chaque fois la validation correspondant à l'item en colonne H.

il m'est malheureusement impossible de rajouter un macro dans mon excel... L'entreprise où je travaille bloque malheureusement cette option....

Mais merci beaucoup pour le macro, cela sûrement utile à d'autres :-)

Dans ce cas, tu peux passer par une colonne intermédiaire avec une formule spécifique par type de validation pour afficher VRAI si les conditions de validation sont respectées, FAUX le cas échéant. Ensuite, tu peux faire une validation personnalisée basée sur cette formule.

Voilà une formule possible à mettre dans une colonne dédiée :

=SIERREUR(SI([@[TYPE ]]="Boolean";NB.SI(Feuil2!$A$1:$C$1;[@Résultats])>0;SI([@[TYPE ]]="Text";ESTTEXTE([@Résultats]);SI([@[TYPE ]]="Numeric";ESTNUM([@Résultats]);SI([@[TYPE ]]="Date";ET(ESTNUM([@Résultats]);ENT([@Résultats])=[@Résultats]);""))));FAUX)

Ensuite, formule de validation dédiée du type =I3 (où I contient la formule ci dessus).

Ca a marché, énorme merci ! J'ai cependant une question, est-il possible que pour le type "date", cela indique "vrai" s'il y a une date ou s'il y a un "NA" dans la cellule?

Merci pour votre aide

Ca a marché, énorme merci ! J'ai cependant une question, est-il possible que pour le type "date", cela indique "vrai" s'il y a une date ou s'il y a un "NA" dans la cellule?

Merci pour votre aide

C'est possible, et certainement dans tes cordes !

Si la formule actuelle ne te parles pas, il s'agit juste de l'imbrication de 4 fonctions SI --> une par type de données. Tu peux donc tester des modifications sur une version allégée de la formule (seulement la dernière partie qui concerne le type Date).

PS : je n'ai pas précisé, mais la colonne contenant cette formule peux être masquée une fois qu'elle sera sous sa forme définitive. Si elle est bien incluse dans ton tableau structuré, elle sera étendue automatiquement à l'ajout de nouvelles lignes.

Bonjour,

J'ai essayé de retravailler la formule en ne reprenant que la dernière partie et malheureusement ça ne fonctionne pas ....

pour tester, j'inscris NA dans la cellule de la colonne Résultats et la formule renvoie tout de même la valeur FAUX. Avez-vous une idée de pourquoi? Merci beaucoup

Voici ce que j'ai écrit dans une cellule: =SI([@[TYPE ]]="Date";ET(ESTNUM([@Résultats]);ENT([@Résultats])=[@Résultats]);[@Résultats]="NA"))

Bonjour,

Actuellement, la dernière partie de la formule n'est exécutée que si le type n'est pas "Date", car vous avez inscrit [@Résultats]="NA" dans l'argument ValeurSiFaux de la fonction SI(Condition;ValeurSiVrai;ValeurSiFaux). A mon avis ce n'était pas l'objectif initial.

Votre question écrite sous forme de texte vous indique la bonne réponse :

est-il possible que pour le type "date", cela indique "vrai" s'il y a une date ou s'il y a un "NA" dans la cellule?

Il faut ajouter une option dans l'argument ValeurSiVrai utilisant la fonction OU(). Ce qui donne quelque chose du genre :

=SI([@[TYPE ]]="Date";OU(ET(ESTNUM([@Résultats]);ENT([@Résultats])=[@Résultats]);[@Résultats]="NA");"Hello world !"))

Littéralement, si le type est "Date", alors on vérifie que résultat contient "NA" ou que c'est un nombre et que ce nombre est un entier. Si le type n'est pas "Date", ici on inscrit "Hello world !" (dans la vraie formule, soit on test un nouveau type, soit on renvoie une valeur quelconque qui signifie que type ne correspond à aucun des types attendus ("Boolean", "Text", etc).

Bonjour,

Merci pour votre aide.

j'ai essayé d'appliquer la formule mais sans succès... Lorsqu'il s'agit d'une date, la validation de données bloque si j'inscris NA...

Voici la formule que j'ai inscrite dans la colonne N et dont dépend ma validation de données :

=SIERREUR(SI(I70="Boolean";NB.SI(Datatype!$B$2:$D$2;H70)>0;SI(I70="Text";ESTTEXTE(H70);SI(I70="Numeric";ESTNUM(H70);SI(I70="Date";OU(ET(ESTNUM(H70);ENT(H70)=H70);H70="NA");""))));FAUX)

Avec la colonne H les résultats et I le type.

Comprenez-vous d'où vient l'erreur?

Merci à vous.

Marie

Enfait il y a une erreur dans la formule OU lorsque je rentre NA dans la cellule de la colonne H.

Cela indique #Valeurs! comme la capture d'écran vous le montre. Je n'arrive pas à trouver une solution. J'ai essayé de mettre un SIERREUR mais cela ne marche pas.

image

Bonjour,

Oui, l'erreur vient d'ici : ENT(H70)=H70

En effet, si le contenu de la colonne n'est pas un nombre, cette fonction renverra une erreur et ce sera donc cette partie qui s'appliquera =SIERREUR(Formule;FAUX). Soit on considère que la vérification numérique est suffisante et le contrôle d'un entier superflu, auquel cas il suffit de supprimer purement et simplement cette partie de la formule, et retirer la fonction ET(), soit on procède en 2 temps : vérification numérique d'abord, puis si c'est bien un nombre, on vérifie des conditions supplémentaires. Un essai pour ce second cas :

=SIERREUR(SI(I70="Boolean";NB.SI(Datatype!$B$2:$D$2;H70)>0;SI(I70="Text";ESTTEXTE(H70);SI(I70="Numeric";ESTNUM(H70);SI(I70="Date";SI(ESTNUM(H70);ET(ENT(H70)=H70;H70>0);H70="NA");""))));FAUX)

Votre capture écran corrobore ce que je viens d'écrire à l'instant : la vérification de l'entier n'est pas pertinente si la cellule ne contient pas un nombre (d'où l'erreur #VALEUR!)

J'avais également pensé à la première solution mais elle ne me satisfaisait pas car je voulais garder toutes les conditions.

Merci pour la seconde solution, qui marche parfaitement ! Merci pour votre patience.

Excellente journée à vous,

Marie

Merci pour votre retour, c'est un sujet intéressant que je ne manquerais pas de réutiliser je pense.

Bonne journée !

Rechercher des sujets similaires à "validation donnees bouge mon tableau"