Excel VLOOKUP模糊匹配:地址与省份数据关联需求
实现Excel地址与省份的模糊匹配并新增对应列
我来帮你解决这个Excel模糊匹配的需求,下面提供几种实用的实现方法,覆盖不同基础的用户:
问题背景
手头有两个Excel工作表:
- Sheet1:包含混合的公司名称和地址数据(每行是单个公司名或地址)
- Sheet2:一份省份/区域名称的列表
需要完成的任务是:给Sheet1新增一列,对每行内容模糊匹配Sheet2里的省份,找到匹配项就填入省份名称,没找到就显示#N/A。预期效果如下:
| Result | address |
|---|---|
| #N/A | Cong Ty Tnhh Vien Thong Huy Hoang (company name) |
| An D瓢啤ng | 膼岷穘g C瓢啤ng An D瓢啤ng H岷 Ph貌ng (address) //匹配关键词为"An D瓢啤ng" |
| #N/A | C么ng Ty C峄�Ph岷 An Ph瓢啤ng Nam |
| L锚 Ch芒n | s峄�13/45 Ph峄�ch峄�膼么n , Ngh末a X谩 L锚 Ch芒n H岷 Ph貌ng //匹配关键词为"L锚 Ch芒n" |
方法一:Excel数组公式(适合新手,无需额外工具)
假设Sheet2的省份列表在A1:A14区域,在Sheet1的B1单元格(新增列的第一个单元格)输入以下数组公式,输入完成后按Ctrl+Shift+Enter确认(Excel 365及以后版本直接按Enter即可),然后下拉填充到所有行:
=IFERROR(INDEX(Sheet2!$A$1:$A$14,MAX(IF(ISNUMBER(SEARCH(Sheet2!$A$1:$A$14,A1)),ROW(Sheet2!$A$1:$A$14)-ROW(Sheet2!$A$1)+1))),"#N/A")
公式拆解:
SEARCH(Sheet2!$A$1:$A$14,A1):检查Sheet2的每个省份是否在当前行文本中出现,返回匹配位置或错误值ISNUMBER(...):把匹配位置转成TRUE,错误值转成FALSEIF(...):将TRUE对应的省份行号转为相对行号,FALSE保留为逻辑值MAX(...):提取最大的匹配行号(如果有多个匹配,取最后一个;无匹配则返回0)INDEX(...):根据行号取出对应的省份名称IFERROR(...):无匹配时返回#N/A替代错误值
方法二:Power Query(适合批量处理,灵活度更高)
如果数据量较大,或者需要后续重复处理,Power Query是更高效的选择:
- 打开Excel,依次点击数据 -> 从表格/区域,分别将Sheet1和Sheet2导入Power Query编辑器(注意勾选"我的表格有标题",如果没有标题就不勾选)
- 在Power Query编辑器中,选中Sheet1的查询,点击添加列 -> 自定义列,输入以下公式:
= let currentText = [Column1], matches = List.Select(Sheet2[Column1], (x) => Text.Contains(currentText, x, Comparer.OrdinalIgnoreCase)) in if List.Count(matches) > 0 then matches{0} else "#N/A"
Text.Contains实现模糊匹配,Comparer.OrdinalIgnoreCase开启大小写忽略(可根据需求删除)
- 点击关闭并上载,将处理后的数据导出到新工作表,或者覆盖原始Sheet1(记得先备份数据)
方法三:VBA脚本(适合有编程基础,可自定义逻辑)
如果需要更个性化的匹配规则(比如返回所有匹配的省份),可以用VBA宏实现:
- 按
Alt+F11打开VBA编辑器,右键点击当前工作簿 -> 插入 -> 模块 - 粘贴以下代码:
Sub MatchProvinces() Dim ws1 As Worksheet, ws2 As Worksheet Dim lastRow1 As Long, lastRow2 As Long Dim i As Long, j As Long Dim matchFound As Boolean ' 定义工作表对象 Set ws1 = ThisWorkbook.Sheets("Sheet1") Set ws2 = ThisWorkbook.Sheets("Sheet2") ' 获取数据最后一行 lastRow1 = ws1.Cells(ws1.Rows.Count, "A").End(xlUp).Row lastRow2 = ws2.Cells(ws2.Rows.Count, "A").End(xlUp).Row ' 设置新增列标题 ws1.Cells(1, "B").Value = "Result" ' 遍历Sheet1的每一行 For i = 2 To lastRow1 ' 如果Sheet1没有标题,就改成i=1 matchFound = False ' 遍历Sheet2的省份列表 For j = 1 To lastRow2 ' vbTextCompare表示忽略大小写匹配 If InStr(1, ws1.Cells(i, "A").Value, ws2.Cells(j, "A").Value, vbTextCompare) > 0 Then ws1.Cells(i, "B").Value = ws2.Cells(j, "A").Value matchFound = True Exit For ' 找到第一个匹配就停止,要返回所有匹配可删除此行 End If Next j ' 无匹配时填入#N/A If Not matchFound Then ws1.Cells(i, "B").Value = "#N/A" End If Next i End Sub
- 点击工具栏的"运行"按钮,Sheet1的B列就会自动填充匹配结果
额外提示:
- 如果Sheet1的行是交替的公司名和地址,不需要额外筛选——公司名不含省份的话会自动返回
#N/A,正好符合需求 - 如果同一段文本匹配多个省份,方法一返回最后一个匹配项,方法二返回第一个,VBA可以修改代码返回所有匹配(比如用逗号分隔)
内容的提问来源于stack exchange,提问作者An Pham Karion Co.Ltd




