Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 1868|回复: 9

相似匹配查找和完全匹配找查的问题

[复制链接]
发表于 2017-6-21 14:48 | 显示全部楼层 |阅读模式
本帖最后由 zhxj1983 于 2017-8-19 09:59 编辑

目前厂生产的产品,有些是特殊订制的,一般特殊定制的我们会用原有相似的材料来进行加工使用,规格这里,我们都是以150*190  120*190这样来体现的,现在要麻烦老师帮忙处理的就是这种特殊的怎么在常规里面找出相近的规格来进行加工,而不用自己一个一个去看,具体看下附件

book1.rar

7.86 KB, 下载次数: 6

 楼主| 发表于 2017-6-21 15:21 | 显示全部楼层
有没有老师知道的,帮忙看一下怎么设置
回复

使用道具 举报

发表于 2017-6-21 16:31 | 显示全部楼层
  1. Sub grf()
  2.     Set dmn = CreateObject("scripting.dictionary")
  3.     Set dmx = CreateObject("scripting.dictionary")
  4.     brr = Range("q2:q" & [q65536].End(3).Row)   '标准
  5.     For i = 1 To UBound(brr)
  6.         x = brr(i, 1)
  7.         dmn(x) = Val(x)
  8.         dmx(x) = Val(Split(x, "*")(1))
  9.     Next
  10.     arr = Range("a2:a" & [a65536].End(3).Row)
  11.     For i = 1 To UBound(arr)
  12.         y = arr(i, 1)
  13.         If Not dmn.exists(y) Then
  14.             ymn = Val(y)
  15.             ymx = Val(Split(y, "*")(1))
  16.             Delta = ymx
  17.             For Each x In dmn.keys
  18.                 s = Abs(ymn - dmn(x)) + Abs(ymx - dmx(x))
  19.                 If s < Delta Then Delta = s: arr(i, 1) = x
  20.             Next
  21.         End If
  22.     Next
  23.     [b2].Resize(UBound(arr)) = arr
  24. End Sub
复制代码

book1.rar

15.28 KB, 下载次数: 9

回复

使用道具 举报

 楼主| 发表于 2017-6-21 19:20 | 显示全部楼层

用宏做可以哦,老师,如果是像这种150*(95+95)规格的也能找出来吗?比如我标准规格有150*(95+95)的,然后我定制的有147*(93+93)这样的,能自动找出找相近这个150*(95+95)的吗?
回复

使用道具 举报

发表于 2017-6-21 21:36 | 显示全部楼层
可以用正则找出每行的所有数字,然后比较,找出最小差异者。
回复

使用道具 举报

 楼主| 发表于 2017-6-21 23:22 | 显示全部楼层
grf1973 发表于 2017-6-21 21:36
可以用正则找出每行的所有数字,然后比较,找出最小差异者。

老师你能不能在刚才的那个附件中修改一下,重新再传附件给我,先谢谢了,我对宏不太懂,不知道怎么改
回复

使用道具 举报

发表于 2017-6-22 10:05 | 显示全部楼层
  1. Sub grf()
  2.     Set d = CreateObject("scripting.dictionary")
  3.     Set d1 = CreateObject("scripting.dictionary")
  4.     brr = Range("q2:q" & [q65536].End(3).Row)   '标准
  5.     With CreateObject("vbscript.regexp")
  6.         .Global = True
  7.         .Pattern = "\d+"
  8.         For i = 1 To UBound(brr)   '把标准里的所有数字提取出来,组成",500,95,95"类型的字符串,以便比较
  9.             x = brr(i, 1)
  10.             Set ma = .Execute(x)
  11.             For Each m In ma
  12.                 d(x) = d(x) & "," & m   '数字连成字符串
  13.                 d1(x) = d1(x) + 1   '由几个数值组成
  14.             Next
  15.         Next
  16.         arr = Range("a2:a" & [a65536].End(3).Row)
  17.         For i = 1 To UBound(arr)
  18.             y = arr(i, 1)
  19.             If Not d.exists(y) Then
  20.                 xstr = ""
  21.                 Set ma = .Execute(y)
  22.                 For Each m In ma
  23.                     xstr = xstr & "," & m   '数字连成字符串
  24.                 Next
  25.                 yrr = Split(xstr, ",")   '待比较的数
  26.                 n = UBound(yrr)
  27.                
  28.                 Delta = 1000
  29.                 For Each x In d.keys
  30.                     If n = d1(x) Then    '有相同个数值的作比较
  31.                         xrr = Split(d(x), ",")   '标准
  32.                         s = 0
  33.                         For k = 1 To n
  34.                             s = s + Abs(Val(xrr(k)) - Val(yrr(k)))  '比较核心:标准各数和待比较数对应位置相减的绝对值相加最小
  35.                             If s < Delta Then Delta = s: arr(i, 1) = x
  36.                         Next
  37.                     End If
  38.                 Next
  39.             End If
  40.         Next
  41.     End With
  42.     [b2].Resize(UBound(arr)) = arr
  43. End Sub
