Excel精英培训网

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

[已解决]怎么实现中文配对?

[复制链接]
发表于 2017-11-7 10:54 | 显示全部楼层 |阅读模式
本帖最后由 On_fire 于 2017-11-7 17:32 编辑

怎么实现中文配对?

1.      Data页, 格内数据是中文及英文或字符组合

2.      Match页 (代码执行说明), 代码将所有中文字有重复的, 都找出来(当配对上,已经用颜色标注)!
(代码_条件首2个, 3个, 4个,5个或6个中文字, 需求完全配对)

3.      ARR页, 模拟结果, 配对后, 排成一行 (注:不用顺序)





数据n多, 请大神, 老师帮帮忙...谢谢!!!

最佳答案
2017-11-8 09:08
  1. Sub 匹配()
  2.     arr = Sheets(1).UsedRange
  3.     brr = Sheets(2).UsedRange
  4.     Set d = CreateObject("scripting.dictionary")
  5.     With CreateObject("vbscript.regexp")
  6.         .Global = True
  7.         .Pattern = "[^\u4e00-\u9fa5]"
  8.         For Each x In arr
  9.             If Len(x) > 0 Then
  10.                 y = .Replace(x, "")
  11.                 d(y) = ""
  12.             End If
  13.         Next
  14.         
  15.         For Each x In brr
  16.             If Len(x) > 0 Then
  17.                 y = .Replace(x, "")
  18.                 If d.exists(y) Then d(y) = d(y) & "|" & x
  19.             End If
  20.         Next
  21.     End With
  22.    
  23.     With Sheets(3)
  24.         r = 10
  25.         .Cells(r, 1).Resize(100, 100).Clear
  26.         For Each y In d.keys
  27.             If InStr(d(y), "|") Then
  28.                 yrr = Split(Mid(d(y), 2), "|")
  29.                 r = r + 1
  30.                 .Cells(r, 1).Resize(1, UBound(yrr) + 1) = yrr
  31.             End If
  32.         Next
  33.     End With
  34. End Sub
复制代码

Match.zip

8.32 KB, 下载次数: 7

excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
 楼主| 发表于 2017-11-7 12:13 | 显示全部楼层
另外, 还有一个情况,
Match, 如果格内内容, 是完全一样,
ARR, 模拟结是两个
比如: 截图, C4C8是一样的
ARR, 模拟结, 显示两个

CASE1.jpg
CASE1.1.jpg
回复

使用道具 举报

 楼主| 发表于 2017-11-7 14:20 | 显示全部楼层
On_fire 发表于 2017-11-7 12:13
另外, 还有一个情况,  Match页, 如果格内内容, 是完全一样, ARR页, 模拟结果是两个 比如: 截图中, C4及C8是 ...

刚发现另一个情况,

Data页可能有其它数据, 除了中文字符开始的, 其它都不用处理

CASE2.jpg
回复

使用道具 举报

发表于 2017-11-8 09:08 | 显示全部楼层    本楼为最佳答案   
  1. Sub 匹配()
  2.     arr = Sheets(1).UsedRange
  3.     brr = Sheets(2).UsedRange
  4.     Set d = CreateObject("scripting.dictionary")
  5.     With CreateObject("vbscript.regexp")
  6.         .Global = True
  7.         .Pattern = "[^\u4e00-\u9fa5]"
  8.         For Each x In arr
  9.             If Len(x) > 0 Then
  10.                 y = .Replace(x, "")
  11.                 d(y) = ""
  12.             End If
  13.         Next
  14.         
  15.         For Each x In brr
  16.             If Len(x) > 0 Then
  17.                 y = .Replace(x, "")
  18.                 If d.exists(y) Then d(y) = d(y) & "|" & x
  19.             End If
  20.         Next
  21.     End With
  22.    
  23.     With Sheets(3)
  24.         r = 10
  25.         .Cells(r, 1).Resize(100, 100).Clear
  26.         For Each y In d.keys
  27.             If InStr(d(y), "|") Then
  28.                 yrr = Split(Mid(d(y), 2), "|")
  29.                 r = r + 1
  30.                 .Cells(r, 1).Resize(1, UBound(yrr) + 1) = yrr
  31.             End If
  32.         Next
  33.     End With
  34. End Sub
复制代码

Match.rar

23.88 KB, 下载次数: 6

回复

使用道具 举报

 楼主| 发表于 2017-11-8 10:20 | 显示全部楼层

谢谢老师帮忙完美输出结果!
但是, 刚发现如果Match页没有资料, ARR页会变空白?
如果Data页没有数据,   执行码会报错?

Match, 本来只是表达执行代码的思路, 不存在的, 请问要怎么完善?

回复

使用道具 举报

发表于 2017-11-8 11:03 | 显示全部楼层
第3句 brr = Sheets(2).UsedRange 就是针对match页的。
把 Sheets(2).UsedRange 改成相应的比对区域就行。
回复

使用道具 举报

发表于 2017-12-1 12:21 | 显示全部楼层
Sub 测试() '雄鹰2017.12.1
Dim arr, brr(1 To 1000, 1 To 1), m, crr(1 To 1000, 1 To 100)
Set d = CreateObject("scripting.dictionary")
Set regex = CreateObject("vbscript.regexp")
arr = Sheet1.UsedRange
For i = 1 To UBound(arr)
     For j = 1 To UBound(arr, 2)
         If arr(i, j) <> "" Then
            n = n + 1
            brr(n, 1) = arr(i, j)
         End If
     Next j
Next i
With regex
      .Pattern = "(^[一-隝]+).*"
      .Global = True
      For i = 1 To n
          m = .Execute(brr(i, 1))(0).SubMatches(0)
          d(m) = d(m) & "," & i
      Next i
End With
For Each k In d.keys
     h = h + 1
     ar = Split(d(k), ",")
     For i = 1 To UBound(ar)
         l = l + 1
         crr(h, l) = brr(ar(i), 1)
     Next i
     lm = Application.Max(lm, l)
     l = 0
Next k
Sheet3.[a27].Resize(h, lm) = crr
End Sub
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-27 02:30 , Processed in 0.267402 second(s), 9 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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