Excel应用实战——如何实现智能提取并进行判断匹配的函数组合
一位来自广西的网友,据推测是个小哥,他想通过1、2两列进行对比,若1列能在2列中找到一样的城市,显示在3列。
来自广西网友的提问
表哥思路:首先提取B列的城市名称到辅助列,再判断是否在C列的城市列表中,最后将结果显示在D列。
我们截取前几行作为案例一步步说明如何实现。
第一步:组合MID+FIND提取B列的市级城市
如果每个城市的名字都是两个字,则可使用公式MID(8,2)直接提取。
但观察到案例中需要提取市级城市的名称字数不一致,有的是两个字,有的是三个字。所以不可直接用MID提取,需要借助能够帮助定位字数的关键字。
由于各行数据非常整齐,均包含关键字'市',并且省级字符数均为7个。
因此,可以借助查询函数,定位关键字'市',以确定城市字数。
如何通过关键字'市',以确定提取城市字数?
以B6为例,首先,确认市级城市名的第1个字的位序。
由于数据均来自'广西壮族自治区'(此处共7个字),则市级城市名字的起始位序为8;
之后,确认关键字'市'在第几位。公式为FIND('市',B6);
根据以上可得,城市的字数为'市'的位序与城市名起始位序之差,即为城市名的字数(如图绿色部分)。
综上,提取城市名称的辅助列公式为:
MID(B6,8,FIND('市',B6)-8)
提取了B列的城市名称后,下一步判断是否该城市在C列名单范围内。
第二步,使用查询函数与名单城市进行匹配
案例中,名单列表的全部城市被存储在一个合并单元格中,可将其视作一段字符串,也可作为数据区域。因此,查询方法分为两种。
方法一:使用函数FIND/SEARCH
与第一步中提取'市'关键字的方法一致,在单元格C3中查找,是否包含辅助列的城市名。以第3行为例,公式为FIND('钦州',$C$3)。
表哥Tips:
此处也可用函数SEARCH。公式为SEARCH('钦州',$C$3)。当判断内容为中文时,FIND和SEARCH用法几乎完全一致,而当在判断英文时,FIND判断一致性不但包括内容,还有大小写,所以FIND比SEARCH的匹配要求更加严格。
方法二:使用函数VLOOKUP/MATCH,进行数据区域查询
此方法查询原理为是否辅助列单元格与C列一致,显然若直接使用函数,结果全部城市都会被判定不在列表范围内。因此,需要用到通配符'*',与辅助列城市结合成一段与C列结构类似的字符串,系统才能进行正确判断。
公式为:
VLOOKUP('*'&'钦州'&'*',$C$3,1,FALSE)
或MATCH('*'&'钦州'&'*',$C$3,0)
第三步,根据查询结果显示最终结果
在上一步中,我们根据查询函数进行判断,判断是否辅助列提取的城市名在C列的名单列表中。若能够查询到,则说明在名单内,返回查询到的数据,而查询不到,则显示报错。
表哥Tips:
FIND/SEARCH报错时显示'#VALUE';VLOOKUP/MATCH报错显示'#N/A'。
我们利用是否报错这一点,在D列显示最终结果。
判断查询函数是否报错,可使用函数ISERROR(),如果报错,此函数返回'TRUE',否则返回'FALSE'。如果你觉得听起来似乎有些糊涂,可参考下表缕清逻辑:
判断是否报错的公式为:
ISERROR(第二步的查询函数)
结果为:
最后用IF函数判断并显示最后结果,如果'TRUE'则显示'N',否则显示'Y'。
综上三步,回顾整体思路,及所用到函数为: