我有一份客户代码和电子邮件列表工作表1(AC EMAIL),其中 A 列列出客户代码,B 列列出电子邮件。
我使用 vlookup 将客户电子邮件复制到工作表2(AC 地址)包含客户代码及其邮政地址。
我用了:
=VLOOKUP(A3,'AC EMAIL'!$A$1:$B$25989,2,FALSE)
然而有些客户出现在工作表12 或 3 次,因为他们列出了多个电子邮件。
我只想提取第二封和第三封电子邮件到工作表2在另一个电子邮件栏中。
我使用的公式只是复制了第一封电子邮件列出,我无法获得正确的公式来显示何时第二封电子邮件给出。
这就是我想要做的,在单个客户端代码行上显示一列第一封电子邮件和一个第二或者第三显示是否提供了另一封电子邮件的列。
事实证明,这并不像我希望的那样简单。非常感谢您的帮助。
答案1
INDEX
MATCH
这对于使用动态设置INDIRECT
重新定位搜索范围非常有用。
从最简单的情况开始:
=INDEX(A2:B10,MATCH(D2,A2:A10,0),2)
给定代码和名称的列表,转到(第一个)行匹配的代码并从该行返回名称。
但是如何获取第二条匹配的记录呢?
遍历列表,在第一次出现后仅搜索其余部分。MATCH
我们知道第一个匹配记录出现的位置 - 因此我们将使用INDIRECT
重复相同的INDEX
MATCH
函数,但将范围限制在找到第一个匹配项后的列表部分。
换句话说,使用相同的公式,但替换A2:B10
为INDIRECT("A"&MATCH(D2,$A$2:$A$10,0)+2&":B10")
(然后将整个东西包裹起来IFERROR
以保持外观)
现在我们有:
=IFERROR(INDEX(INDIRECT("A"&MATCH($D2,$A$2:$A$99,0)+2&":B99"),MATCH($D2,INDIRECT("A"&MATCH($D2,$A$2:$A$99,0)+2&":A99"),0),2),"not found")
您会注意到,这种方法确实依赖于对客户端代码列进行排序 - 我们已经将 硬编码+2
到定义范围的单元格引用中 - 记住原始范围以 开头A2
,而不是A1
,因此我们添加一行来赶上,然后我们添加另一行以从下一行开始范围。
这应该可以很清楚地说明我们下一步要做什么:
只需将其更改+2
为+3
从下一行开始搜索范围(跳过第一行二我们可以使用 String[1] 和 String[2] 来匹配下一列的第三个实例。
但是如果我们有很多列,或者只是不喜欢更新公式怎么办?
最后,我们将使用 将这些+2
和+3
偏移量替换为单元格引用COLUMN
。这使得公式在复制时可以水平扩展,而无需进行任何手动编辑:
=IFERROR(INDEX(INDIRECT("A"&MATCH($D2,$A$2:$A$99,0)+COLUMN()-4&":B99"),MATCH($D2,INDIRECT("A"&MATCH($D2,$A$2:$A$99,0)+COLUMN()-4&":A99"),0),2),"not found")
请注意,因为我的示例目标数据从单元格开始E2
,所以我的COLUMN
偏移量需要手动设置一次COLUMN()-4
- 但一旦设置完成,那公式可以写在目标范围的左上角单元格中,然后向下复制对于您需要的尽可能多的实例(同样,只要源数据按代码排序,因为迭代的整个前提INDEX
MATCH
是从“下一行”重复搜索)。
答案2
VLOOKUP()
不支持检索第二个或第三个(或第一个以外的任何)匹配项。它应该找到满足搜索条件的第一个匹配项。
你的问题并没有明确表示你总是想要第二个,或者总是第三个 - 或者总是最后的匹配。
假设你总是想要最后的匹配,一种方法是相应地对数组进行排序。无论什么数据,只要你想要的条目位于最后的可以使用位置将其排序到第一的位置(通过在另一个方向对该列进行子排序)。如果当前序列只是从输入开始的历史序列,则可以添加“活动”列并在那里放置“X”(然后按降序排序)等;或者添加带有有效日期的列,或类似的东西。
或者,您可以识别并丢弃所有重复项,只保留“最后”=“想要”条目;取决于您是否想保留其他条目。
无论如何,没有简单直接的解决方案 - Excel 公式不是编程语言。如果您愿意,您可以随时进入 VB 并在那里编写代码。
答案3
鉴于“VLOOKUP() 不支持检索第二个或第三个(或除第一个之外的任何匹配项)。它应该找到满足搜索条件的第一个匹配项。” -
您必须使查找唯一。如果您为序列创建一个列,该列在双倍时递增,在新序列时重新开始 - 例如 if(c2=c3,+b2+1,1),然后创建一个包含序列 - +c3&b3 的关键列,那么您可以对您想要的任何序列进行查找。