Problème avec liste sans doublons et sans blancs...

Christian0258

XLDnaute Accro
Bonjour à tout le forum,

Je souhaiterais votre aide, je bute en effet sur une liste de validation, sans doublons et sans blancs, qui ne me prends pas certains codes...

fichier joint...

Merci pour votre aide.

Bien amicalement,
Christian
 

Pièces jointes

  • ListeValidationSansDoublon.zip
    4.4 KB · Affichages: 75

Tibo

XLDnaute Barbatruc
Re : Problème avec liste sans doublons et sans blancs...

Bonjour Christian,

Cela est dû au fait que le caractère * est un caractère générique utilisé pour remplacer n'importe quelle chaine de caractères.

Une solution, qui consiste à remplacer le caractère * par un autre, le temps du traitement, puis de remettre le * à la fin :

Code:
=SUBSTITUE(INDEX(SUBSTITUE(champ;"*";"µ");PETITE.VALEUR(SI(NON(ESTNA(EQUIV(
SUBSTITUE(champ;"*";"µ");SUBSTITUE(champ;"*";"µ");0)));SI((EQUIV(SUBSTITUE(
champ;"*";"µ");SUBSTITUE(champ;"*";"µ");0)=LIGNE(INDIRECT("1:"&LIGNES(champ))))*
(champ>0)*(champ<>"");EQUIV(SUBSTITUE(champ;"*";"µ");SUBSTITUE(champ;"*";"µ");0)))
;LIGNE(INDIRECT("1:"&LIGNES(champ)))));"µ";"*")

On peut raccourcir en nommant la partie SUBSTITUE(champ;"*";"µ")

Je te laisse essayer et adapter

@+
 

JeanMarie

XLDnaute Barbatruc
Re : Problème avec liste sans doublons et sans blancs...

Bonsoir

La résolution du problème par Tibo, est bonne. Mais on peut la simplifier, les caractères génériques peuvent être neutralisés par l'ajout d'un caractère ~ devant le symbole. Dans ce cas, le * caractère est pris comme un caractère normal.

Dans la formule, il suffit simplement de remplacer dans la valeur à rechercher le caractère *, par ~*, par la fonction SUBSTITUE. Il n'est nullement besoin de le faire pour la plage de recherche. Ce qui donne
Code:
=INDEX(champ;PETITE.VALEUR(SI(NON(ESTNA(EQUIV(SUBSTITUE(champ;"*";"~*");champ;0)));SI((EQUIV(SUBSTITUE(champ;"*";"~*");champ;0)=LIGNE(INDIRECT("1:"&LIGNES(champ))))*(champ>0)*(champ<>"");EQUIV(SUBSTITUE(champ;"*";"~*");champ;0)));LIGNE(INDIRECT("1:"&LIGNES(champ)))))

Je n'ai pas analysé la formule du fichier, il me semble que l'on peut l'alléger.

@+Jean-Marie
 

JeanMarie

XLDnaute Barbatruc
Re : Problème avec liste sans doublons et sans blancs...

Bonjour

Christian, dans ta formule d'origine, tu as une condition qui ne sert à rien, le résultat étant invariablement à VRAI. Je veux parler de cette condition :
Code:
NON(ESTNA(EQUIV(champ;champ;0)))
Tu testes par la fonction EQUIV que la valeur des données "champ" se trouve bien dans "champ" qui est un obligation en soit.

Autre points :
° Dans une matricielle, on peut très bien définir une plage de donnée entière, mais cela dépend de son emplacement. Dans ta formule, La plage d'INDEX peut-être définie en tant que colonne entière, INDEX ne recevant de PETITE.VALEUR qu'une seule donnée. Cette notion de plage entière simplifiera la suite de La formule.

° Ta condition ET (*) dans le critère de la fonction SI, est à éviter. Il vaut mieux passé par une véritable SI(...;SI(...;...;...);...). Excel ne calculant pas toute la formule, mais uniquement ce qui est nécessaire, tu gagnes sur les temps de calcul en conditionnant la fonction d'EQUIV.

° Cette double condition ne sert à rien(champ>0)*(champ<>""), il suffit de mettre : champ<>"". Champ ne contenant que des données de types texte.

° Si la donnée "Champ" doit être affichée, tu recherches de nouveau par la fonction EQUIV la position de la valeur dans "Champ", il est préférable de reprendre la position de l'index matricielle dans la matrice LIGNE.
Par l'utilisation de la plage entière dans INDEX, on supprime la notion de décaler que tu as dans la formule.
Code:
LIGNE(INDIRECT("1:"&LIGNES(champ)))
on le remplace par
Code:
LIGNE(champ)
.

Ce qui donne au final.
Code:
=INDEX(A:A;PETITE.VALEUR(SI(champ<>"";SI(EQUIV(SUBSTITUE(champ;"*";"~*");champ;0)=LIGNE(INDIRECT("1:"&LIGNES(champ)));LIGNE(champ)));LIGNE(INDIRECT("1:"&LIGNES(champ)))))

N'hésite pas à demander des précisions.

@+Jean-Marie
 

Discussions similaires

Statistiques des forums

Discussions
312 113
Messages
2 085 426
Membres
102 888
dernier inscrit
medoit