2009-12-15 5 views
2

J'ai des difficultés à créer une formule de recherche inhabituelle dans Excel.Excel: besoin d'aide avec une fonction de recherche inhabituelle (la colonne triée est différente de la colonne de recherche)

Normalement, j'utiliserais VLOOKUP(), mais le piège est que je veux rechercher un nombre dans une colonne d'une table qui est triée sur une autre colonne. Vlookup peut uniquement rechercher des éléments sur la colonne triée elle-même.

Le scénario est la suivante:

  • Le tableau est trié sur la colonne B. croissant
  • Pour un paramètre P donné, je veux maintenant trouver la première valeur A, en partant du haut et descendant, cela est supérieur ou égal à ce paramètre P.
  • La fonction doit alors retourner la valeur B correspondante.

Tableau (partie hors, la table complète est beaucoup plus grand):

A  B 
1 640 4.5 
2 1600 7.0 
3 640 7.5 
4 1280 12.0 
5 1920 16.5 
6 2560 21.0 
7 1600 19.8 
8 3200 26.8 
9 4800 33.8 

Par exemple, dire que mon paramètre est 1100, alors je veux que ma formule pour revenir 7.0, parce que la première entrée Lorsque la recherche vers le bas dans la colonne A qui est supérieure ou égale à 1100 est 1600, qui a une valeur B correspondante de 7,0

J'ai tenté ma chance avec Array Formula's (également connu sous le nom de "ctrl-shift-enter formula's") et construit quelque chose comme ça:

{=INDEX(table; 
     MATCH(MIN(IF(columnA-$C1>=0;columnA;FALSE)); 
       IF(columnA-$C1>=0;columnA;FALSE); 
       0); 
     2)} 

avec C1 contenant mon paramètre, tableau la gamme A1: B9 et COLUMNA la gamme B1: B9

Mais cela ne fonctionne pas (dans l'exemple ci-dessus, renvoie 12.0 car 1280 est sélectionné par la fonction MIN()).

Solution Je ne veux pas utiliser: je pourrais écrire quelques VBA pouvait pour passer par la table, mais je ne veux pas le faire (à cause des « avertissements macro » ennuyeux, et parce que Excel sur Mac ne supporte plus VBA)

Quelqu'un at-il des indices?

+0

Si c'était moi, j'essaierais probablement d'utiliser une table de tableau croisé dynamique ou utiliserais MS Access pour interroger les données puisqu'elles manipulent beaucoup mieux "l'affaire de question" et l'agrégation de données. Cependant, ce n'est peut-être pas le type de solution que vous cherchez. –

+0

@Ben: non en effet. Les tableaux croisés dynamiques sont très utiles mais je les trouve un peu compliqués quand on ne les utilise pas tous les jours (comme c'est le cas pour moi). Et je veux garder la solution/problème dans un programme, pas besoin d'accès :-) – Rabarberski

Répondre

4

Vous pouvez utiliser

{=INDEX(B1:B9,MIN(IF(A1:A9>C1,ROW(A1:A9),FALSE)))} 

Notez que j'utilise les paramètres de langue anglaise au Royaume-Uni - vous devrez modifier la formule pour correspondre à vos paramètres régionaux, en remplacement des virgules avec des points-virgules, etc.

+0

Merci! Votre solution m'a fait partir. J'ai dû ajouter une petite correction pour que ma table ne démarre pas au premier rang. Je l'ai changé pour {= INDEX (B1: B9, MIN (IF (A1: A9> C1, ROW (A1: A9), FAUX)) - ROW (A1: A9) +1)} qui fonctionne maintenant bien. Merci encore! – Rabarberski

1

Si vous ne vouliez pas une formule matricielle que vous pourriez essayer = OFFSET ($ C $ 5, MATCH ($ A $ 17, B5: B13), 0) où C5 est le début de votre colonne B, B5: B13 est vous A colonne et A17 est-ce que vous avez de la valeur?

Ninja edit: Voici une version qui fonctionne pour le moins de ou égal à peu de votre spécification. = OFFSET (5 $ CAN, SI (ISNA (MATCH (17 $ CAN, B5: B13,0)), SI (ISNA (MATCH (17 $ CAN, B5: B13)), 0, MATCH (17 $ CAN, B5: B13)), MIN (MATCH ($ A $ 17, B5: B13,0) -1, MATCH ($ A $ 17, B5: B13)), 0)

+0

Si possible, je préférerais ne pas utiliser de formules matricielles. Mais malheureusement, la formule ne fonctionne pas à cause de la façon dont MATCH() fonctionne. Deux problèmes: (a) il ne donne pas de valeur inférieure à la première valeur A de la liste, (b) il donne la valeur suivante lorsqu'une valeur correspond à un élément de la colonne A. Merci pour l'effort si !! – Rabarberski

+0

Ajouté la version mise à jour – avid

+0

Wow, mise à jour rapide. Cependant, je suis déjà parti avec la solution d'AdamRalph. Vous n'avez pas vérifié votre ninja-edit car cela demande beaucoup d'exercice cérébral :-) – Rabarberski

0

En supposant que la table de données est dans la plage A2 : B10, avec la valeur que vous recherchez dans la cellule B1, ce qui suit semble fonctionner:

=IF(B1<A2,B2,IF(ISNA(VLOOKUP(B1,$A$2:$B$10,2,FALSE)),INDEX(B2:B10,MATCH(B1,A2:A10)+1),VLOOKUP(B1,$A$2:$B$10,2,FALSE))) 

J'ai effectué cela en compte lorsque la valeur de recherche est plus petite que l'une des valeurs dans la liste.

+0

Merci pour l'effort! Comme je l'ai expliqué dans le post d'avid, c'est effectivement un problème. – Rabarberski

Questions connexes