是否可以使用 Microsoft Excel 中的 Index and Match 或类似功能来查找同一列中两组数字的最后填充的数字行?

是否可以使用 Microsoft Excel 中的 Index and Match 或类似功能来查找同一列中两组数字的最后填充的数字行?

示例表图像:

在此处输入图片描述

目标:在示例表图像中,我想从 C 列中提取最后填充的 CST 编号 1235 和最后填充的 Vat 编号 204。

如果我使用 =VLOOKUP("CST",B2:C5,2,FALSE),它将返回第一个 CST 值,即 1234。同样,对于增值税,使用 VLOOKUP 返回 203。

如果我尝试匹配,对于 CST 来说效果很好,但对于 VAT,相同的公式使用较小的 lookup_value 比如 250(因为 VAT 值低于 250)会给出 #N/A 作为结果。

屏幕截图(在同一列上使用具有不同 lookup_value 的 MATCH):

在此处输入图片描述

答案1

对于这样的情况,我更喜欢 AGGRAGATE 而不是 MATCH:

=INDEX($B:$B,AGGREGATE(14,6,ROW($A$2:INDEX($A:$A,MATCH("ZZZ",$A:$A)))/($A$2:INDEX($A:$A,MATCH("ZZZ",$A:$A))=D$1),1))

我把实际标准放在 D1 和 D2 中,这样我就可以直接引用它们,而不是硬编码"CST""VAT"放入公式中,使其可拖动。

这两个$A$2:INDEX($A:$A,MATCH("ZZZ",$A:$A))动态设置了引用范围,因为这是一个数组类型的公式。它设置为从 A2 到 A 列中最后一个包含文本字符串的单元格。

聚合将返回与索引的条件匹配的最大行号(最后一行)。

在此处输入图片描述

答案2

您可以使用 来执行此操作LOOKUP

LOOKUPlookup_value大于数组中的任何数字时,该函数返回数组中的最后一个数字;该1/(1/(...))构造将转换0为错误,因此最后一个“数字”将是与最后一个位于相同位置的值CSTVAT取决于公式。

Last CST:  =LOOKUP(9E+307,1/(1/(($B$2:$B$999="CST")*$C$2:$C$999)))
Last VAT:  =LOOKUP(9E+307,1/(1/(($B$2:$B$999="VAT")*$C$2:$C$999)))

上述公式假设发票号始终是一个数字,如果它可能是字符串,则公式将需要进行一些修改。

Last CST:  =LOOKUP(2,1/(($B$2:$B$999="CST")*ROW($B$2:$B$999)),$C$2:$C$999)
Last VAT:  =LOOKUP(2,1/(($B$2:$B$999="VAT")*ROW($B$2:$B$999)),$C$2:$C$999)

答案3

使用 VLOOKUP 进行垂直查找。第二个参数是矩阵。如果行数没有限制,则不要指定行号,只需指定列字母。第三个参数指示要使用哪一列。2 表示第二列,即矩阵中的 C。

默认情况下,该函数不会在第一次找到时停止;它会继续查找更多出现的情况,最终找到最底部的条目(通常是最新的),完全符合需要。

因此使用

=VLOOKUP("CST", B:C, 2)

=VLOOKUP("VAT", B:C, 2)

请注意,还有用于水平查找的 HLOOKUP。

答案4

白天,我把表格倒过来,然后VLOOKUP()尽可能使用,INDEX/MATCH否则使用。重要的是将表格倒过来,下面展示了如何做到这一点。使用它作为查找想要查找的内容的表格,当它找到第一个出现的位置时,它就会找到“真正的”最后一个出现的位置,因为它位于原始(“真实”)表格中。

因此,值表为 A1:B22。然后:

=INDEX(A1:B22,  ROWS(A1:A22)+1-ROW(INDIRECT("1:"&ROWS(A1:A22))),  {1,2})

基本上,它找到行数 (22),加 1 (23),然后创建一个值数组,该值是该值 (23) 减去从 1 到行数 (22) 的一系列值,从而返回一个要返回的行数组:23-1=22、23-2=21、23-3=20,等等,所以 22、21、20,依此类推,直到 1。所以INDEX()以相反的顺序返回行。

如今(2022 年),我们只需使用XLOOKUP()并从末尾到开头进行搜索即可。当然,如果执行上述操作,则可以使用SEQUENCE()来生成数字序列。

相关内容