我有一张如下所示的表格:
p1 名称 | p2 名称 | p3 名称 | p4 名称 | p1 赛前 ELO | p2 赛前 ELO | p3 赛前 ELO | p4 赛前 ELO | p1 赛后 ELO | p2 赛后 ELO | p3 赛后 ELO | p4 赛后 ELO |
---|---|---|---|---|---|---|---|---|---|---|---|
乔治 | 史黛西 | 德里克 | 乔尔 | 1500 | 1500 | 1500 | 1500 | 1560 | 1440 | 1440 | 1440 |
史黛西 | 乔治 | 唐尼 | 伊万卡 | X | X | X | X |
对于第二行,为了确定每个玩家的赛前 ELO,我需要找到每个玩家最近的赛后 ELO。这很困难,因为我不知道 Dan 最近的比赛是作为玩家 1、玩家 2、玩家 3 还是玩家 4 进行的。
我如何执行此查找?
我试过 VLookup,但它只输出某个给定列的值。我需要根据玩家最近所在的位置输出不同的列。
行数可以远多于两行。随着更多游戏的提交,表格将随时间延长。
答案1
您可以使用或调整以下内容:
=INDEX($I$2:L5, MAX(($A$2:D5=A6) * (ROW($A$2:D5) - 1)), MAX(INDEX( ($A$2:D5=A6) * COLUMN($A$2:D5), MAX(($A$2:D5=A6) * (ROW($A$2:D5) - 1)),) ))
当然,我说的“适应”是指调整范围,但它不会提供诸如Ron Rosenfeld
评论中提到的“Donny/Ivanka”之类的错误。我认为有两点:你不需要帮助,而且真实数据不会有如此明显的问题。然而,如果输入每一行新的名字,后者就不复存在了……
INDEX
基本上,它使用当前行上方范围内单元格的 TRUE/FALSE 测试来查找具有内部函数的 Row 参数中所需名称的行,这些单元格等于正在检查的名称,然后MAX
从该值数组中查找值。这将给出当前行上方数据中出现该名称的最新行。
那么,为什么我要强调“上方”呢?因为具体做法很特别。对范围内的第一个单元格使用绝对引用,对范围内的最后一个单元格使用相对引用。这样,当向下复制行时,数据范围不仅会为向下复制的每一行扩展一行,而且它始终是当前行上方的所有行,而无需任何易失性函数。(不是因为我认为数据永远不会变得太大而减慢 Excel 的速度(尽管我确实这么认为),而是因为在其中找到要使用的部分通常很“冗长”并且计算量很大。)
因此,现在有了最接近的行,因此将值缩小到该行中四个单元格的值之一。哪个?好吧,找到列可以回答这个问题,公式的下一部分可以做到这一点(内部函数中的 Column 参数INDEX
)。
再次INDEX
使用更大表的名称部分,获取通过上述计算获知的行并在每个单元格中测试 TRUE/FALSE,乘以每个单元格的列号以获得一个非零值和一系列零值。MAX
将该值作为所需的列参数。
因此,现在人们有了要查找的行以及四列中的哪一列(或实际使用所需的列数)。该列值与赛后 ELO 四列最右边的值相同。因此,外部INDEX
使用完整表格的这四列以及上面学到的行/列值来选择要返回的正确赛后 ELO,以查找要查找的名称。
目前,对于我想象的大多数故障,它只会返回一个 Excel 错误(这应该很容易发现,尤其是在任何给定时刻只查看一行的情况下)。但可以想象,故障可能会返回一个看起来真实的值而不是 Excel 错误,因为情况总是如此。我很确定只有人工输入才会出现问题,但你知道在现实生活中“很确定”会怎样。
所以买家要小心!
(如果需要,可以删除我添加的多余空格,以帮助划分公式的功能区域,只需将公式粘贴到适当的单元格中,然后按Enter
设置即可。然后用 再次打开它F2
,在末尾添加(完全不合适的)括号,然后Enter
再次按。Excel 将捕获该错误并要求您接受没有该括号的版本。接受它。请注意,它也会将其收紧,删除多余的空格。)