根据两列或更多列搜索字段


1

我想输出 professor 字段基于黄色字段中的输入。输入将是可能的 sub_codecolumn D 要么 column G。我试过了 VLOOKUP(...)INDEX(...,MATCH(...)),但我在尝试执行时遇到困难: either column D or column G

例如,我想要 John 当我输入时,在E7中打印 Ag1 要么 Ps1 在E8。

我怎么能为这个案子写一个函数?

Spreadsheet table


@ fixer1234基本上,我想要 John 我打字时打印在黄色光标框中 Ag1 要么 Ps1 在那个盒子里。我不确定使用哪种配方。
Sokunthaneth

只是为了澄清,是否要求输入和结果在同一个框中?如果是这样,您将需要VBA,因为键入的输入将替换单元格中的任何函数。
fixer1234

@ fixer1234对不起,这是不同的盒子。无需使用同一个盒子。让我们说当我进入时将其输出到灰色框中 sub_code 在黄色光标框中。
Sokunthaneth

任何一位教授都有可能拥有相同的子代码吗?
fixer1234

@ fixer1234一位教授可以有一个或多个 sub_code,但不一样 sub_code。每 sub_code 是独特的。
Sokunthaneth

Answers:


1

选项1:

要解决这个问题,你需要一个 HELPER细胞 设置选择您要使用的代码。

enter image description here

在单元格中写下此公式 F10

=IFERROR(INDEX($A$3:$A$6,IF($C$9=1,MATCH($D$10,$D$3:$D$6,0),IF($C$9=2,MATCH($D$10,$G$3:$G$6,0)))),"Wrong Code")

这个怎么运作:

  • 在辅助细胞中 C9,写你的选择应该是1或2。
  • Sub Code 在细胞中 D10
  • 公式将搜索 Sub CodeColumn D 如果 C9 has 1,否则检查 Sub CodeColumn G.
  • 如果在单元格中设置了错误的组合 C9 &安培; D10 然后公式将返回 错误的代码 错误。

编辑:

选项2:

此数组公式也可以在Cell中使用 F10

{=IFERROR(INDEX($A$3:$A$6,MATCH(1,($D$3:$D$6=$D$10)+($G$3:$G$6=$D$10),0)),"Wrong Code")}

注意,

  • 完成上面写的公式 Ctrl+Shift+Enter
  • 在工作的同时 方案2 无需在Helper Cell中编写Value C9,只写 Sub Code 在细胞中 D10

根据需要调整公式中的单元格引用。


我认为OP的问题是Sub_code可能在任何一列中,你不知道哪一个。因此,任务是在多列中查找它(而不是手动尝试每一列,直到找到匹配项)。
fixer1234

@ fixer1234,现在我已经编辑了帖子并且包含了一个数组公式将自动搜索两个列中的子代码! ☺
Rajesh S

选项2:好多了! :-)这些例子没有行或列引用,所以有点难以理解。也许应该提一下它是区分大小写的,并添加一些解释它是如何工作的句子。 +1(并且只删除选项1,因此这适用于解决方案。)
fixer1234

@ fixer1234 ,, Formula并不介意Case因为考虑了Upper&较低,1表示Ture,这在Col D或G中都是如此。
Rajesh S

在LO Calc中,除非案例匹配,否则它不匹配。猜猜我们发现了Excel和Calc不同的另一个例子。在我的解决方案中,匹配适用于任何一种情况你的使用相等,而Calc需要匹配的情况。
fixer1234

0

=IFERROR(INDIRECT("A"&IF(SUMPRODUCT(--($D$2:$D$5=$E$8),ROW($A$2:$A$5))=0, SUMPRODUCT(--($G$2:$G$5=$E$8),ROW($A$2:$A$5)), SUMPRODUCT(--($D$2:$D$5=$E$8),ROW($A$2:$A$5)))), IF(E8="","","Invalid code"))

我承认,它不是最短的,但在我看来它是最稳定的。 Fixer1234承认他不是太优雅,而Rajesh使用辅助单元格,这不是最佳实践,因为Excel不是为它们设计的,并且当你进入更复杂的项目时可能导致循环引用。

但是,回到我的公式。

这个怎么运作

