Excel合并两个列表

时间:2018-03-13 08:15:22

标签: excel excel-formula

我有两个Excel列表:

  1. 一条广泛的2万行。其中:
  2. 两列很重要:第一:唯一ID,第二:值(格式化数字)。

    它可以是多次出现的值,也可以只出现一次。

    1. 我必须创建第二个列表。在这个列表中,我只有一列我希望拥有的值。
    2. 我需要一个公式,它将从列表1中的列表2中查找值,然后将唯一ID与每个值匹配。

      当没有直接价值时,重要的是。在这种情况下,它必须搜索大约3-5%的值偏差的样本。

      示例:没有值127,但在3%内,找到125.

      我尝试过索引和比较,但似乎无法正常工作。

      VLOOKUP工作,但没有3-5%的偏差

      我非常感谢你的帮助。

      示例:http://www.filedropper.com/excellist1and2

1 个答案:

答案 0 :(得分:0)

如果列表中存在该值,您可以使用VLOOKUPINDEX(MATCH来查找它 - 这是最简单的部分。如果列表中的值,则需要找到最接近的值。

最接近的“低”值将是MAX值≤我们的输入,最接近的“高”值将是MIN值≥我们的输入。

如果您有Office 365,则可以在此处使用MINIFS($D$1:$D$6,$D$1:$D$6,">="&B1,$D$1:$D$6,"<="&(B1*1.05))MAXIFS($D$1:$D$6,$D$1:$D$6,"<="&B1,$D$1:$D$6,">="&(B1*0.95)))。如果没有,你需要一个数组公式,我们可以在早期建立“±5%”,以简化公式。

从低值开始,我们希望MAX值≤我们的输入≥95%的输入值。将数组公式放在SUMPRODUCT中以便我们可以在普通公式中使用它,我们得到=SUMPRODUCT(MAX($D$1:$D$6*--($D$1:$D$6<=B1)*--($D$1:$D$6>=(B1*0.95))))

高值稍微有点难度,因为我们不能只乘以0来取消任何太低或超过目标的105%。我们需要添加一个巨大的数字,例如1E+99(一个带有ninty-nine 0s的1),以便MIN忽略它们:SUMPRODUCT(MIN($D$1:$D$6+1E+99*(--($D$1:$D$6<B1)+--($D$1:$D$6>(B1*1.05)))))

最后几步是确定哪些数字更接近目标,然后找到要匹配的唯一ID。 %亲密度计算为(TARGET - LOW)/TARGET(HIGH - TARGET)/TARGET),而从另一个减去1会给您2-(HIGH + LOW)/TARGET - 正数表示“高”更接近,负数表示“低”表示更接近,0意味着它们都是相同的距离(我将其默认为低数字)。然后,我们使用SIGN将其更改为±1,添加2以获得1,2或3,然后使用CHOOSE输出我们的数字。在伪代码中,CHOOSE(2+SIGN(2-(HIGH+LOW)/TARGET),LOW,LOW,HIGH)和完整的东西:

CHOOSE(2+SIGN(2-(SUMPRODUCT(MAX($D$1:$D$6*--($D$1:$D$6<=B1)*--($D$6>B1*0.95)))+SUMPRODUCT(MIN($D$1:$D$6+1E+99*(--($D$1:$D$6<B1)+--($D$1:$D$6>(B1*1.05))))))/B1),SUMPRODUCT(MAX($D$1:$D$6*--($D$1:$D$6<=B1)*--($D$6>B1*0.95))),SUMPRODUCT(MAX($D$1:$D$6*--($D$1:$D$6<=B1)*--($D$6>B1*0.95))),SUMPRODUCT(MIN($D$1:$D$6+1E+99*(--($D$1:$D$6<B1)+--($D$1:$D$6>(B1*1.05))))))

现在,我们有一个号码。我们需要做的就是使用VLOOKUP,或者使用MATCH来获取它所在的行,并INDEX来获取该行的数据:

Office 365:

=IFERROR(VLOOKUP(B1,$D$1:$E$6,2,FALSE),VLOOKUP(CHOOSE(2+SIGN(2-(MAXIFS($D$1:$D$6,$D$1:$D$6,"<="&B1,$D$1:$D$6,">="&(B1*0.95))+MINIFS($D$1:$D$6,$D$1:$D$6,">="&B1,$D$1:$D$6,"<="&(B1*1.05)))/B1),MAXIFS($D$1:$D$6,$D$1:$D$6,"<="&B1,$D$1:$D$6,">="&(B1*0.95)),MAXIFS($D$1:$D$6,$D$1:$D$6,"<="&B1,$D$1:$D$6,">="&(B1*0.95)),MINIFS($D$1:$D$6,$D$1:$D$6,">="&B1,$D$1:$D$6,"<="&(B1*1.05))),$D$1:E$7,2,FALSE))

否则:

=IFERROR(VLOOKUP(B1,$D$1:$E$6,2,FALSE),VLOOKUP(CHOOSE(2+SIGN(2-(SUMPRODUCT(MAX($D$1:$D$6*--($D$1:$D$6<=B1)*--($D$6>B1*0.95)))+SUMPRODUCT(MIN($D$1:$D$6+1E+99*(--($D$1:$D$6<B1)+--($D$1:$D$6>(B1*1.05))))))/B1),SUMPRODUCT(MAX($D$1:$D$6*--($D$1:$D$6<=B1)*--($D$6>B1*0.95))),SUMPRODUCT(MAX($D$1:$D$6*--($D$1:$D$6<=B1)*--($D$6>B1*0.95))),SUMPRODUCT(MIN($D$1:$D$6+1E+99*(--($D$1:$D$6<B1)+--($D$1:$D$6>(B1*1.05)))))),$D$1:E$7,2,FALSE))

(显然,将$D$1:$D$6$D$1:$E$6更改为实际数据表范围,将B1更改为输入值范围