Excel查找返回唯一值

我有两张纸

Item ID Box 78 Glue 105 Box 85 

另一张

 Item ID Box Box Glue 

在第二张纸上,我想查看第一张纸的ID

我在哪里复制(如Box )我想一次返回一个ID 。 所以Box上的查找会第一次返回78 ,第二次返回85

喜欢这个:

 Item ID Box 78 Box 85 Glue 105 

替代解决scheme。 不需要帮助者列,不需要数组input。 在Sheet2单元格B2中复制下来:

 =INDEX(Sheet1!$B$2:$B$4,MATCH(1,INDEX((Sheet1!$A$2:$A$4=A2)*(COUNTIF(B$1:B1,Sheet1!$B$2:$B$4)=0),),0)) 

您可以使用INDEX / MATCH的细微变化:

  =INDEX(B$2:B$4,SMALL(IF(A$2:A$4=C2,ROW(B$2:B$4)-1,""),COUNTIF(C$2:C2,C2))) 

按Ctrl + Shift + Enter确认为数组公式,然后自动填充。

单元格引用的说明:

A $ 2:A $ 4 – 项目栏(sheet1)

B $ 2:B $ 4 – ID列(sheet1)

C $ 2:C2 – 项目栏(表2)

C2 – 你正在查找的物品

乍一看这似乎是不可能的,因为VLOOKUP不知道如何处理多个Box

但使用这个巧妙的答案,你实际上可以做到这一点。

在工作表1上,input公式:

表1的一些公式

其结果是:

 item instance combined id range_above Box 1 Box1 78 $A$2:$A$2 Glue 1 Glue1 105 $A$2:$A$3 Box 2 Box2 85 $A$2:$A$4 

您现在可以将VLOOKUPclosures而不是closuresitem 。 (显然你必须在表2中做一个相同的技巧。)

请注意,所有这些公式只要您的表格长就可以延长。 它将永远只是工作。

一个好的方法是使用一个数组公式从第一个工作表中查找值,使用第二个工作表中每个项目的重复次数。 此方法不需要“帮助”列。

完成这个的公式是: {=INDEX(Sheet1!A:B,SMALL(IF((Sheet1!A:A)=Sheet2!A2,ROW(Sheet1!A:A),""),COUNTIF($A$2:$A2,"="&$A2)),2)}

这个公式是一个数组公式 。 您可以将其复制到Sheet2上的单元格B2中,然后按Ctrl + Shift + Enter将其input。 您必须按下Ctrl + Shift + Enter才能使此数组公式。 您可以将这个公式向下拖到列B中,以获得所需的行数。

工作表完成后将包含以下公式: 完成的工作表

让我们把这个公式分解成它的组成部分:

  1. 确定列A中某个给定项目被重复了多less次。我们用下面的代码来完成这个工作,它将计算当前行项目出现在列A中所有先前行的次数。启动的绝对参考范围和结束的相对参考确保范围将自动更新,当我们在列B中向下拖动公式:

     COUNTIF($A$2:$A2,"="&$A2) 
  2. 识别Sheet1中包含Sheet2列A中项目的第k行。 下面的代码首先使用IF语句来查找Sheet1中包含Sheet2的列A中的项目的所有行。 这使用数组语法将指定范围内的所有行与值进行比较。 IF语句返回一个数组,其中包含如果find任何被标识的行。 如果没有find,则返回空string。

     IF((Sheet1!A:A)=Sheet2!A2,ROW(Sheet1!A:A),"") 
  3. 查找使用SMALL函数标识的第n行的值,该函数从数组中select第n个最小项目。 对于k ,我们传递在步骤1中计算的计数。

     SMALL(IF((Sheet1!A:A)=Sheet2!A2,ROW(Sheet1!A:A),""),COUNTIF($A$2:$A2,"="&$A2)) 
  4. 最后,我们将它们放在INDEX函数中, INDEX函数将在给定范围内的指定行(在步骤3中标识)和列(2)中查找值。

     {=INDEX(Sheet1!A:B,SMALL(IF((Sheet1!A:A)=Sheet2!A2,ROW(Sheet1!A:A),""),COUNTIF($A$2:$A2,"="&$A2)),2)}