问题描述
我正在尝试从此处提出的问题中实施非常有用的第二种解决方案:
Excel - Cell Contains a Value from a List - Return list value
大体上,第二个解决方案可以无缝运行,但是我的数据还包含另一个要解决的问题。
我要搜索的变量列表包括地点名称,其中一些名称包含在其他名称中。但是,作为“基本”或“根”字符串,我只返回较小的字符串,而不是较大的字符串。
我已附上该工具如何返回错误值的副本。
有人知道如何修改公式以仅返回我想要的确切字符串吗?我了解索引列表中条目的顺序会对收益产生影响(例如,如果在下面提供的示例中Castle在Castle Hill上方,则这两个条目都是如此,但是请注意,我正在使用16,000个地名在实际的数据集中,因此确保所有潜在的排列顺序正确都是很困难的
What I am wanting to achieve versus what I am achieving image
解决方法
做两件事将解决屏幕快照中的所有错误:
- 使用
FIND()
(区分大小写)而不是SEARCH
(不区分大小写)。这样可以修复Alva和Stow错误。 - 将位置关键字从最长到最短排序。由于您的公式返回了第一个匹配项,因此,如果“字符串”列中有“墨尔本港”,则墨尔本港将优先于墨尔本。
但是,这不能解决“ Stowage Alva”或“ Stow Alvan”之类的问题。为此,我们假定您的位置关键字始终在前面或后面加上空格,或两者都在前面(因为所有标点符号都已预先删除)。我们可以通过将公式中的 ISNUMBER(SEARCH($F$2:$F$9,A2))
替换为以下两种情况来检查这两种情况:
ISNUMBER(1/(IFERROR(FIND(" "&$F$2:$F$9,A2),0)+IFERROR(FIND($F$2:$F$9&" ",0)))
MATCH(TRUE,INDEX(ISNUMBER(SEARCH($F$2:$F$9,A2)),),0)
在您的公式中,并带有:
MATCH(1,ISNUMBER(FIND(" "&$F$2:$F$9&" ",A2))+(LEFT(A2,LEN($F$2:$F$9))=$F$2:$F$9)*ISNUMBER(FIND($F$2:$F$9&" ",A2))+(RIGHT(A2,LEN($F$2:$F$9))=$F$2:$F$9)*ISNUMBER(FIND(" "&$F$2:$F$9,0)