如何让 VLOOKUP 返回所有结果而不仅仅是一个(使用公式而不是自动过滤)

如何让 VLOOKUP 返回所有结果而不仅仅是一个(使用公式而不是自动过滤)

我有一张包含多个订单和日期的表格。我希望在另一页上输入日期,然后显示从该日期开始的所有订单,就像 VLOOKUP 一样。但是,VLOOKUP 只会显示其中一个订单或显示错误。我知道我可以过滤我的表格,但我有数百个日期,所以我希望能够只输入日期,然后显示从该日期开始的所有订单。这可能吗?

我尝试了几个表格甚至数据透视表,但都没有用

答案1

筛选函数可以做到这一点。

参见下面的示例。不过您可能需要手动格式化结果列。

在此处输入图片描述

答案2

不加过滤的回答:

在源工作表的 A 列插入一个辅助列,从 A2 开始:

=IF(filterdate = datecolumn, A1+1, A1)

现在在第二张表中按行号执行 VLOOKUP:

= VLOOKUP(ROW(), SHEET1!$A$2:$H$1000, datecolumn number, FALSE)

可以使用 Excel 365 中的 FILTER 或数组公式(在 priop 版本中)来执行此操作,而无需辅助列。数组公式方法和此辅助列方法之间的区别在于,您用空间(单元格存储)换取复杂性/计算次数。

答案3

您可以使用以下命令。其作用与最新版本非常相似FILTER()

=INDEX(SourceTable,    LARGE(  (FilterColumn = FilterValue) * (ROW(SourceTable)-1),  ROW(  INDIRECT("1:" & COUNTIF(FilterColumn,"="&FilterValue)  )  )),     {1,2})

FilterColumn = FilterValue将源日期列中的值与要搜索的值进行比较。它会生成一个 TRUE/FALSE 值数组。

ROW(SourceTable)-1生成源表中的行位置,假设列标题为一行高,则“-1”将值减 1。您可以更改它以适应,0 表示无标题,>1 表示多行标题。本质上,它正是MATCH()给定范围地址以查找匹配项时所做的操作,但根据需要对每一行执行此操作,而不是返回单个值,并且不需要实际值来匹配。

将它们相乘有两个原因:1) 因为乘以这些数组中的一个(通常乘以 1)将强制 Excel 将 TRUE/FALSE 数组更改为 1/0 数组,2) 因为该强制 1/0 数组随后可以乘以该计算生成的行号数组ROW(SourceTable)-1。您希望这样做,以便您不想要的行的行号更改为 0 而不是离散值。您想要的行保持为原始行号。

因此,现在您的公式有一个由许多 0 和一些非零数字组成的数组。类似于{0,0,0,0,0,6,7,0,0,10,0,12}。如果您无法超越它,那将是不幸的,因为虽然输出将只是您需要的行,但它们可能位于您不需要的数百行中的任何行。例如输出页面上的第 12 行,然后是 406 个空白行,然后是另外两行。如果您希望向您呈现某些内容,而不是必须执行诸如复制和粘贴为值、排序以将它们全部浮动到顶部并从那里开始之类的操作,那么这不是很有用。非常老派,而且并不是您真正想要的。

有趣的是,虽然文本函数无法有用地(或根本无法)编辑数组,因为它们无法让空元素消失,只留下有趣的元素……但它们会用空项替换空项……但有些函数可以做需要做的事情。它们的逻辑是,它们将有趣的元素提取到新数组中,并转储整个原始数组,而不是尝试处理原始数组并将其移动到公式中,进行编辑。

LARGE()在这里使用是因为它可以找到范围/数组中“第 X 个”最大的元素,而MAX()只能找到“最大的”元素。并且它可以将数组常量作为其“第 X 个”最大的“X”的参数。这意味着您可以告诉它接受不止一个值。您可以只输入这样的数组常量(例如,如果{14,15,16,22}您想要第 14、15、16 和 22 个最大的元素,它看起来会像),但您也可以使用函数来创建它。

如今,我们会SEQUENCE()尽可能地使用 if,但 -2010 和 -2016 版本没有这个功能。他们创建此类数组的方式,即“原始”方式,是使用函数ROW()。获取从 1 到 400 的值数组的示例如下:

=ROW(1:400)

公式使用这个想法并构建一个这样的字符串。实际上,就像“1:400”部分一样,并用 包装它,INDIRECT()以便它可以在 Excel 的“头脑”中被识别为参数ROW()。为什么要构建一个字符串?因为在其中你可以安装一个计数函数,COUNTIF()它可以计算非空的。所以你得到的序列将是最大的,直到那个多分之一:简而言之,你将所有非空的收集到新数组中。对业务有好处!

因此,外部INDEX()函数具有其范围地址或命名范围。所有这些工作都为其提供了 Row/s 参数,而您只需要 Column/s 参数。

没什么特别的。由于您需要的列可能非常杂乱,只需输入一个数组常量即可。在我编写此公式的样例中,我使用了两列并收集了这两列。这给出了{1,2}您在公式末尾看到的。如果您有八列并且只想要第一列和所有偶数列,您可以改为输入{1,2,4,6,8}。顺便说一句,您不仅可以像这样省略列,还可以让它们的顺序混乱,甚至有些列不止一次({3,3,7,5,1,2,3,7,5,5,5,2}如果您愿意的话)。

只剩一件事要做。格式化。但这很容易,至少在我目前的 Excel 版本中是这样的。我相信在 Excel 中也是一样的,所以我将介绍它并让您发现。

选择(突出显示)所需列中的一行单元格。因此,在上面的示例中,您可能选择第 14 行并突出显示单元格 A14、B14、D14、F14 和 H14。将它们复制到剪贴板。转到新表所在的位置并选择/突出显示组成它的五列。Paste|Special|Formats有多种方法可以做到这一点。您的列已格式化。Excel 在粘贴时会忽略未选中的空单元格,因此五个单元格及其之间的单元格将成为一组五个“连续”的单元格以供粘贴。小菜一碟。

答案4

相关内容