Recherche dans un tableau

Bonjour,

J'explique mon problème,

J'ai un tableau qui compare des produits entre eux. Pour effectuer cette comparaison, il va chercher dans une matrice la valeurs de comparaison via un INDEX-EQUIV.

Or, la valeur qu'il (INDEX-EQUIV) retourne ne correspond pas à la valeur dans ma matrice.

Une idée ?

Fichier avec le tableau* de comparaison (ResultatAnalyse): https://www.cjoint.com/c/EHdj16ZzdjM

Fichier avec la matrice de comparaison (MatriceCommuns): https://www.cjoint.com/c/EHdj3iv16nM

*tableau "carré" avec mise en forme conditionnelle (vert).

Je pense que le problème réside dans les formules que j'utilise dans mon tableau, en effet je suis pas très à l'aise avec l'utilisation des formules excel, alors si vous pouvez m'aider...

N.B.: Il faudra peut être adapter les chemins d'accès au fichier.

Bonjour,

Les formules ont l'air normales. Où y a-t-il erreur ?

Ferrand

La ligne "730F" devrait être strictement identique à la colonne "730F", mais ce n'est pas le cas.

Des comparaisons ne sont pas bonnes, lorsque l'on ouvre la matrice et qu'on regarde manuellement le nombre de communs, on s'en rend bien compte.

Je viens de voir la raison.

=SIERREUR(INDEX([iliase_CalculDesCommunsUploadDV.xlsm]MatriceCommuns!$B$3:$PY$442;EQUIV(H$11;[iliase_CalculDesCommunsUploadDV.xlsm]MatriceCommuns!$A$3:$A$442;0);EQUIV($G12;[iliase_CalculDesCommunsUploadDV.xlsm]MatriceCommuns!$B$2:$PY$2;0));"")

Tu recherchais la ligne en colonne et la colonne en ligne. Je pensais sans conséquence vu la symétrie, mais on part ligne 3 et colonne B...

C'est la formule pour H12.

Bonne continuation

Ferrand

Merci beaucoup, effectivement le problème est réglé.

Donc d’abord la ligne ensuite la colonne pour la recherche avec INDEX-EQUIV.


Je profite de tes connaissance pour te poser une question supplémentaire, il s'avère que la matrice dans laquelle je vais chercher mes infos est "dynamique" autrement dit elle se met à jour à partir d'une base de données. Dès lors que des modifications sont effectués dans la base de données, la matrice "se modifie" et la plupart du temps change de taille.

Comment avec la formule précédente on peut l'adapter pour que peu importe la taille de la matrice, elle puisse chercher les informations au bon endroit.

Pour les lignes "$A$3:$A$442", si la base de données est modifiée on aura par exemple "$A$3:$A$500"

Pour les colonnes "$B$2:$PY$2", si la base de données est modifiée on aura par exemple "$B$2:$PY$52"

C'est vraiment des exemples un peu au hasard, c'est juste pour que tu comprennes comment la matrice risque d'évoluer..

Bonsoir,

Je n'ai pu répondre plus tôt étant indisponible une bonne partie de l'après-midi et j'allais spontanément conseiller d'utiliser des noms de plages définis dynamiquement.

Si tu n'es pas familier avec les noms de plage dynamiques, la référence au nom repose sur l'utilisation de la fonction DECALER.

