You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Excel VLOOKUP模糊匹配:地址与省份数据关联需求

实现Excel地址与省份的模糊匹配并新增对应列

我来帮你解决这个Excel模糊匹配的需求,下面提供几种实用的实现方法,覆盖不同基础的用户:

问题背景

手头有两个Excel工作表:

  • Sheet1:包含混合的公司名称和地址数据(每行是单个公司名或地址)
  • Sheet2:一份省份/区域名称的列表

需要完成的任务是:给Sheet1新增一列,对每行内容模糊匹配Sheet2里的省份,找到匹配项就填入省份名称,没找到就显示#N/A。预期效果如下:

Resultaddress
#N/ACong 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/AC么ng Ty C峄�Ph岷 An Ph瓢啤ng Nam
L锚 Ch芒ns峄�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,错误值转成FALSE
  • IF(...):将TRUE对应的省份行号转为相对行号,FALSE保留为逻辑值
  • MAX(...):提取最大的匹配行号(如果有多个匹配,取最后一个;无匹配则返回0)
  • INDEX(...):根据行号取出对应的省份名称
  • IFERROR(...):无匹配时返回#N/A替代错误值

方法二:Power Query(适合批量处理,灵活度更高)

如果数据量较大,或者需要后续重复处理,Power Query是更高效的选择:

  1. 打开Excel,依次点击数据 -> 从表格/区域,分别将Sheet1和Sheet2导入Power Query编辑器(注意勾选"我的表格有标题",如果没有标题就不勾选)
  2. 在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开启大小写忽略(可根据需求删除)
  1. 点击关闭并上载,将处理后的数据导出到新工作表,或者覆盖原始Sheet1(记得先备份数据)

方法三:VBA脚本(适合有编程基础,可自定义逻辑)

如果需要更个性化的匹配规则(比如返回所有匹配的省份),可以用VBA宏实现:

  1. Alt+F11打开VBA编辑器,右键点击当前工作簿 -> 插入 -> 模块
  2. 粘贴以下代码:
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
  1. 点击工具栏的"运行"按钮,Sheet1的B列就会自动填充匹配结果

额外提示:

  • 如果Sheet1的行是交替的公司名和地址,不需要额外筛选——公司名不含省份的话会自动返回#N/A,正好符合需求
  • 如果同一段文本匹配多个省份,方法一返回最后一个匹配项,方法二返回第一个,VBA可以修改代码返回所有匹配(比如用逗号分隔)

内容的提问来源于stack exchange,提问作者An Pham Karion Co.Ltd

火山引擎 最新活动