ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > E文精选 > 综合应用 > 根据简称查询全称

根据简称查询全称

作者:绿色风 分类: 时间:2022-08-17 浏览:163
楼主
嘉昆2011
声明:
函数方法参考EH mschenshan帖子 4楼
  1. http://club.excelhome.net/thread-850209-1-1.html
VBA(正则+数组)方法参考EH alzeng帖子 3楼
  1. http://club.excelhome.net/thread-599844-1-1.html
问题陈述:
在统计汇总时,由于前期数据设置不规范,缺少数据有效性设置,经常会遇到数据源不同而导致某些数据名称不同(简称中以不连续的关键字来代表全称)。

效果:

 

解决方法
1,函数法
  1. =INDEX(FullName!A$2:A$52,MODE(ISNUMBER(FIND(MID(A2,COLUMN($1:$1),1),FullName!A$2:A$52))*ROW($1:$51)))
算法及特点:适用于全称不太长,总体字符数不太多的情况(主要是受COLUMN($1:$1)参数限制);这种算法取决于全称的大小/多少:全称越少,算法越快,越精确;反之,越慢,越易误判。
Mid:对简称逐个字符提取;Find:在各全称中出现的位置逐一核对标记;Isnumber:转化为布尔值;*Row:得到全称组中出现的各频率数;Mode:找出频率最高的全称数,即匹配度最高。

2,VBA(正则+数组)
  1. Function RegExp(StrExp, RegRule)
  2.     With CreateObject("vbscript.regexp")
  3.         .Global = True
  4.         .Pattern = RegRule
  5.         RegExp = .Replace(StrExp, "*$1")
  6.     End With
  7. End Function

  8. Sub FindFullName()
  9. Dim ArrFull, ArrAbb
  10. Range("C2", [C2].End(4)(1, 2)).ClearContents
  11. ArrFull = Sheet1.Range("A2", Sheet1.[A65536].End(3)(1, 2))
  12. ArrAbb = Range("A2", [A65536].End(3))
  13. ReDim Arr(1 To UBound(ArrAbb), 1 To 2)
  14.     For i = 1 To UBound(ArrAbb)
  15.         Arr(i, 1) = RegExp(ArrAbb(i, 1), "(\S)")
  16.         For j = 1 To UBound(ArrFull)
  17.             If ArrFull(j, 1) Like Arr(i, 1) & "*" Then
  18.                 Arr(i, 1) = ArrFull(j, 1)
  19.                 Arr(i, 2) = ArrFull(j, 2)
  20.             End If
  21.         Next j
  22.     Next i
  23. [C2].Resize(i - 1, 2) = Arr
  24. End Sub
算法及特点:在每一个字符串中以每个非空字符串“\S”为一个单位"()",替换为本身加一个“*”前缀的字符"*$1";其后通过Like来匹配。

其他参考文献(字典+数组):
  1. http://www.exceltip.net/forum.php?mod=viewthread&tid=21808
附件:

简称全称匹配3.rar

2楼
云龙
好想学习,只是基础太差了
3楼
hbslj
谢谢高位大佬,你们的支持和帮助是我学习的不竭动力。
4楼
hbslj
嘉昆2011 ,您好,能够模糊匹配对我来说是太有用了。非常感谢。是不是把代码添加对下边的对话框里,点击vba中的怎么自动生成数据啊。请详细介绍一下操作过程好吗?我刚接触vba。QQ截图20121225081050.png
 
5楼
嘉昆2011
VBA正则,点击所下载附件中的按钮即可刷新得到结果(或可以将图中蓝色部分结果先清除掉,再单击按钮就看到效果了)。
6楼
hbslj
5楼的意思我清楚。谢谢您。我是想以后怎么在工作中灵活使用,比如有了vba代码,我略作修改后,怎么复制粘贴到运行框中,怎么能够自动生成,想学一下操作过程。
7楼
嘉昆2011
保存为模块

以后有用就直接加载模块,注意前期引用或是后期绑定,修改相应算法,算法有了,其他就好说了。
8楼
hbslj
老大您好,请讲的详细点好吗,我是vba刚刚接触者,提的问题可能比较幼稚,还请见谅。我的意思是,将来可能有两表,两表的分别有简称和全称,但两表各有若干的列,需要按简称和全称去匹配。因为该实例中的vba程序仅限于2列,如果两表各有多列,如何去匹配,所以还要请教您的是,将来有了vba代码,如何灵活利用的问题。非常感谢。能加你qq吗?我的qq 594753040,希望您不吝赐救。现上传新的匹配格式,请帮忙。
简称全称匹配5.zip
9楼
hbslj
愁啊,请关注。
10楼
嘉昆2011
修改相应输出数组维度即可。我们队有个Q群:50782148。开心队。
11楼
zxpzxp
函数有点深奥,看不很明白。
12楼
kuanglong126
好东西,省太多事儿啦!
13楼
dgxsdr
学习正则
14楼
fay_zha
我的问题是:如果知道全称,如何来匹配简称呢?

免责声明

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

评论列表
sitemap