如何在excel

时间:2016-06-08 07:42:15

标签: excel

我有两个数据集:Data-A和Data-B。

数据-A

A   B   C   D   Start_Date  End_Date
N   C   P   1   23-05-2015  27-05-2015
N   C   K   1   30-05-2015  07-06-2015
N   C   Ke  1   09-06-2015  28-06-2015
N   C   Ch  1   14-07-2015  25-07-2015
N   C   Th  1   29-06-2015  13-07-2015
N   C   Po  2   23-05-2015  27-05-2015
N   C   Kan 2   30-05-2015  08-06-2015

数据-B

X       D     Date              A   B   C
444     1   09-07-2015          
455     1   20-07-2015          
1542    1   28-06-2015          
2321    1   21-07-2015          
2744    1   01-07-2015          
7455    2   25-05-2015          
12454   2   02-06-2015          
18568   2   24-05-2015          
28329   2   03-06-2015          
28661   2   31-05-2015          

值是数据 - Bare缺失,我需要使用条件索引匹配/ vlookup填充它们,以便列D(Data-B)与Date(Data-B)匹配,以便Start Date<= Date <=End Date.

期望输出:

X       D     Date              A   B   C
444     1   09-07-2015          N   C  Th
455     1   20-07-2015          N   C  Ch
1542    1   28-06-2015          N   C  Ke
2321    1   21-07-2015          N   C  Ch
2744    1   01-07-2015          N   C  Th
7455    2   25-05-2015          N   C  Po
12454   2   02-06-2015          N   C  Kan
18568   2   24-05-2015          N   C  Po
28329   2   03-06-2015          N   C  Kan
28661   2   31-05-2015          N   C  Kan

1 个答案:

答案 0 :(得分:1)

概念证明

Proof of Concept

为了实现上述目的,我使用了AGGREGATE function。这是一个执行数组计算的常规公式。以下公式将返回与您的条件匹配的第一行的结果。

=INDEX(A$2:A$8,AGGREGATE(15,6,ROW($D$2:$D$8)/(($J2=$D$2:$D$8)*($E$2:$E$8<=$K2)*($K2<=$F$2:$F$8)),1)-1)

这假设您的表Data-A在A1中开始并包含1行作为标题行。公式可以放在Data-B中A下的第一个单元格中,并根据需要向下和向右复制。

UPDATE公式解释

聚合函数在其括号内为某些子函数执行数组计算。大约有19种不同的子功能。子功能14和15都是阵列计算。这是一个很好的功能,因为它是一个像常规公式一样的数组。

由于我希望第一行符合您的条件,因此我选择使用小函数或子函数15作为第一个参数。基本上我告诉聚合函数生成一个列表并按升序排序。

第二个参数的值为6,它告诉聚合忽略生成错误的数组的任何结果。如果我们能够做出我们不希望错误的结果,这将非常方便。

现在我们进入公式的数组部分。您可以采用等式的下一部分并突出显示相邻列中的相应行,并将其输入为 CONTROL + SHIFT + ENTER ( CSE)公式。只要在顶部单元格中执行此操作,数组公式就会传播到所选单元格的其余部分,并显示数组的结果。同时检查公式栏以查看公式周围是否出现{}。您无法手动添加{}。

{=ROW($D$2:$D$8)/(($J2=$D$2:$D$8)*($E$2:$E$8<=$K2)*($K2<=$F$2:$F$8))}

这将确定当前行,然后将其除以我们条件的结果。您也可以按照上述相同的方式在单独的列中作为CSE公式尝试以下每个条件,以查看其结果。

($J2=$D$2:$D$8)
($E$2:$E$8<=$K2)
($K2<=$F$2:$F$8)

这些会在检查每一行时为您提供TRUE或FALSE。现在有趣的是,这适用于excel公式,当您对布尔值执行数学运算时,它会将0视为false,将其他任何数字视为TRUE。它实际上会将TRUE转换为1.您还会注意到每个逻辑检查都用*分隔。在这种情况下,*就像AND运算符一样,只有当所有结果都为真时才会得到1的答案。(+将像OR运算符一样)

现在如果你记得早些时候6说过要忽略所有的错误。因此,任何不符合我们的逻辑检查的行都将导致除以0,因为并非所有逻辑检查都会导致TRUE或1.所有检查结果都会被忽略。所以现在这样做之后,只有满足我们标准的行号列表才会留在聚合数组中。

逻辑检查后,下一个参数有1,1。在这种情况下,我们告诉聚合返回列表中的第一个数字,它是符合我们标准的第一个行号。如果我们想要第三个数字,那就是3,而不是。

因此聚合返回我们想要的结果的第一行数。当它与INDEX函数配对时,何时可以使用结果告诉我们要查看INDEX函数的哪一行。在这种情况下,我们说我们想查看索引A $ 2:A $ 8。聚合函数告诉我们索引中有多少行。如果索引从第1行开始,我们就不必做任何事情。但由于有一个标题行,我们需要通过减去头行的1来调整聚合函数的结果(实际上你需要减去数据开头之上的行号)。这就是你在聚合函数之后看到-1的原因。

现在,如果你注意范围内的锁定,你会注意到我没有把A锁定在A $ 2:A $ 8。我这样做是为了让我可以将公式复制到右边,列A地址会像我一样更新。这只能起作用,因为您保持列的顺序相同。如果订单已更改,我会将索引从1D数组更改为2D数组,并使用MATCH函数排列列标题。