ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > 我的酷贴 > 操作与技巧 > 一个值得收藏的模糊比对功能

一个值得收藏的模糊比对功能

作者:绿色风 分类: 时间:2022-08-18 浏览:162
楼主
jhyym
一、操作步骤
第一、在“原始资料之一”页面上,通过下拉列表在B2单元格选择单位,计算机自动对出现频率(D列)进行从高频率到低频率的排序。
第二、根据频率,确定该单位(B2单元格的单位)与这个列表的单位对应关系,比如说,如果与第10行的单位对上,那么,就把鼠标停在F10上,点击鼠标,使F10成为当前活动单元格,此时,B2单元格上的内容就自动复制到C10单元格上;如果都没对上,那么,就把鼠标停在F5或上面的单元格上,点击鼠标,使F5或上面的任意一个单元格成为当前活动单元格,此时,就不会把B2单元格上的内容复制到任意一个地方去了。
重复以上操作,就很方便处理这个对应关系了。

二、原理机制
第一、被核对单位放在“原始资料之一”页面上,起始位置F5F列为被核对单位列,F以后的列不限,第5行为字段名,不能为空。如果给出的单位库本身就有序号列,请从E列开始;由于排序涉及后续紧跟单位是否一起跟着走,如果担心不会跟上,请在最后列也添加序列号列,确保被核对单位信息在排序的时候正确跟上。
第二、核对单位放在“原始资料之二”页面上,起始位置F5F列为核对单位列,F以后的列不限,第5行为字段名。
第三、在“原始资料之一”页面的B2单元格上,利用Excel的数据有效性,制做一个下拉列表,把“原始资料之二”页面上单位以清单形式影射到B2单元格上,在此之前,由于数据有效性的跨页面影射需要定义一个名称,在本文中,需要定义一个yszl的名称,在名称的定义中,已经自动隐含了查找单位的行数,使得查找单位数具有可变,从而起到查找单位具有通用性,具体名称描述在下面公开。
第四、在“原始资料之一”页面上,在D列上计算B2单元格和F列单元格相同汉字出现的频率,频率的公式描述在下面公开。
第五、在“原始资料之一”页面上,为了便于查找核对单位的其它信息,我们在A2单元格上影射了查找核对单位序号,便于反查在“原始资料之二”页面上相应单位的信息。
第六、在“原始资料之一”页面上,通过B2单元格内容的改变,利用单元格选择改变响应事件,自动记忆(简称:复制。)B2单元格内容,并对B列进行从大到小的排列(简称:排序。),单元格选择改变响应事件具体描述在下面公开;在F列上,通过F列外的其它列的上下移动,查找到相应单位,并点击F列的相应行,使得上面描述的自动记忆B2单元格内容快速地粘贴在C列的相应行上,如果,查找不到响应的单位,或者说没有相应的单位,由于有上面的对B列进行从大到小的排列,只要点击F列第6行及以上的单元格,上面的在C列的相应行上的粘贴就自动取消(无论是否找到,全部简称:粘贴。),同时,上面的一系列描述是一个单元格选择响应事件,单元格选择响应事件具体描述在下面公开。本条就是这个程序想要完成的核心功能:复制、排序、粘贴,也是一个循环的动作。

三、函数(程序)公开
第一:yszl的名称:
  1. =OFFSET(原始资料之二!$E$5,1,1,COUNTA(原始资料之二!$E:$E)-1)
,该名称巧妙地利用了E列序列号不空缺的的原理,为影射“原始资料之二”页面上全部单位起到保障。

第二、D6单元格的计算公式:
  1. =ROUND((COUNT(FIND(MID($B$2,IF(LENB(MID($B$2,ROW($1:$99),1))>1,ROW($1:$99)),1),F6))*2+COUNT(FIND(MID($B$2,IF(LENB(MID($B$2,ROW($1:$99),1))=1,ROW($1:$99)),1),F6)))*2/(LENB($B$2)+LENB(F6))*100,1)
该公式利用了Excel函数中的数组功能,巧妙地解决了计算重复字节(两字节一个汉字)个数的难题,如果要比较的字节超过了100个,请改写上面公式中的99,数组公式的输入也就是上面公式中{}之间的内容,是在输入上面{}之间的内容=ROUND(COUNT(FIND(MID($B$2,IF(LENB(MID($B$2,ROW($1:$99),1))>1,ROW($1:$99)),1),F6))*2/((LEN($B$2)+LEN(F6)))*100,1)后,同时按Ctrl+Shift+Enter而自动出现{}的;

D列上,D6以下的公式是通过复制D6单元格的内容来实现了,在上面的公式中,由于有了单元格的绝对引用和相对引用,D6以下单元格的公式内容对相应引用的单元格会做出相应的调整,从而达到正确计算,正因为上面公式复制是跟着被核对单位的数量走的,从而看出被核对单位数也是可变的,同样也看出被核对单位具有通用性。

第三、序列号:
  1. =INDEX(原始资料之二!E:E,MATCH($B$2,原始资料之二!$F:$F,0))

第四、单元格选择响应事件:
  1. Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  2. If Target.Column = 6 And Target.Count = 1 And str = "1" Then
  3. If Target.Row > 5 Then
  4. Cells(Target.Row, 3) = Cells(2, 2)
  5. str = "0"
  6. Else
  7. str = "0"
  8. End If
  9. End If
  10. End Sub

单元格选择改变响应事件:
  1. Private Sub Worksheet_Change(ByVal Target As Range)
  2. Application.ScreenUpdating = False
  3. If Target.Column = 2 And Target.Row = 2 Then
  4. str = "1"
  5. Range("d5").CurrentRegion.Select
  6. Selection.Sort Key1:=Range("d5"), Order1:=xlDescending, Header:= _
  7. xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
  8. SortMethod:=xlPinYin, DataOption1:=xlSortTextAsNumbers
  9. Range("d5").Select
  10. End If
  11. Application.ScreenUpdating = True
  12. End Sub

四、使用的注意事项
第一、排序具有一个记忆功能,如果排序出现一个自小到大的逆序情况,进行一次自大到小的排序操作。
第二、如果出现一些后续资料跟不上的情况,请检查给出的单位信息里是否包含不可见符号,在Excel里,排序对包含不可见的信息会出现混乱。
附件:
模糊比对.rar
2楼
biaotiger1
是不是应该这样啊?

第一、排序具有一个记忆功能,如果排序出现一个自小到大的逆序情况,自行执行一次自大到小的排序操作。

还有,你自己不能编辑了?
3楼
曹因斯坦
这个相当强,正在试着用,很好
4楼
poiuyman5
VBA, good

免责声明

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

评论列表
sitemap