复制代码

book1.rar

16.22 KB, 下载次数: 4

回复

使用道具 举报

 楼主| 发表于 2017-6-23 16:45 | 显示全部楼层

老师,是不是代码有错了,我发现两个错误的地方,第一个是120*198,为什么选择的是120*190,而不是选择120*200??正常应该是要选120*200的,只有大的规格才能切成小的规格。还有这个150*(92+92),为什么它选的不是150*(95+93)这个比较接近的规格呢??

QQ截图20170623164448.png
回复

使用道具 举报

 楼主| 发表于 2017-6-24 19:11 | 显示全部楼层

老师,我说的问题麻烦您看一下
回复

使用道具 举报

发表于 2017-6-26 09:30 | 显示全部楼层
按新要求小改了一下,应该没问题了。
  1. Sub grf()
  2.     Set d = CreateObject("scripting.dictionary")
  3.     Set d1 = CreateObject("scripting.dictionary")
  4.     brr = Range("q2:q" & [q65536].End(3).Row)   '标准
  5.     With CreateObject("vbscript.regexp")
  6.         .Global = True
  7.         .Pattern = "\d+"
  8.         For i = 1 To UBound(brr)   '把标准里的所有数字提取出来,组成",500,95,95"类型的字符串,以便比较
  9.             x = brr(i, 1)
  10.             Set ma = .Execute(x)
  11.             For Each m In ma
  12.                 d(x) = d(x) & "," & m   '数字连成字符串
  13.                 d1(x) = d1(x) + 1   '由几个数值组成
  14.             Next
  15.         Next
  16.         arr = Range("a2:a" & [a65536].End(3).Row)
  17.         For i = 1 To UBound(arr)
  18.             y = arr(i, 1)
  19.             If Not d.exists(y) Then
  20.                 xstr = ""
  21.                 Set ma = .Execute(y)
  22.                 For Each m In ma
  23.                     xstr = xstr & "," & m   '数字连成字符串
  24.                 Next
  25.                 yrr = Split(xstr, ",")   '待比较的数
  26.                 n = UBound(yrr)
  27.                
  28.                 Delta = 1000
  29.                 For Each x In d.keys
  30.                     If n = d1(x) Then    '有相同个数值的作比较
  31.                         xrr = Split(d(x), ",")   '标准
  32.                         s = 0
  33.                         For k = 1 To n
  34.                             If Val(xrr(k)) - Val(yrr(k)) < 0 Then Exit For '标准规格各项必须大于待比较的产品规格
  35.                             s = s + Abs(Val(xrr(k)) - Val(yrr(k)))  '比较核心:标准各数和待比较数对应位置相减的绝对值相加最小
  36.                         Next
  37.                         If s < Delta And k = n + 1 Then Delta = s: arr(i, 1) = x
  38.                     End If
  39.                 Next
  40.             End If
  41.         Next
  42.     End With
  43.     [b2].Resize(UBound(arr)) = arr
  44. End Sub
复制代码

book1.rar

17.8 KB, 下载次数: 4

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-4-20 15:18 , Processed in 0.415127 second(s), 11 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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