ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > E问E答 > Excel VBA > 如何对两表格的数据进行相似度对比,生成对应关系表格

如何对两表格的数据进行相似度对比,生成对应关系表格

作者:绿色风 分类: 时间:2022-08-17 浏览:150
楼主
xmyjk
Q:在供需表的型号A和供给表的型号B的中进行交叉比较,自动生成供需表。匹配建立连接后列表并标明相似类型。

两列中的单元格字符对比一下,有几种情况:
1.完全相同
2.你中有我
3.我在有你
4.所包含的最长连续英文数字字符相同
5.只对比连续的英文数字字符部分,中文忽略,像空格、- 这样的字符忽略

A:
  1. Option Explicit

  2. Sub test()
  3.     Dim arr, i&, vr, mhs, j&, brr() As String, x As Long, ar(1 To 2), p, crr(1 To 2)
  4.     Dim d, drr, err
  5.     Set d = CreateObject("scripting.dictionary")
  6.     ar(1) = "需求": ar(2) = "供给"
  7.     For p = 1 To 2
  8.         Sheets(ar(p)).Select
  9.         arr = Range([A2], [a65536].End(3))
  10.         ReDim brr(1 To UBound(arr), 1 To 2) As String
  11.         Set vr = CreateObject("vbscript.regexp")
  12.         With vr
  13.             .Global = True
  14.             .Pattern = "[A-Za-z0-9]+"
  15.             For i = 1 To UBound(arr)
  16.                 Set mhs = .Execute(arr(i, 1)): brr(i, 2) = arr(i, 1)
  17.                 If mhs.Count >= 2 Then
  18.                     x = mhs(0).Length: brr(i, 1) = mhs(0).Value
  19.                     For j = 1 To mhs.Count - 1
  20.                         If mhs(j).Length > x Then brr(i, 1) = mhs(j).Value
  21.                     Next
  22.                 Else
  23.                     brr(i, 1) = mhs(0).Value
  24.                 End If
  25.             Next
  26.         End With
  27.         crr(p) = brr
  28.     Next
  29.     ReDim drr(1 To UBound(crr(1)) * UBound(crr(2)))
  30.     For i = 1 To UBound(crr(1))
  31.         For j = 1 To UBound(crr(2))
  32.             If crr(1)(i, 1) Like "*" & crr(2)(j, 1) & "*" Or crr(2)(j, 1) Like "*" & crr(1)(i, 1) & "*" Then
  33.                 d(crr(1)(i, 2) & vbTab & crr(2)(j, 2)) = 0
  34.             End If
  35.         Next
  36.     Next
  37.     ReDim drr(1 To d.Count, 1 To 2)
  38.     err = d.keys
  39.     For i = 0 To d.Count - 1
  40.         drr(i + 1, 1) = Split(err(i), vbTab)(0)
  41.         drr(i + 1, 2) = Split(err(i), vbTab)(1)
  42.     Next
  43.     Sheets("供需表").Select
  44.     Sheets("供需表").UsedRange.Offset(1).Clear
  45.     Sheets("供需表").[A2].Resize(d.Count, 2) = drr
  46. End Sub

工作簿22.rar
2楼
xyf2210
学习正则
3楼
kwenwu
1.对比条件只懂编这么两个:(arr(i, 1) Like "*" & brr(j, 1) & "*" Or brr(j, 1) Like "*" & arr(i, 1) & "*") ,不能达到要求;
2.用双数组交叉比较,效率低;
3.多次使用拷贝、插入行、粘贴,这些操作使代码运行很慢。

请哪位老师帮忙改改代码,多谢!
  1. '对比生成供需表
  2. Sub test()
  3. On Error Resume Next
  4.    
  5. Application.ScreenUpdating = False

  6. Dim arr, brr, i As Long, j As Long, k As Long, l As Long, x As Long

  7. With Sheets("供给")

  8.     l = .Range("A65536").End(xlUp).Row

  9.     brr = .Range("A1:A" & l)
  10.    
  11. End With

  12. With Sheets("供需表")

  13.     k = .Range("A65536").End(xlUp).Row

  14.     arr = .Range("A1:B" & k)
  15.    
  16. For i = k To 2 Step -1: x = 0

  17.    If arr(i, 2) = "" Then
  18.    
  19.    For j = 2 To l
  20.   
  21.    If (arr(i, 1) Like "*" & brr(j, 1) & "*" Or brr(j, 1) Like "*" & arr(i, 1) & "*") And brr(j, 1) <> "" And arr(i, 1) <> "" Then
  22.          
  23.     .Cells(i, 2).Resize(1, UBound(brr, 2)) = Application.Index(brr, j, 0)
  24.    
  25.     .Cells(i, 1).EntireRow.Copy
  26.    
  27.     .Cells(i, 1).EntireRow.Insert Shift:=xlDown: x = 1
  28.         
  29.    End If

  30.    Next
  31.    
  32.    End If
  33.    
  34.    If x = 1 Then .Cells(i, 1).EntireRow.Delete
  35.    
  36. Next
  37.    
  38.    
  39. End With

  40. Application.ScreenUpdating = True


  41. End Sub


工作簿222.zip
4楼
老糊涂
学习

免责声明

有感于原ExcelTip.Net留存知识的价值及部分知识具有的时间限定性因素, 经与ExcelTip.Net站长Apolloh商议并征得其同意, 现将原属ExcelTip.Net的知识帖采集资料于本站点进行展示, 供有需要的人士查询使用,也慰缅曾经的论坛时代。 所示各个帖子的原作者如对版权有异议, 可与本人沟通提出,或于本站点留言,我们会尽快处理。 在此,感谢ExcelTip.Net站长Apolloh的支持,感谢本站点所有人**绿色风(QQ:79664738)**的支持与奉献,特此鸣谢!
------本人网名**KevinChengCW(QQ:1210618015)**原ExcelTip.Net总版主之一

评论列表
sitemap