我有一张表格,叫做July 5 2016
。它看起来像这样
Pers.No Employee/app.name Date ... etc ... etc .. Rec.Order
12345 Bob Jones Jan 2016 EXVM_SI15H55
etc etc etc etc
我有另一个文件,Sheet1
看起来像
Description PEATS Rec.Order
Helped moving things 284367 EXVM_SI15H55
Database dev 232367 BXVM_SI15H55
etc etc etc
我想要做的是在July 5 2016
CalledDescription
和中创建另一列PEATS
。我想使用VLOOKUP
或类似的东西来获取第一张表中已有的 Rec.Order,并在 中搜索该 Rec.Order Sheet1
,然后填充相应的PEATS
数字和Description
我该如何处理?谢谢
答案1
在工作表(“2016 年 7 月 5 日”)中,您不能使用,Vlookup
因为您想要的信息是左边索引值。请改用索引/匹配公式。
描述如下:
=INDEX(Sheet1!$A$2:$A$100,MATCH($D1,Sheet1!$C$2:$C$100,0))
对于 PEATS:
=INDEX(Sheet1!$B$2:$B$100,MATCH($D1,Sheet1!$C$2:$C$100,0))
您会看到,您正在将查找值与 Sheet1 上的相应列进行匹配,这反过来会为您提供查找值所在的行,该行会从 A 列或 B 列中选择数据来提供您想要的内容。
答案2
那么,就让我们挽救一下VLOOKUP()
的名声吧!
当然,INDEX/MATCH
在这里效果很好,一旦你理解了它的工作原理,它就是一种简单的方法。今天(2021 年),XLOOKUP()
除了做该INDEX/MATCH
做的事情之外,我们还提供了一些有用的功能,但以一种直接的方式,而不是稍微复杂的方式INDEX/MATCH
。无论是当时还是现在,这都是解决这个问题的非常好的方法。
但是,VLOOKUP()
在这里被错误地诽谤了。它不能自己“向左看”,但两者都不能INDEX()
或MATCH()
不能自己做到这一点。但是,通过一个小技巧,使用INDEX()
,它可以查看任何地方,并且无论表格有多少列,都可以用两列来做到这一点。你总是可以换句话说,借助一个非常简单的INDEX()
,它可以精确地完成INDEX()
借助所做的工作MATCH()
。(我强调,因为我经常听到人们使用两个功能组合来做一些这两个功能都无法单独完成的事情,不知何故使用VLOOKUP()
...等待它...两个功能组合...不知何故不适合人类的解决方案。呃......)
又怎样?
嗯,问题在于 中的表格参数VLOOKUP()
。查找列必须位于所需信息列的左侧。第一个参数或最后一个参数都没有问题:第一个参数是因为您确切知道查找值的位置或内容,最后一个参数是因为您肯定知道您需要的是 FALSE(可能)还是 TRUE。第三个参数没有问题,因为它始终是“2”。
所以,表格。您心中有一些数据范围。您只需要重新排列它。您可能不能只移动列,因为要么这不是您的数据,要么会弄乱其结构,要么会弄乱其他工作,要么您只是不想这样做。但是……INDEX()
可以为您做到这一点。事实上,它不仅可以重新排列查找的列,还可以将函数中使用的列从源数据中的许多列减少到查找中的仅两个。同样的事情INDEX/MATCH
应该如此有价值。
INDEX()
在大多数用途中,它需要三个参数。使用第四个参数可以用于多种用途,其中最重要的是将物理上独立的单元格区域放在一个列中。但请考虑通常的三个参数:第一个是源数据,一些范围/命名范围/正式表格/其他内容(甚至是您想要评估但不希望“在现实生活中”存在的其他函数的构造)。很简单。第二个和第三个参数让它变得有趣。
首先是第三个,因为这是魔法发生的地方。“Column/s”参数。您可以通过多种方式指定要使用的列,但大多数人不知道或想到的一种是使用。它们Array Constant
看起来像这样:{3,2,8,6,7,8}。您将列号放在{}
并INDEX()
使用这些列。您可以省略一些(就像我做的那样:1、4 和 5 似乎缺失了,是吗?并且任何高于 8 的列。),您可以将一些列“乱序”(就像我对“3, 2”所做的那样),您甚至可以让给定的列出现多次(就像我对第 8 列出现两次所做的那样)。
因此,对于列参数(如果进行罕见的水平查找,则为行),您可以在数组常量中使用两个数字:首先,您要在其中查找查找值的列;其次,您要在其中查找数据的列。(看看查找中的列参数始终为“2”?)在讨论完行参数后,我将给出一个例子。
INDEX()
任何时候,如果您在另一个参数的常用快捷方式中使用数组常量之类的东西,无论是将其留空还是使用“0”,都会失败。因此,您必须为 row 参数指定一个实际值。有两种明显的方法,一种使用了几十年,仍然很棒,另一种使用较新的函数SEQUENCE()
。第一种方法非常简单,第二种方法同样简单,但如果您愿意,它可以变得(有趣的)复杂。
第一个是=ROW(INDIRECT("1:"&ROWS("source table")))
如果您希望它随数据表增长和收缩,则只需这样做ROW(1:20000)
(更改为所需的高数字)。第二个,如果您不担心增长和收缩,则使用SEQUENCE()
将是SEQUENCE(ROWS("source table"))
或只是一个数字。
以下是我所谈论内容的完整版本:
=VLOOKUP(G1,INDEX(A1:F20000,ROW(INDIRECT("1:"&ROWS(A1:F20000))),{4,2}),2,FALSE)
或者
=VLOOKUP(G1,INDEX(A1:F20000,SEQUENCE(ROWS(A1:F20000)),{4,2}),2,FALSE)
源范围为 A1:F20000,查找值输入到 G1,查找的列为 4,想要获得结果的列为 2。
INDEX()
获取源表,并将其所有行(但仅将第 4 列和第 2 列按该顺序(4,然后 2))返回给函数VLOOKUP()
。VLOOKUP()
在第一列中查找INDEX()
G1 中的值(4),当找到该值时,在第二列的相应行中查找INDEX()
(2)以查找要返回的内容。
所以,是的,当然INDEX/MATCH
(虽然现在XLOOKUP()
它并不总是一个纯粹、简单的替代INDEX/MATCH
)更好。一旦理解了(它并不难理解,虽然通常网站没有很好地解释它,只是喋喋不休地谈论它是如何组合在一起的),它就很简单,非常直接。
但要说VLOOKUP()
“不能向左看”?不。这完全是错误和卑鄙的。这几乎是一种贬低(或者对于那些仍然说“程序”而不是“应用程序”的人来说......“废话”),VLOOKUP()
但我的老朋友非常有帮助,并且它的参数所能做的事情比几乎任何人认为的都要细致入微。
(不过,它似乎永远不会给出结果引用。或者至少,我还没有找到强制它这样做的方法。因此,它INDEX()
在那里获胜,因为它可能非常有用。现在不那么有用了,但仍然......)