EDIT: Une réponse récente de @ScottCraner a utilisé la INDEX()
formule "dé-référencée" et sa réponse m'a incité à prendre une autre solution à ce problème. La même approche que j'avais (sans succès) essayée auparavant fonctionnait parfaitement la deuxième fois. Je décrirai la solution ci-dessous.
Contexte de la formule INDEX () dé-référencée:
Sean, vous avez fait une tentative admirable pour utiliser des formules matricielles pour faire ce que vous devez faire. Les problèmes que vous rencontrez sont liés à la façon dont Excel gère les tableaux. Certaines formules peuvent utiliser des tableaux comme arguments et d'autres non.
J'ai approfondi le sujet et appris des choses très bizarres et mystérieuses sur l'utilisation des tableaux dans la INDEX()
formule d'Excel que je ne connaissais pas auparavant. Pour comprendre comment cette formule fonctionne, commençons par la fin.
La dernière chose que ferait votre formule est la somme de trois valeurs (discontinues) du tableau 2D constituant votre tableau 2.
INDEX(array,row_num,col_num)
peut renvoyer une valeur unique d'un tableau 2D et peut également renvoyer une colonne ou une ligne entière. Il semble qu'il devrait pouvoir renvoyer une liste de valeurs. Alors testons-le.
Cette formule renverrait (dans un monde parfait) la somme que vous recherchez du tableau 2:
=SUM(INDEX(G4:K8,{3,2,3},{5,4,3}))
Cela devrait ajouter les éléments de la ligne 3, colonne 5 plus ligne 2, colonne 4 plus ligne 3, colonne 3. Mais ce n'est pas le cas , il renvoie simplement 1.67, qui est le premier élément référencé.
La recherche en ligne produit des références (y compris une ici sur StackOverflow ) qui indiquent INDEX()
le retour d'un tableau, mais uniquement si vous dé-référencez la formule (c'est la partie "bizarre"). La partie "arcane" est comment faire cela. C'est la formule "dé-référencée":
=SUM(INDEX(G4:K8,N(IF(1,{3,2,3})),N(IF(1,{5,4,3}))))
Cette formule donne la réponse correcte: 4.67.
Dans la formule, le IF()
1 est traité comme un True
, il renvoie donc le tableau de nombres et le N()
renvoie le nombre de chiffres s’ils sont numériques. La prédiction de quiconque se demande pourquoi IF () et N () sont nécessaires pour que la formule fonctionne correctement. Dans la formule de Scott , il devait également multiplier son tableau (il s'agissait d'une référence de plage) par 1.
Mais maintenant, nous avons une formule qui donne la bonne réponse. Et nous espérons que tout ce que nous avons à faire est de remplacer les constantes de tableau par des tableaux calculés en utilisant vos autres données.
Les nouvelles informations commencent ici.
Pour le nombre de lignes dans la formule ci {3,2,3}
- dessus , nous avons besoin des positions des intensités en pourcentage dans F4: F8 associées aux variétés de fruits choisies. Premièrement, nous allons avoir un tableau des positions des pommes dans G12:G16
votre tableau 3:
=MATCH(B3:B5,G12:G16,0)
Ceci est une formule matricielle et doit être entré avec CTRLShiftEnter, plutôt que juste Enter.
Cette formule recherche la liste des variétés de pommes du tableau 1 de la colonne G du tableau 3 et renvoie un tableau de leurs positions.
Si vous sélectionnez la formule dans la barre de formule et appuyez sur F9, vous verrez que la valeur de la formule est le tableau {1,3,4}
, les positions des pommes dans la colonne G du tableau 3.
Nous avons maintenant besoin des IP associés à ces postes. Cette INDEX()
formule recherche dans la colonne H et utilise le tableau ci-dessus comme numéro de ligne. Ici, le numéro de ligne doit être "dé-référencé":
=INDEX(H12:H16,N(IF(1,MATCH(B3:B5,G12:G16,0))))
Cette formule retourne le tableau {0.97,0.98,0.97}
, les PI des pommes. Jusqu'ici tout va bien. Ensuite, nous utilisons ce tableau comme valeurs de recherche dans une MATCH()
formule qui ressemble à F4: F8, l’index PI de votre tableau 2:
=MATCH(INDEX(H12:H16,N(IF(1,MATCH(B3:B5,G12:G16,0)))),F4:F8,0)
Cette formule retourne le tableau {3,2,3}
, et ce sont les valeurs de row_num nécessaires à la formule finale.
Nous avons ensuite besoin du numéro de colonne {5,4,3}
, qui correspond au nombre total de fruits pour chacune des variétés de pommes. Nous en tirerons le tableau 3, mais nous devons d’abord calculer le nombre total de fruits pour toutes les variétés de fruits. Ce tableau (calculé) est une liste de ces totaux:
(I12:I16*J12:J16)+K12:K16
Pour obtenir le nombre total de fruits pour les variétés Apple, nous allons utiliser ce tableau dans un INDEX()
, avec le même numéro de ligne (sans référence) que précédemment:
=INDEX((I12:I16*J12:J16)+K12:K16,N(IF(1,MATCH(B3:B5,G12:G16,0))))
Cette formule retourne le tableau {5,4,3}
, et ce sont les numéros de colonne nécessaires à la formule finale.
En résumé, la liste des NFPI est la suivante:
=INDEX(G4:K8,MATCH(INDEX(H12:H16,N(IF(1,MATCH(B3:B5,G12:G16,0)))),F4:F8,0),INDEX((I12:I16*J12:J16)+K12:K16,N(IF(1,MATCH(B3:B5,G12:G16,0))))
Cette formule retourne le tableau {1.67;2;1}
. Ce sont les NFPI pour les pommes, et maintenant nous devons simplement les additionner.
Mais pas encore, il y a un problème mineur à régler en premier. Les trois variétés de pommes figurent dans le tableau 3, mais ce n'est pas le cas pour les oranges. Les formules ci-dessus renvoient des tableaux contenant #N/A
la variété Small Orange. Cela ne pose pas de problème tant que le temps n'est pas venu d'ajouter les valeurs.
Donc avant de prendre la somme, nous convertissons le #N/A's
à 0 avec une IFERROR()
formule. Voici la formule finale:
=SUM(IFERROR(INDEX(G4:K8,MATCH(INDEX(H12:H16,N(IF(1,MATCH(C3:C5,G12:G16,0)))),F4:F8,0),INDEX((I12:I16*J12:J16)+K12:K16,N(IF(1,MATCH(C3:C5,G12:G16,0))))),0))
Cette formule renvoie 4,67 pour les pommes et 5,75 pour les oranges.
Sean, j'espère que cela peut encore être utile. Désolé pour le long délai.