ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 多关键字找最佳匹配

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-4-25 21:06 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
还有这个:
字符串的相似度计算
http://club.excelhome.net/thread-901666-1-1.html

TA的精华主题

TA的得分主题

发表于 2015-4-25 22:23 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
总是不那么尽人意。
  1. Sub Test()
  2.     Dim Reg As Object, arr, brr, i&, j&, Pat$, Pat2$, k%
  3.    
  4.     Set Reg = CreateObject("VBScript.RegExp")
  5.     arr = Sheets("计划").[a4].CurrentRegion
  6.     brr = Sheets("物料").[a1].CurrentRegion
  7.     Reg.Global = True
  8.     With Sheets("结果")
  9.         For i = 2 To UBound(arr)
  10.             .Cells(i + k, 1) = i - 1
  11.             .Cells(i + k, 2) = Join(Array(arr(i, 1), arr(i, 2), arr(i, 3), arr(i, 4), arr(i, 7)), "/")
  12.             Pat = arr(i, 2) & "/" & Left(arr(i, 3), 1) & ".*/" & arr(i, 4) & ".*"
  13.             Pat2 = arr(i, 2) & arr(i, 1) & ".*?" & arr(i, 3) & "$"
  14.             Reg.Pattern = Pat & "|" & Pat2
  15.             For j = 2 To UBound(brr)
  16.                 If Reg.Test(brr(j, 2)) Then
  17.                     k = k + 1
  18.                     .Cells(i + k, 2) = brr(j, 1)
  19.                     .Cells(i + k, 3) = brr(j, 2)
  20.                     .Cells(i + k, 4) = brr(j, 3)
  21.                 End If
  22.             Next
  23.         Next
  24.     End With
  25. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2015-4-25 22:58 | 显示全部楼层
aman1516 发表于 2015-4-25 20:35
谢谢,已通过筛选出部分数据,只是在“模糊”处理方面未能尽可能达到更精准的结果。
关键字是:    brr( ...

测试后,请指出错误之处。

TA的精华主题

TA的得分主题

发表于 2015-4-25 22:59 | 显示全部楼层
  1. Sub Test()
  2.     Dim Reg As Object, arr, brr, br$, i&, j&, Pat$, Pat2$, k%
  3.     Set Reg = CreateObject("VBScript.RegExp")
  4.     arr = Sheets("计划").[a4].CurrentRegion
  5.     brr = Sheets("物料").[a1].CurrentRegion
  6.     Reg.Global = True
  7.     With Sheets("结果")
  8.         For i = 2 To UBound(arr)
  9.             .Cells(i + k, 1) = i - 1
  10.             .Cells(i + k, 2) = Join(Array(arr(i, 1), arr(i, 2), arr(i, 3), arr(i, 4), arr(i, 7)), "/")
  11.             Pat = arr(i, 2) & "/" & Left(arr(i, 3), 1) & ".*/" & arr(i, 4) & ".*"
  12.             Pat2 = arr(i, 2) & arr(i, 1) & ".*?" & arr(i, 3) & "$"
  13.             Reg.Pattern = Pat & "|" & Pat2
  14.             For j = 2 To UBound(brr)
  15.                 '下面两句修改过
  16.                 br = Left(brr(j, 2), 1)
  17.                 If Reg.Test(brr(j, 2)) Or Reg.Test(Replace(brr(j, 2), br, br & "/")) Then
  18.                     k = k + 1
  19.                     .Cells(i + k, 2) = brr(j, 1)
  20.                     .Cells(i + k, 3) = brr(j, 2)
  21.                     .Cells(i + k, 4) = brr(j, 3)
  22.                 End If
  23.             Next
  24.         Next
  25.     End With
  26. End Sub

复制代码

汇总分割.rar

8.07 KB, 下载次数: 48

TA的精华主题

TA的得分主题

发表于 2015-4-25 22:59 | 显示全部楼层
多关键字找最佳匹配2.zip (127.73 KB, 下载次数: 59)

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-4-26 00:06 | 显示全部楼层
marchwen01 发表于 2015-4-25 22:59

谢谢关注……全面测试一下

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-4-26 00:34 | 显示全部楼层
hlly888 发表于 2015-4-25 22:59

代码修改了吗:
Sub yy() 'hlly888
Range("a2:d65536").ClearContents
Application.ScreenUpdating = False
Range("a1:d65536").ClearFormats
Dim dc As Object, arr, brr(), i&, s&, j%, k%, n%
Set dc = CreateObject("scripting.dictionary")
x = Sheets("物料").Cells(Rows.Count, 1).End(xlUp).Row
arr = Sheets("物料").Range("a2:c" & x)
x2 = Sheets("计划").Cells(Rows.Count, 1).End(xlUp).Row
yrr = Sheets("计划").Range("a5:d" & x2)
ReDim brr(1 To UBound(arr), 1 To 4)

For j = 1 To UBound(yrr)
    s = s + 1
    brr(s, 1) = j
    brr(s, 2) = yrr(j, 1) & "/" & yrr(j, 2) & "/" & yrr(j, 3) & "/" & yrr(j, 4)
    Rows(s + 1).Font.Bold = True
    'Rows(s + 1).Interior.ColorIndex = 19 ' 35
    For i = 1 To UBound(arr)
        For k = 1 To 4
            If InStr(arr(i, 3), yrr(j, k)) > 0 Then
               n = n + 1
            End If
        Next
        If n = 4 Then
           s = s + 1
        brr(s, 2) = arr(i, 1)
        brr(s, 3) = arr(i, 2)
        brr(s, 4) = arr(i, 3)
        Rows(s + 1).Font.Size = 10
        End If
        n = 0
    Next
Next

[a2].Resize(UBound(arr), 4) = brr
Application.ScreenUpdating = True
End Sub

还是都不尽人意

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-4-26 00:45 | 显示全部楼层
我觉得我在9楼的思路是对的,一步一步筛选,只是好像有点复杂。
“颜色”、“其它配置说明”项可以先整个关键词匹配,若无匹配时,再拆分单个字符匹配。
明天再好好想想.....

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-4-26 00:55 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
用 like 是否比 instr 更好些呢?

TA的精华主题

TA的得分主题

发表于 2015-4-26 11:24 | 显示全部楼层
必须明确以下几个问题,否则没有人能给出楼主希望的答案:
1.各项查找关键字,在实际原始数据中的变形情况. 楼主只给出了"型号"的各种变形;
2.各项关键字在原始数据中从左至右出现的总体顺序,是否都一样?
3.假如前四项都符合,不论"其它配置"有无都列出,还是只要该项存在,其它的就不再列出结果?
4.前四项同时出现是必须的吗?最佳匹配的具体含义是什么?
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-22 04:22 , Processed in 0.030541 second(s), 6 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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