【问题标题】:How to return a value by matching a cell (string) to a range of pre-fixes如何通过将单元格(字符串)与一系列前缀匹配来返回值
【发布时间】:2015-05-14 09:34:26
【问题描述】:

我以前没有看到过这个问题,所以我希望这可能是一个新的东西,可以让你深入了解并帮助我解决棘手的问题。

我在一列中有超过 13K 个值的列表,这些值是位置。我们称它为 A 列。

这些位置无法排序,并且是单个值和多个值的混合。例如1A-01R 或 1B-04L、4C-3D、094-01F、TOR-5-A、TOR-F。

在我放在电子表格中的另一列中,它是按前缀细分的这些位置的列表,大约有 80 个不同的值。我们称之为 B 列。

在 B 列旁边,我列出了每个前缀位置的描述,例如垃圾箱、货架、院子、地板等。我们称之为 C 列。

我一直在努力解决的问题是,如何在 B 列的前缀列表中搜索 A 列中的值并返回 C 中的相应值?

似乎 Excel 喜欢根据完整值列表搜索不完整值,但如果您尝试反转逻辑,则会出错。

我尝试过使用 vlookup、索引和匹配都无济于事。

一个小例子。 A = 13k+ 行,B = 80 行,c= 80 行

Column A  Column B  Column C   Column D
AREA 5      1A-     RACKS      Formula? = check A against range in column B and return C
094-10G     1B-     RACKS
1J-H0L      1C-     RACKS
099-03A     1D-     RACKS
098-03C     1E-     RACKS
1L-F2R      1F-     RACKS
1K-L5L      1G-     RACKS
1C-D5R      1H-     RACKS
AREA 5      1I-     RACKS
1F-L4L      1J-     RACKS
1F-L4L      W5E-    RACKS
W5-E7       W5-     FLOOR
W5-E7       098-    RACKS
W5-E7       099-    BINS
W5E-01L     AREA    FLOOR

更新 1

好的,根据我认为我们已经接近解决方案的建议。

我在 D 列中使用了以下公式,该公式似乎始终有效并返回 B 列中的值。

{=IFERROR(INDEX($B$2:$B$91,MATCH(1,COUNTIF(A2,""&$B$2:$B$91&""),0)) ,"")}

这是一个数组公式,所以我用的是ctrl+shift+enter。

现在我们需要做的就是让这个公式返回 C 列中的值,我想我们差不多了。

问题的另一部分可能是一步之遥,即向公式单元格返回多个值,在实例中,A 列的单元格中存储了多个位置。

更新 2。

好的,我们有一个工作公式,它可以根据 B 列中的范围检查 A 列的内容,并在 D 列中返回存储在 C 列中的值! =)

数组公式为:{=VLOOKUP(IFERROR(INDEX($B$2:$B$91,MATCH(1,COUNTIF(A3,""&$B$2:$B$91&""),0)) ,""),B:C,2,FALSE)}

location                        pre-fix            loc type
W5-E3       
W5-E3,W5-E4     
W5-B6       
W5-A4       
W50-01      
W5N-02R, W5-N5R,W5X-02L     
W5K-00R, W5-L0R     
W50-01      
W5-C6       
W5-AA01L        
W5-F5       
W5-A4,W5-E5,W5-C3,W5-A3     
W5-C5,W5-B6     
W5-C1       
W5H-04,W5H-03,W5-D4,W5G-00,W5-A1        
W5-D7       
W5V-00

这是一个大问题,是否可以在 D 列的单个单元格中找到并返回在 A 列的单元格中找到位置的每个实例?

【问题讨论】:

  • 请用一两个列 B 值的示例更新您的问题。
  • 已添加示例数据。

标签: excel search indexing match


【解决方案1】:

首先,您需要从A 列中的数据中提取前缀。假设分隔符是空格或破折号,您可以使用以下公式:

=LEFT(A2,IF(ISERROR(FIND("-",A2)),FIND(" ",A2)-1,FIND("-",A2)))

然后您可以使用VLOOKUPB 列中搜索此值,并在C 列中返回值。您可以在VLOOKUP 中嵌入上述函数来创建单个公式:

=VLOOKUP(LEFT(A2,IF(ISERROR(FIND("-",A2)),FIND(" ",A2)-1,FIND("-",A2))),B$2:C$16,2,FALSE)

根据上面的数据,这给出了一些 #N/A 值 - 这些是从 A 列中提取的前缀在 B 列的列表中不存在的位置。

    Column A    Column D
    AREA 5      FLOOR
    094-10G     #N/A
    1J-H0L      RACKS
    099-03A     #N/A
    098-03C     #N/A
    1L-F2R      RACKS
    1K-L5L      RACKS
    1C-D5R      RACKS
    AREA 5      FLOOR
    1F-L4L      RACKS
    1F-L4L      RACKS
    W5-E7       #N/A
    W5-E7       #N/A
    W5-E7       #N/A
    W5-E7       #N/A

