我有一份地点清单,其中大部分都有一个城镇名称。我想取下这个小镇的名字。然而,一些城镇名称包含在其他名称中,例如"hadley“和"east hadley”。基于这个职位,我找到了两种不同的解决方案(见下图)。但是,根据D列中城镇名称的顺序,结果可能返回较短或更长的名称。我怎样才能得到更完整的比赛呢?我有超过18000张记录,所以需要一个自动化的解决方案。
发布于 2015-11-30 16:10:22
因此,根据我的评论,两个公式都不起作用的原因是excel搜索一个方向直到找到匹配,然后停止搜索,即使有一个更好的匹配。
你的第一个方程是自上而下的,第二个是自下而上的,这就是为什么你得到了不同的答案。
要解决这个问题,搜索区域必须按某种顺序排列。它必须沿着搜索路径从最长的字符串到最短的字符串。
为此,在E中添加一个助手列,将公式Len(D2)
放在E2中,然后向下复制。然后对E栏中的D列和E列进行排序:
然后只需使用第一个方程:
如果您喜欢第二列,则对D和E列进行升序排序:
并使用第二个方程:
第三种选择是同时执行这两种操作,并采取最长的步骤,但这是更多的步骤,可以通过简单的搜索列表排序来更快地完成这些步骤。
发布于 2015-11-30 15:05:44
我认为您可以将新列中B和C列的结果与:=IF(LEN(B2)>LEN(C2);B2;C2)
进行比较。
发布于 2015-11-30 17:14:02
只是为了给您一个没有排序或帮助列的解决方案:
=INDEX($D$2:$D$6,MAX((MAX(NOT(ISERROR((FIND($D$2:$D$6,A2)>0)))*LEN($D$2:$D$6))=LEN($D$2:$D$6))*NOT(ISERROR(FIND($D$2:$D$6,A2)))*ROW($1:$5)))
或者另一种(稍微快一点)的方式:
=INDEX($D$2:$D$6,MAX((MIN(LEN(SUBSTITUTE(A2,$D$2:$D$6,"")))=LEN(SUBSTITUTE(A2,$D$2:$D$6,"")))*ROW($1:$5)))
但是:我不建议使用.虽然对于小型表是可以的,但是计算的时间对于每一个额外的关键字都会非常长.
此外,如果没有找到匹配项,第一个公式将输出列表中的第一个项,而第二个公式将输出列表的最后一个条目。
最好使用Scott的解决方案,并按长度排序(应该更快,但您可以自己检查)
至少,您还可以像这样使用vba:
Public Function maxMatch(str As String, rng As Range) As String
Dim cell As Variant
For Each cell In rng.Value
If InStr(str, cell) > 0 And Len(cell) > Len(maxMatch) Then maxMatch = cell
Next
End Function
然后简单地放入单元格=maxMatch(A2,$D$2:$D$6)
(但是,如果不使用VBA,则不算VBA) ;)
https://stackoverflow.com/questions/34009426
复制