【问题标题】:Filter an array using a formula (without VBA)使用公式过滤数组(不使用 VBA)
【发布时间】:2011-06-27 18:10:15
【问题描述】:

是否可以使用单个公式过滤数组(不使用自动过滤器、VBA 或其他列)?

例如,我有以下电子表格:

   A  | B     | C
 --------------------
1| ID | Class | Value
2| 1  | A     | V1
3| 1  | B     | V2
4| 2  | A     | V3
5| 3  | B     | V4
6| 3  | B     | V5

我想在 VLOOKUP 中使用这个数组的一个子集。即,我只想匹配类为“B”的那些行。所以我希望我可以使用类似下面的东西

=VLOOKUP(A3, FILTER_FUNC(A:C, B="B"), 3, false)

其中 FILTER_FUNC 是某种类型的函数或表达式,它返回一个仅包含满足条件的行的数组。

【问题讨论】:

    标签: excel worksheet-function


    【解决方案1】:
    =VLOOKUP(A2,IF(B1:B3="B",A1:C3,""),1,FALSE)
    

    Ctrl+Shift+Enter 进入。

    【讨论】:

    • 我选择了这个答案,因为它的形式最接近我的问题中的示例,因为它使用 array 函数 来预过滤 table_array。此外,我能够立即理解并适应这个解决方案。不幸的是,我不清楚它是如何工作的,我能找到的最接近文档的是this KB article 中提到的“Criteria Array”。愿意解释你的答案吗?
    • @Bago,我总是尽可能避免使用数组公式,它们很快就会变得复杂。很高兴您找到了答案。
    • 内部嵌套的 If 语句将返回一个数组数组以在查找中使用。所以如果 B1:B3="B" 返回 {false;真的; true},则 if 语句的结果将是 {""; B1:B3; C1:C3}。然后将其传递给 vlookup 函数,该函数将此数组视为要查看的一组行。空白行永远不会匹配。非空行(因为它们匹配第二个条件而存在)将被搜索第一个条件。找到匹配项时,返回指定的列。
    • 注意[Ctrl+Shift+Enter]关于输入数组公式的注释,否则Excel可能会抛出错误或返回错误的结果。
    • 您好,我正在寻找这样的解决方案,我只能取回与组 B 关联的值。但是,我的公式数组只为所有值返回 1(大括号到位)。有什么想法吗?
    【解决方案2】:

    如果您只想要第一个“B”值,则可以这样做,如果您想让它更通用,可以为“B”子分配一个单元格地址。

    =INDEX(A2:A6,SUMPRODUCT(MATCH(TRUE,(B2:B6)="B",0)),1)
    

    要基于两列使用它,只需在匹配中连接:

    =INDEX(A2:A6,SUMPRODUCT(MATCH(TRUE,(A2:A6&B2:B6)=("3"&"B"),0)),1)
    

    【讨论】:

    • 这绝对是一个有趣的答案。我知道 MATCH() 获取类为“B”的第一行的行号,然后将其用作 INDEX() 中的行位置。如果我想在不同的列上添加另一个条件怎么办?例如,我想获取 Class 为“B”且 ID 为“3”的第一行。鉴于更新的示例数据,所需的结果是“V4”。
    • 顺便说一句,我同意您在@GSerg 的回答中关于数组公式复杂的评论。另外,我的应用程序似乎有点慢。
    • @Bago,答案已更新。 SUMPRODUCT 像数组函数一样工作,所以也有点复杂。
    • 在这个视频中看看它是如何完成的:youtube.com/watch?v=pCAXRLYr59E
    【解决方案3】:

    听起来您只是在尝试进行经典的两列查找。 http://www.dailydoseofexcel.com/archives/2009/04/21/vlookup-on-two-columns/

    对此有很多解决方案,最简单的可能是以下(不需要数组公式):

    =SUMPRODUCT((Lookup!A:A=Param!A1)*(Lookup!B:B=Param!B1)*(Lookup!C:C))
    

    要翻译您的具体示例,您可以使用:

    =SUMPRODUCT((A1:A3=A2)*(B1:B3="B")*(C1:C3))
    

    【讨论】:

    • 这个答案提供了一些很好的选择。但是,使用我的示例数据时,SUMPRODUCT 示例不太适用,因为 C 列是字母数字 - 这会导致 #VALUE 错误。
    • 是的,这就是sumproduct方法的缺点:/
    • 另外,链接中的 VLOOKUP 和 INDEX 示例不太有吸引力,因为我想在不添加列的情况下在单个公式中实现解决方案。我将编辑我的答案以反映这种偏好。
    • 是的,这是一种权衡,您要么不得不求助于数组公式(这意味着您不能引用整个列并让它自动调整以适应不断增加的表格大小),或者您是添加列,或者您正在使用 VBA。
    【解决方案4】:

    今天,在 Office 365 中,Excel 具有所谓的“数组函数”。 filter 函数完全符合您的要求。无需再使用CTRL+SHIFT+ENTER,一个简单的enter 就足够了。

    在 Office 365 中,您的问题可以通过以下方式轻松解决:

    =VLOOKUP(A3, FILTER(A2:C6, B2:B6="B"), 3, FALSE)
    

    【讨论】:

      猜你喜欢
      • 2021-02-01
      • 2015-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多