查找跨多列的字符串最近出现的位置

查找跨多列的字符串最近出现的位置

我有一张如下所示的表格:

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 将捕获该错误并要求您接受没有该括号的版本。接受它。请注意,它也会将其收紧,删除多余的空格。)

相关内容