我有两个Excel表格,记录的是相关数据,现在要把其中相同的选项选取出来。由于汇集的数据来源并不一致,其中有些相同选项会出现些微差别,比如“北京市海淀区CFAN”和“北京海淀区CFAN”,中间差一个“市”字,就可能导致无法匹配。能否设置一种模糊查找的方法,将类似的项对应起来呢?
【解题思路】
不管是一个表格还是两个表格,按挑战题中的描述,实际上就是把一些略有差别但实际相同的项找出来而已。模糊查找的关键,就是将不同项中重复的字符作为固定的关键词,而其中可能会有变化的地方则用一些特殊的符号(比如通配符)来替代。根据挑战题中的描述,该Excel表格中可能包含多个“北京市海淀区CFAN”或“北京海淀区CFAN”项,可以发现其中连续出现的重复字节是“海淀区CFAN”,从这一特征入手,通过Excel函数或VBA技术即可实现模糊查找。
【解题方法】
VLOOKUP函数实现模糊查找
根据挑战题中的描述,通过VLOOKUP函数即可实现。首先简单了解一下这一函数,按照Excel帮助文件中的描述,这一函数的格式如下:
VLOOKUP(lookup_value,table_array,col_index_num,range_lookup)
它共有四个参数:其中第一个表示要查找的目标、第二个表示查找的范围、第三个表示返回值的列数、第四个是精确或模糊查找的开关,如果它的值为0(或FALSE)则是精确查找,如果是1(或TRUE或省略)则为模糊查找。具体的模糊实现,可通过在查找目标中添加类似DOS下的通配符“*”来完成。
现在假设已有一个数据表(标签为“数据”,图1),接下来切换到另外一个数据表中(本例的标签为“查找”,图2),在C2单位格中输入“=VLOOKUP("*"&A2&"*",数据!$A$2:$B$7,2,0)”,可以使用拖动的方法在该列无限复制,将会看到只要是模糊符合原数据中的单位名称,相应的数据(这里是电话)就会自动显示出来。这个公式中,查找目标中的星号是为了模糊匹配,“数据!$A$2:$B$7”则指出对比的数据来源(在“数据”标签的表格中)。
01
02
VBA实现模糊查找
以上方法使用简单,大部分人很容易就能上手,但是它也有很大的局限性。如果稍微懂一些VBA知识,通过VBA编程,可以实现更灵活的模糊查找功能。
单击“开发工具”选项卡中的“Visual Basic”按钮,选择设计模式和插入(图3),选择Acttivex控件(CommandButton)并输入以下代码(不要输入前面的行号,那只是为了表述更方便):
03
01 Private Sub CommandButton1_Click()
02 Dim d As Object, Itm
03 Dim arr, k&
04 Dim rng As Range
05 Set d = CreateObject("Scripting.Dictionary")
06 For Each rng In Range("A2", Range("a1").End(xlDown))
07 d(rng.Value) = ""
08 Next
09 arr = Sheets("数据").Range("a1").CurrentRegion
10 For Each Itm In d
11 For k = 2 To UBound(arr)
12 If arr(k, 1) Like "*" & Itm & "*" Then d(Itm) = d(Itm) & " " & arr(k, 2)
13 Next
14 Next
15
16 On Error Resume Next
17 For Each rng In Range("A2", Range("a1").End(xlDown))
18 rng(1, 2).Resize(1, 1) = Split(Trim(d(rng.Value)), " ")
19 Next
20 Set d = Nothing
21 End Sub
以上代码并不复杂,这里对其核心语句略做解释。第5行代码是在创建字典对象,第6行表示从A2开始A列区域,第7行表示从A2开始数据写入数组,第9行定义arr来源于“数据”表A列,第10行表示Itm数据在字典里,第11行表示“数据”表A列数组从第二个开始到完成,第12行表示“数据”表A列数组中模糊查找Itm数据相等时等于B列数据,第17行根据单元格填写查找到的数据。
当然实现VBA模糊查找不限于以上代码,也可以通过其他方法来实现。