SUMPRODUCT(--($D$2:$D$5=$E$8),ROW($A$2:$A$5):检查列D是否包含匹配项。如果是,则返回匹配的行号。如果未找到匹配项,则返回0。

SUMPRODUCT(--($G$2:$G$5=$E$8),ROW($A$2:$A$5):检查列G是否包含匹配项。如果是,则返回匹配的行号。如果未找到匹配项,则返回0。

IF(...=0, ..., ...):检查通过D列的搜索是否返回0,即不匹配。在这种情况下,它返回列G的结果。否则,它只返回列D的结果。

INDIRECT("A"&...):来自的行号 SUMPRODUCT s(或0,如果不匹配)与“A” - 第一列的字母组合。该 INDIRECT 函数然后找到具有该引用的单元格。例如。它可以找到名为'A3'的单元格,或者,如果没有找到匹配,'A0' - 一个不存在的单元格。

IFERR(..., ...):检查并处理错误。如果列D不包含匹配项,则它将返回对列G的搜索。但是,如果列G也不包含任何内容,则“A0”将仅传递给 INDIRECT 功能,不是真正的细胞。因此,它将导致错误,它将运行错误处理程序而不是显示错误。

IF(E8="","","Invalid code")):处理错误。如果输入单元格是空白的,它也只是保持空白,因为不需要大惊小怪。但是,如果它不是空白,但仍然存在错误,则返回 '无效的代码' ,因为它只能意味着某些东西被输入,并且某些东西是无效的。

例子

功能:

'He1' is written in E8, E7 returns 'Phillip'.

'Kh1' is written in E8, E7 returns 'Deav'.

空输入:

Both E7 and E8 are empty

输入无效:

'Rn1' is written in E8, E7 returns 'Invalid code'


这有效,并演示了另一种方法,但我认为它更复杂而不是更优雅或稳定。如果OP需要添加额外的列集(标题为“两列或更多列”,那么这是可预期的),它也不是可扩展的。公式是两倍长,我错过了它的优势。但这是一种有效的方法,答案写得很好;你做了很好的解释它是如何工作的。
fixer1234

0

VLOOKUP需要搜索最左边的列,这样就无法工作了。 INDEX + MATCH将起作用,但MATCH无法搜索多个或二维范围。解决方法是将不同范围的多个MATCH组合在一起。

enter image description here

E7中的查找结果使用以下公式:

=IFERROR(INDEX(A2:A5,IFERROR(MATCH(E8,D2:D5,0),0)+IFERROR(MATCH(E8,G2:G5,0),0)),"Invalid Sub_code")

每列都有自己的MATCH。匹配将仅在一列中发生,因此如果列没有匹配,则IFERROR返回零。然后添加匹配值将组合列的位置索引与匹配,并为任何其他搜索列组合零。问题标题是“两列或更多列”。这可以通过为每个附加列添加另一个MATCH表达式来扩展。

如果输入了错误的Sub_code,INDEX将使用自己的IFERROR进行封装。 MATCH不区分大小写,因此如果只有大小写不相同,它仍然会找到匹配。

当然,您可以拥有多个输入单元格和相应的结果单元格。

替代

@Rajesh S注意到这也可以重组:

=IFERROR(INDEX(A2:A5,MATCH(E8,D2:D5,0)),IFERROR(INDEX(A2:A5,MATCH(E8,G2:G5,0)),"Invalid Sub_code"))

这将每个MATCH表达式与INDEX一起使用。 INDEX上的IFERROR也会处理任何MATCH错误。然后嵌套IFERRORS,因此第一次查找中的错误转到第二次,并且出现错误的Sub_code警告。它的长度相同,因为当IFERROR函数计数减少时,INDEX函数计数会增加。这可以通过额外的嵌套扩展到其他列。

使用最直观的版本。

为了比较结构和逻辑,我将打破公式。

备选方案1:

=IFERROR(
       INDEX(A2:A5,
                 IFERROR( MATCH(E8,D2:D5,0) ,0) + IFERROR( MATCH(E8,G2:G5,0) ,0) )
        ,"Invalid Sub_code")

备选方案2:

=IFERROR( 
         INDEX(A2:A5, MATCH(E8,D2:D5,0) )
         ,IFERROR(
                  INDEX(A2:A5, MATCH(E8,G2:G5,0) )
                  ,"Invalid Sub_code")  )
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.