更新 1

好的,根据我认为我们已经接近解决方案的建议。

我在D 列中使用了以下公式,该公式似乎始终有效,并返回B 列中的值。

{=IFERROR(INDEX($B$2:$B$91,MATCH(1,COUNTIF(A2,"*"&$B$2:$B$91&"*"),0)),"")}

这是一个数组公式,所以我使用ctrl+shift+enter

现在我们需要做的就是让这个公式返回 C 列中的值,我想我们快到了。

问题的另一部分可能是一步之遥,即向公式单元格返回多个值,在实例中,A 列中的单元格中存储了多个位置。

更新 2。

好的,我们有一个工作公式,可以根据 B 列中的范围检查 A 列的内容并在 D 列中返回,值存储在 C 列中! =)

数组公式为:{=VLOOKUP(IFERROR(INDEX($B$2:$B$91,MATCH(1,COUNTIF(A3,""&$B$2:$B$91&""),0)),""),B:C,2,FALSE)}

location          pre-fix     loc type
W5-E3       
W5-E3,W5-E4     
W5-B6       
W5-A4       
W50-01      
W5N-02R, W5-N5R,W5X-02L     
W5K-00R, W5-L0R     
W50-01      
W5-C6       
W5-AA01L        
W5-F5       
W5-A4,W5-E5,W5-C3,W5-A3     
W5-C5,W5-B6     
W5-C1       
W5H-04,W5H-03,W5-D4,W5G-00,W5-A1        
W5-D7       
W5V-00

这是一个大问题,是否可以在 D 列的单个单元格中找到并返回在 A 列的单元格中找到位置的每个实例?

【讨论】:

  • 这看起来不错,史蒂夫,但是...我有 TOR-A3 和 TOR-5-A 的位置。你将如何绕过双 - ?毕竟问题是你无法区分 TOR- 或 TOR-5-XYZ...
  • 好的,达伦,是不是可以有一个或两个破折号,如果有两个,那么前缀是直到并包括第二个破折号的部分?那么,对于 TOR-A3,它是“TOR-”,而对于 TOR-5-A,它是“TOR-5-”?如果是这样,以下将起作用: =VLOOKUP(LEFT(B2,IF(ISERROR(FIND("-",B2)),FIND(" ",B2)-1,FIND("-",B2,IF(ISERROR) (FIND("-",B2,FIND("-",B2)+1)),1,FIND("-",B2,FIND("-",B2)+1)))))),C$2 :D$16,2,错误)。不过这有点笨拙!如果您还有更多案例,最好发布完整的案例,以便我们制定一个涵盖所有可能性的公式。
  • 您对 VBA 函数满意吗?在单个 Excel 公式中执行此操作变得相当复杂。
  • 嗨,史蒂夫,我考虑过 VBA,但我会把这张表交给非编码人员,所以如果这可以在公式中实现,那就更好了。而且我看到我没有更新主要帖子,但是您的回答却是大声笑!
  • 好的,我明白了。 VBA 函数最终可能会变得更加用户友好,因为很长的嵌套公式变得难以编辑和排除故障......添加额外的列来分解它怎么样(如果需要,这些可以隐藏)?关于您关于多个实例的具体问题,我看到这些有时用逗号分隔,有时用逗号分隔,然后用空格分隔。这些是唯一的选择吗?单个单元格中是否有最大可能的位置数?
【解决方案2】:

只需隔离列A的前缀部分并在VLOOKUP()中使用它。在 D1 中输入:

=VLOOKUP(IF(LEFT(A1,4)="AREA","AREA",MID(A1,1,FIND("-",A1))),B:C,2,FALSE)

然后抄下来:

【讨论】:

  • 我遇到的问题是前缀在 A 中有所不同,在您的示例中它看起来不错,但在我正在查看的范围内,我不断收到我知道的值的 #N/a 错误我有前缀。我最接近的方法是使用索引和匹配,但即便如此,它还是会出现误报。
  • 正如我在另一个解决方案中提到的,我有 W5-A3 或 W5A-01L 或 TOR-A4、TOR-5-A 之类的位置。两种建议的解决方案都跳过了这些。
  • @DarrenDawson 我认为我们已经完成了大约 80% ......用公式无法处理的情况更新您的原始帖子,我们可以进行调整!
  • 我提供了更多可用数据并提供了一个工作公式来使用索引返回 a 值。让我知道你的想法。
【解决方案3】:

好的,我们有一个工作公式,可以根据 B 列中的范围检查 A 列的内容并在 D 列中返回,值存储在 C 列中! =)

数组公式为:

{=VLOOKUP(IFERROR(INDEX($B$2:$B$91,MATCH(1,COUNTIF(A3,""&$B$2:$B$91&""),0)),""),B:C,2,FALSE)}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-05
    • 1970-01-01
    • 2017-08-20
    相关资源
    最近更新 更多