ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 3848|回复: 10

[求助] VBA 如何批量模糊匹配数据

[复制链接]

TA的精华主题

TA的得分主题

发表于 2019-6-28 11:07 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
大神们,请问如果能实现附件中的批量模糊查找?

涉及两张表格
表格一:模板表,或者叫数据源表,A、B两列分别罗列了产品型号和项目名称
表格二:需要模糊查找的数据,A列为“物料描述”,B、C列为查找后得到的产品型号和项目名称。

想达到的效果:从表二物料描述中,提取出表一罗列的产品型号和项目名称。(主要是出现的位置没有规律)


谢谢各位不吝赐教~

表二:查找后的结果

表二:查找后的结果

表一:模板表

表一:模板表

VBA 如何批量模糊匹配数据.rar

8.21 KB, 下载次数: 63

TA的精华主题

TA的得分主题

发表于 2019-6-28 11:11 | 显示全部楼层
没啥规律啊,有规律的话,正则表达式应该可以

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-6-28 11:22 | 显示全部楼层
kimmyyang 发表于 2019-6-28 11:11
没啥规律啊,有规律的话,正则表达式应该可以

唯一的规则大概就是找关键字了~
位置和分隔符都有可能不同,是有点飘忽

TA的精华主题

TA的得分主题

发表于 2019-6-28 11:26 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
smile121212 发表于 2019-6-28 11:22
唯一的规则大概就是找关键字了~
位置和分隔符都有可能不同,是有点飘忽

可是你的关键字也不是唯一,各有各的特点,即使能写出正则,那也太冗杂

TA的精华主题

TA的得分主题

发表于 2019-6-28 11:40 | 显示全部楼层
把你的项目名称和和产品型号建立一个库,简单的说做一个清单,就可以实现。
结合你物料描述和清单信息,就可以实现检索了。

TA的精华主题

TA的得分主题

发表于 2019-6-28 12:07 | 显示全部楼层
'有一处不一样,确认一下,,,

Option Explicit

Sub test()
  Dim arr, brr, i, j, k, t, p
  arr = Sheets("产品型号及项目").[a1].CurrentRegion.Resize(, 2)
  Sheets("模糊查找").Activate
  brr = [a1].CurrentRegion.Resize(, 3)
  For i = 2 To UBound(brr, 1)
    For j = 2 To UBound(arr, 1)
      p = InStr(brr(i, 1), arr(j, 1))
      If p > 0 Then Exit For
    Next
    If j = UBound(arr, 1) + 1 Then
      brr(i, 2) = vbNullString
      For j = 2 To UBound(arr, 1)
        If InStr(brr(i, 1), arr(j, 2)) Then Exit For
      Next
      If j = UBound(arr, 1) + 1 Then
        brr(i, 3) = vbNullString
      Else
        brr(i, 3) = arr(j, 2)
      End If
    Else
      brr(i, 2) = arr(j, 1)
      If InStr(brr(i, 1), arr(j, 2)) Then
        If InStr(brr(i, 1), arr(j, 2)) <> p Then
          brr(i, 3) = arr(j, 2)
        Else
          If InStr(p + 1, brr(i, 1), arr(j, 2)) Then
            brr(i, 3) = arr(j, 2)
          Else
            brr(i, 3) = vbNullString
          End If
        End If
      Else
        brr(i, 3) = vbNullString
      End If
    End If
  Next
  [e1].Resize(UBound(brr, 1), UBound(brr, 2)) = brr
End Sub

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2019-6-28 12:18 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
好像是在表二中查找表一中提供的字符串?这有啥意义?直接双循环不就行了?

从表二中提取要查找的内容,然后在表一中逐行查找这个字符串,找到了就在对应单元格输出,找不到就输出空

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-6-28 14:43 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
killq 发表于 2019-6-28 12:18
好像是在表二中查找表一中提供的字符串?这有啥意义?直接双循环不就行了?

从表二中提取要查找的内容, ...

但问题是怎么从表二提取要查的字符呢,因为“要查的字符”其实是在表一列示的,在表一的才是“要查的字符”

TA的精华主题

TA的得分主题

发表于 2019-6-28 14:57 | 显示全部楼层
smile121212 发表于 2019-6-28 14:43
但问题是怎么从表二提取要查的字符呢,因为“要查的字符”其实是在表一列示的,在表一的才是“要查的字符 ...

for str = 表2中第一个数值 to 表二中最后一个数值
for b = 表1中第一个数值 to 表1中最后一个数值
   if b 中有 str then 写上str else ""
next
next

自己去折腾吧,希望我没有理解错你的描述

TA的精华主题

TA的得分主题

发表于 2023-4-12 16:21 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
[求助] VBA 如何批量模糊匹配数据,请问,问题解决了吗?我也有同样需求,能不能分享结果,谢谢~!
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-9-27 21:30 , Processed in 0.046841 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表