Dans le cas de ton tableau, la cellule supérieure gauche de la plage de recherche est B3 et c'est donc à partir de là qu'on définit la plage en affectant un décalage nul en ligne et colonne (c'est la partie fixe de la référence) et en l'étendant en lignes au nombre de valeurs de la colonne A diminué de 2 pour tes en-têtes, et en colonnes au nombre de valeurs de la ligne 2 (étiquettes) diminué de 1 (dans ton cas tu auras autant de lignes que de colonnes).

Ainsi quand la plage varie le nom continue de recouvrir la totalité de la plage considérée.

Dans ton cas je conseillerais de nommer 3 plages : les 2 plages d'étiquettes et ta plage de recherche.

Pour les étiquettes de lignes qui te servent à définir ton index de ligne, la formule (que je simplifie : les noms de feuille figurent obligatoirement) :

RLigne = DECALER($A$3;;;NBVAL($A:$A)-2)

Le nb de colonnes n'étant pas modifié, tu omets (ou tu mets 1)

Pour les étiquettes de colonnes :

RCol = DECALER($B$2;;;;NBVAL($2:$2)-1)

Pour définir la plage de recherche, tu peux la définir comme vu plus haut ou utiliser les plages déjà définies, par exemple :

Plage = DECALER(RCol;1;;LIGNES(RLigne))

Là tu la définis en décalant la plage RCol d'une ligne et en lui attribuant le nombre de lignes de RLigne.

Normalement, c'est dans le classeur concerné que tu définis les noms. Dans tes formules tu économises les noms de feuilles mais pas le nom du classeur, cela ne les raccourcira que de peu, mais elles n'auront pas à être modifiées.

Je me suis demandé si en définissant les noms dans le classeur où tu formules cela fonctionnerait. Je n'ai jamais essayé (évitant déjà autant que possible les liaisons externes). Dans ce cas, il faudrait inclure le nom du classeur dans la référence et si cela établit la liaison, cela devrait fonctionner mais je ne peux te le garantir. Si tu fais l'essai, signale-le moi.

Cordialement

Ferrand

Pour les étiquettes de lignes qui te servent à définir ton index de ligne, la formule (que je simplifie : les noms de feuille figurent obligatoirement) :

RLigne = DECALER($A$3;;;NBVAL($A:$A)-2)

Le nb de colonnes n'étant pas modifié, tu omets (ou tu mets 1)

Pour les étiquettes de colonnes :

RCol = DECALER($B$2;;;;NBVAL($2:$2)-1)

Pour définir la plage de recherche, tu peux la définir comme vu plus haut ou utiliser les plages déjà définies, par exemple :

Plage = DECALER(RCol;1;;LIGNES(RLigne))

Là tu la définis en décalant la plage RCol d'une ligne et en lui attribuant le nombre de lignes de RLigne.

Ok pour les formules, je comprend comment elles fonctionnent.

Normalement, c'est dans le classeur concerné que tu définis les noms. Dans tes formules tu économises les noms de feuilles mais pas le nom du classeur, cela ne les raccourcira que de peu, mais elles n'auront pas à être modifiées.

Je me suis demandé si en définissant les noms dans le classeur où tu formules cela fonctionnerait. Je n'ai jamais essayé (évitant déjà autant que possible les liaisons externes). Dans ce cas, il faudrait inclure le nom du classeur dans la référence et si cela établit la liaison, cela devrait fonctionner mais je ne peux te le garantir. Si tu fais l'essai, signale-le moi.

En revanche la, tu m'as un peu perdu. Je peux intégrer ces formules directement dans ma formule initiale:

=SIERREUR(INDEX([iliase_CalculDesCommunsUploadDV.xlsm]MatriceCommuns!$B$3:$PY$442;EQUIV(H$11;[iliase_CalculDesCommunsUploadDV.xlsm]MatriceCommuns!$A$3:$A$442;0);EQUIV($G12;[iliase_CalculDesCommunsUploadDV.xlsm]MatriceCommuns!$B$2:$PY$2;0));"")

Pour moi c'est la meilleure solution et surtout la plus simple à mon niveau..

Les noms étant dans le classeur CalculDesCommunsUploadDV.xlsm :

=SIERREUR(INDEX([CalculDesCommunsUploadDV.xlsm]Plage;EQUIV(H$11;[CalculDesCommunsUploadDV.xlsm]RLig;0);EQUIV($G12;[CalculDesCommunsUploadDV.xlsm]RCol;0));"")

Les noms étant dans le classeur actif (sous réserve que cela fonctionne) :

=SIERREUR(INDEX(Plage;EQUIV(H$11;Rlig;0);EQUIV($G12;RCol;0));"")

Bonne journée

Merci beaucoup, je test et je te tiens informé.

Encore merci pour le temps que tu m'as accordé.

Rechercher des sujets similaires à "recherche tableau"