【问题标题】:Excel Match, Offset, Index for multiple columnsExcel 匹配、偏移、多列索引
【发布时间】:2019-02-20 00:52:39
【问题描述】:

我想找到对应客户 PO # Invoice # Quote # 等的值。&客户列表在不同的多列中提到。

使用的公式:=INDEX(D16,D17,2,MATCH('Client PO & Invoice Details'!A1:ACZ25,'Client PO & Invoice Details'!A1:ACZ1,0))

使用匹配偏移索引查找所需的查找函数

【问题讨论】:

  • 到目前为止您尝试过哪些公式?
  • 是否有最大行数?
  • 这是一个合法的问题,您只是没有提供您在原始问题中使用的公式。编辑您的原始问题并在那里添加公式,然后我认为应该重新考虑否决票。
  • 我想保持打开的行添加为每个客户的订单。 (目前我的 1 个客户的最大订单是 350)
  • 目前是的,如果添加新客户,未来会重复相同的列集(客户# PO # Quote # Invoice # Amount Docket #)

标签: excel indexing match lookup offset


【解决方案1】:

您的数据暂存确实效率低下。如果您制作了一个客户编号列并垂直而不是水平扩展数据,您真的可以为自己省去很多麻烦。例如,如果您的数据以这种方式组织,您可以使用数据透视表来大大简化此问题。

除非更改您的数据结构,否则您可以根据偏移范围对日期进行 vlookup:

=VLOOKUP($D$17,OFFSET('Client PO & Invoice Details'!$A$1,0,MATCH($D$16,'Client PO & Invoice Details'!$1:$1,0)-1,1048575,6),2,FALSE)

这个公式应该放在 id 和 date 过滤器下面的 D18:D22 中。您需要在公式末尾增加 vlookup 索引(...,2,FALSE) 以获取您要查找的特定列。2 需要在后续公式中更新为 3、4、5 和 6 以获得每个值。

首先,公式在第 1 行找到您的客户编号,然后偏移量定义了一个 6 列宽的范围,从找到客户编号的列开始,最后 vlookup 像往常一样通过在第一列中查找日期来工作偏移范围并返回索引列的值。

【讨论】:

    【解决方案2】:
    INDEX(range you want to look in,  how many rows down from the top of your range, how many columns to the right)
    

    这是索引的基本用法。如果范围是单行或单列,则只需要第二个条目以及您想要在该范围内走多远。另一个小警告是,如果 # 行或列数为 0。 0 将使索引返回整个对应的行或列。

    让我们从查看您想要查看的列集开始。您需要将 D16 (client#) 与标题行中的相应条目相匹配。为此,MATCH 是一个不错的选择。

    =MATCH(value you are looking for,  range you want to look in, and what type of match)
    

    你的情况

    =MATCH($D$16,'Client PO & Invoice Details'!$1:$1,0)
    

    $1:$1 是电子表格的整个第一行。如果公式向上/向下复制到另一个单元格,$ 将保持行号不变。最后的 0 告诉函数您想要精确匹配,而不是近似类型匹配。执行此功能后,您将知道从哪一列开始查找。

    所以现在您需要确定要处理的行,然后开始提取数据。这可能会因 VLOOKUP 而失败。您可以使用 OFFSET 函数定义您的范围。然而,我将采取不同的路线。我将再次使用 MATCH 根据我们确定的列来确定我们要查看的行

    =INDEX('Client PO & Invoice Details'$A:$ACZ,0,MATCH($D$16,'Client PO & Invoice Details'!$1:$1,0))
    

    此索引将指向与匹配项找到的列中的所有行。所以现在我们需要在这些结果中进行匹配,以确定您正在使用的行。这样做,我们得到一个看起来像这样的公式:

    =MATCH($D$17,INDEX('Client PO & Invoice Details'$A:$ACZ,0,MATCH($D$16,'Client PO & Invoice Details'!$1:$1,0)),0)
    

    现在您知道正在处理的行和正在处理的列,现在可以使用 INDEX 提取所需的数据。

    在 D18 中放置以下公式

    =INDEX('Client PO & Invoice Details'$A:$ACZ,MATCH($D$17,INDEX('Client PO & Invoice Details'$A:$ACZ,0,MATCH($D$16,'Clent PO & Invoice Details'!$1:$1,0)),0),MATCH($D$16,'Client PO & Invoice Details'!$1:$1,0)+1)
    

    在 D19 中使用相同的公式,但将 +1 更改为 +2。继续这样做,然后每次将 +# 加一。

    根据您将在添加客户时添加列的注释,您需要在每次添加客户时调整公式。有一些方法可以自动执行此操作,但在这种情况下,您最好选择偏移路线。

    请注意,用于对客户进行分组的列数量有限。

    【讨论】:

    • 我曾想过提出一个索引匹配解决方案,但后来我认为它需要为索引数组计算偏移范围两次,为第二次匹配计算一次(在找到客户编号之后)。在这个用例中,vlookup 路线效率更高,只要查找永远不需要向左(根据示例数据似乎不是这种情况)
    • OFFSET 的次要问题是它是一个不稳定的函数。这意味着每次电子表格中的某些内容发生更改时它都会重新计算。我提到它是一个选项,但选择键入丑陋且难以阅读和维护多索引匹配解决方案。
    • 在这个用例中可能没问题,因为它只有 5 个单元格。如果将这个公式复制到整列或其他内容中,那将是另一回事。
    猜你喜欢
    • 2017-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-14
    • 1970-01-01
    • 2020-10-30
    • 2019-10-22
    相关资源
    最近更新 更多