ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: shanchuan

[讨论] 字符相似度比较的问题--经典模式

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2010-7-26 23:45 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
原帖由 wangjguo44 于 2010-7-23 13:57 发表
增加一个相同名称含相同字符80%以上的标志。(本行与上行或本行与下行80%相同以上为1,虽上行与本行有80%相同,但本行与上行没有到80%也不标,本行与下行也如此,如51行)(公式4已做去不可见字符处理)


理论上能做去掉标点符号的处理吗?比如“:” “;” “。”“,”
不可见字符是换行符,删掉换行符的简单方法:查找替换:查找输入 按Alt+小键盘10>>>替换内容,选中后什么都不填>>>全部替换.

[ 本帖最后由 shanchuan 于 2010-8-8 23:48 编辑 ]

TA的精华主题

TA的得分主题

发表于 2010-7-27 08:00 | 显示全部楼层
去掉标点不难,用正则即可实现。

TA的精华主题

TA的得分主题

 楼主| 发表于 2010-7-27 08:31 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

TA的精华主题

TA的得分主题

 楼主| 发表于 2010-7-27 21:56 | 显示全部楼层

VB中字符串匹配的多种方式 转帖

VB中字符串匹配的多种方式 收藏
   这段时间在移植项目的过程中,起初我想判断一个字符串中是否存在某字符(串),直接的使用方法是用instr(start,string1,string2,VB compare),但经过分析在VB中可以只用一下方法来判断!

   1.常用的INStr方法

   view plaincopy to clipboardprint?
Function InStr([Start], [String1], [String2], [Compare As VbCompareMethod = vbBinaryCompare])   
   VBA.Strings 的成员   
   返回在另一字符串中第一次出现某一字符串的位置  
Function InStr([Start], [String1], [String2], [Compare As VbCompareMethod = vbBinaryCompare])
    VBA.Strings 的成员
    返回在另一字符串中第一次出现某一字符串的位置


   判断string1中从start开始的位置第一次出现string2的位置

  

2.使用正则表达式

   在VB中需要引入Library VBScript_RegExp_55
   位置在C:\WINDOWS\System32\vbscript.dll\3
    Microsoft VBScript Regular Expressions 5.5

   当然,你可以直接在项目中引用,使用方法如下:

+ expand sourceview plaincopy to clipboardprint?
Dim ResultString As String  
Dim myRegExp As RegExp   
Dim resultCollection As MatchCollection   
Const pattern As String = "^\s*Dim\s+([\w|,|\s]+)(?:\s+As\s+Recordset)"  
  
Public Function executes(SubjectString As String, result As MatchCollection)   
Set myRegExp = New RegExp   
myRegExp.MultiLine = True  
myRegExp.Global = True  
myRegExp.pattern = pattern   
Set result = myRegExp.Execute(Trim(SubjectString))   
End Function  
Dim ResultString As String
Dim myRegExp As RegExp
Dim resultCollection As MatchCollection
Const pattern As String = "^\s*Dim\s+([\w|,|\s]+)(?:\s+As\s+Recordset)"

Public Function executes(SubjectString As String, result As MatchCollection)
Set myRegExp = New RegExp
myRegExp.MultiLine = True
myRegExp.Global = True
myRegExp.pattern = pattern
Set result = myRegExp.Execute(Trim(SubjectString))
End Function



  

3.第三种是比较特别的方法,是采用if string like [parttern],即string需要满足parttern中的模式,才会返回true,其具体定义如下:

语法   
   
  result   =   string   Like   pattern   
   
  Like   运算符的语法具有以下几个部分:   
   
  部分   描述     
  result   必需的;任何数值变量。     
  string   必需的;任何字符串表达式。     
  pattern   必需的;任何字符串表达式,遵循“说明”中的模式匹配约定。     
   
   
  说明   
   
  如果   string   与   pattern   匹配,则   result   为   True;如果不匹配,则   result   为   False。但是如果   string   或   pattern   中有一个为   Null,则   result   为   Null。   
   
  Like   运算符的特性随着   Option   Compare   语句而不同。每个模块的缺省字符串比较方法是   Option   Compare   Binary。   
   
  在字符串比较中,Option   Compare   Binary   的结果是根据字符的内部二进制表示法导出的排序顺序得到的。在   Microsoft   Windows   中,排序顺序由代码页决定。下例说明通常二进制的排序顺序:   
   
  A   <   B   <   E   <   Z   <   a   <   b   <   e   <   z   <   _   <   _   <   _   <   _   <   _   <   ?/FONT>   
   
  在字符串比较中,Option   Compare   Text   的结果是字符串比较,它建立在不区分大小写的文本排序顺序基础上,而这一排序顺序是由系统的国别确定的。在对相同的字符使用   Option   Compare   Text   时会产生以下文本排序顺序:   
   
  (A=a)   <   (_=_)   <   (B=b)   <   (E=e)   <   (_=_)   <   (Z=z)   <   (_=_)     
   
  内建的模式匹配功能提供了多种工具来进行字符串比较。有了模式匹配功能就可以使用通配符、字符串列表或字符区间的任何组合来匹配字符串。下列表格指出   pattern   中允许的字符以及它们与什么进行匹配:   
   
  pattern   中的字符   符合   string   中的     
  ?   任何单一字符。     
  *   零个或多个字符。     
  #   任何一个数字   (0–9)。     
  [charlist]   charlist.中的任何单一字符。     
  [!charlist]   不在   charlist   中的任何单一字符。     
   
   
  在中括号   ([   ])   中,可以用由一个或多个字符   (charlist)   组成的组与   string   中的任一字符进行匹配,这个组几乎包括任何一个字符代码以及数字。   
   
  注意   为了与左括号   ([)、问号   (?)、数字符号   (#)   和星号   (*)   等特殊字符进行匹配,可以将它们用方括号括起来。不能在一个组内使用右括号   (])   与自身匹配,但在组外可以作为个别字符使用。   
   
  通过在范围的上、下限之间用连字符   (–),charlist   可以指定字符的范围。例如,如果   string   中相应字符的位置包括   A–Z   之间的任意大写字母,则   [A-Z]   得到一个匹配。不需要分界符,方括号内就可以包括多个范围。   
   
  指定范围的意义取决于运行时的有效字符排序(正如   Option   Compare   和系统的国别设置所确定的,代码在运行之中)。使用   Option   Compare   Binary   示例可以看到,范围   [A–E]   与   A、B   和   E   相匹配。通过   Option   Compare   Text   可以看到,[A–E]   与   A,   a,   _,   _,   B,   b,   E,   e   相匹配。此范围与   _   或   _   不匹配,因为按照排序顺序,重音字符在非重音字符之后。   
   
  下面列举的是模式匹配的其它重要规则:     
   
  charlist   开头的惊叹号   (!)   意味着,如果在   string   中找到任何不属于   charlist   的字符,则存在一个匹配。如果在方括号之外使用惊叹号,则惊叹号与自身匹配。   
   
   
  连字符   (–)   可以出现在   charlist   的开头(如果使用惊叹号,则在惊叹号之后),也可以出现在   charlist   的结尾与自身匹配。在任何其它地方,连字符用来识别字符的范围。   
   
   
  当指定了字符范围时,这些字符必须按照升序(从最小到最大)顺序来显示。[A-Z]   是有效模式,但   [Z-A]   不是。   
   
   
  字符序列   []   被看作是长度为零的字符串   ("")。     
  某些语言的字母表中有一些特殊字符,它们表示两个分开的字符。例如,在一些语言中,当字符   "a"   与   "e"   同时出现时,用   "_"   来表示字符   "a"   与   "e"。Like   运算符可以辨认出单一的特殊字符和两个个别字符是否相等。   
   
  当一个语言使用了一个特殊字符,而且这个字符在系统地区设置中已被指定的时候,在   pattern   或   string   中出现的单一特殊字符将与其他字符串中等价的两个字符相匹配。与此相似,由方括号括起来的   pattern   中的单一特殊字符(字符本身在列表或范围内)将与   string   中等价的两个字符序列匹配。


示例:Dim   MyCheck   
  MyCheck   =   "aBBBa"   Like   "a*a"       '   返回   True。   
  MyCheck   =   "F"   Like   "[A-Z]"       '   返回   True。   
  MyCheck   =   "F"   Like   "[!A-Z]"       '   返回   False。   
  MyCheck   =   "a2a"   Like   "a#a"       '   返回   True。   
  MyCheck   =   "aM5b"   Like   "a[L-P]#[!c-e]"       '   返回   True。   
  MyCheck   =   "BAT123khg"   Like   "B?T*"       '   返回   True。   
  MyCheck   =   "CAT123khg"   Like   "B?T*"       '   返回   False。   

  

以上就是常用的匹配方法,大家根据需要采用不同的方法进行匹配,但我推荐使用if 。。。like 。。。的方式,这种方法既准确有快速!


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zjhiphop2006/archive/2010/05/21/5613043.aspx

自定义一个具有Like运算符功能的工作表函数2009-4-14 8:34:17 来源: 转载 作者:不详 
核心提示:无...我们知道VBA中的Like运算符是用来比较两个字符串的,其语法为:
    result = string Like pattern
    如果string与pattern匹配,则result为True,如果不匹配,则result为False。Like运算符的比较方式比较灵活,除了可以使用通配符外,pattern中还可以使用中括号“[ ]”。在中括号“[ ]”中,可以用由一个或多个字符组成的组与 string 中的任一字符进行匹配。虽然用COUNTIF工作表函数可以实现类似的比较功能,但COUNTIF函数不支持中括号。为此,我们可以创建一个自定义函数来实现类似Like运算符的功能,使用起来非常方便。方法如下:
    按Alt+F11,打开VBA编辑器,单击菜单“插入→模块”,将下列代码输入到代码窗口中:
    Public Function IsLike(sText As String, _
                       sPattern As String) As Boolean
      IsLike = IIf(sText Like sPattern, True, False)
    End Function
本文来自办公软件学习网,原文地址:http://www.officestudy.cn

[ 本帖最后由 shanchuan 于 2010-7-27 22:45 编辑 ]

TA的精华主题

TA的得分主题

 楼主| 发表于 2010-7-28 00:10 | 显示全部楼层
四:2010年7月28日,利用COUNTIF()按分类标记字符特征,然后用CONCATENATE()合并A列B列同行单元格字符,统计每个分类的重复项(》=3标记为重复),附件已做完第一个分类硬度的。但是这个方法太繁琐,几个分类就得操作*几次,请高手简化。

TA的精华主题

TA的得分主题

发表于 2010-7-28 14:53 | 显示全部楼层
附件解决排除标点符号后的相同字符数比较(标点符号保留与小数点同形的半角句号)

[ 本帖最后由 wangjguo44 于 2010-7-28 14:56 编辑 ]

单元格重复字符数.rar

35.77 KB, 下载次数: 165

TA的精华主题

TA的得分主题

 楼主| 发表于 2010-7-28 22:56 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
合并简化Y-AG列        =IF((AND(R2<>0,COUNTIF($X$2:$X$55,$X2)>=3)),1,)+IF((AND(O2<>0,COUNTIF($X$2:$X$55,$X2)>=3)),1,)+IF((AND(P2<>0,COUNTIF($X$2:$X$55,$X2)>=3)),1,)+IF((AND(Q2<>0,COUNTIF($X$2:$X$55,$X2)>=3)),1,)+IF((AND(T2<>0,COUNTIF($X$2:$X$55,$X2)>=3)),1,)+IF((AND(U2<>0,COUNTIF($X$2:$X$55,$X2)>=3)),1,)+IF((AND(V2<>0,COUNTIF($X$2:$X$55,$X2)>=3)),1,)+IF((AND(W2<>0,COUNTIF($X$2:$X$55,$X2)>=3)),1,)       
简化AH列
=IF((AND(OR(O2<>0,P2<>0,Q2<>0,R2<>0,S2<>0,T2<>0,U2<>0,V2<>0,W2<>0),COUNTIF($X$2:$X$55,$X2)>=3)),1,)

TA的精华主题

TA的得分主题

 楼主| 发表于 2010-7-29 20:29 | 显示全部楼层

求助

如何用函数公式将附件Y列到AG列中标有“重复”的行 复制到sheet1中?
或者将 AH列标有 1的行  复制到sheet1中?

TA的精华主题

TA的得分主题

 楼主| 发表于 2010-7-30 11:15 | 显示全部楼层

公式简化与等效公式 整理后

如何简化下面的公式 ?
第一题:
=IF(OR(AND(COUNTIFS(AG:AG,AG2,K:K,"=1")>2,K2=1),AND(COUNTIFS(AG:AG,AG2,L:L,"=1")>2,L2=1),AND(COUNTIFS(AG:AG,AG2,M:M,"=1")>2,M2=1),AND(COUNTIFS(AG:AG,AG2,N:N,"=1")>2,N2=1),,AND(COUNTIFS(AG:AG,AG2,O:O,"=1")>2,O2=1),,AND(COUNTIFS(AG:AG,AG2,P:P,"=1")>2,P2=1),,AND(COUNTIFS(AG:AG,AG2,Q:Q,"=1")>2,Q2=1),,AND(COUNTIFS(AG:AG,AG2,R:R,"=1")>2,R2=1)),1,0)


第二题:
=IF(OR(AND(COUNTIFS(AG:AG,AG2,K:K,"=1")>2,K2=1),AND(COUNTIFS(AG:AG,AG2,L:L,"=1")>2,L2=1),AND(COUNTIFS(AG:AG,AG2,M:M,"=1")>2,M2=1),AND(COUNTIFS(AG:AG,AG2,N:N,"=1")>2,N2=1),AND(COUNTIFS(AG:AG,AG2,O:O,"=1")>2,O2=1),AND(COUNTIFS(AG:AG,AG2,P:P,"=1")>2,P2=1),AND(COUNTIFS(AG:AG,AG2,Q:Q,"=1")>2,Q2=1),AND(COUNTIFS(AG:AG,AG2,R:R,"=1")>2,R2=1),AND(COUNTIFS(AG:AG,AG2,S:S,"=1")>2,S2=1),AND(COUNTIFS(AG:AG,AG2,T:T,"=1")>2,T2=1),AND(COUNTIFS(AG:AG,AG2,U:U,"=1")>2,U2=1),AND(COUNTIFS(AG:AG,AG2,V:V,"=1")>2,V2=1),AND(COUNTIFS(AG:AG,AG2,W:W,"=1")>2,W2=1),AND(COUNTIFS(AG:AG,AG2,X:X,"=1")>2,X2=1),AND(COUNTIFS(AG:AG,AG2,Y:Y,"=1")>2,Y2=1),AND(COUNTIFS(AG:AG,AG2,Z:Z,"=1")>2,Z2=1),AND(COUNTIFS(AG:AG,AG2,AA:AA,"=1")>2,AA2=1),AND(COUNTIFS(AG:AG,AG2,AB:AB,"=1")>2,AB2=1),AND(COUNTIFS(AG:AG,AG2,AC:AC,"=1")>2,AC2=1)),1,0)
效果等同于
{=1*(SUM(N(IF(MMULT(K2:AC2*$K$2:$AC$656,ROW($1:$19)^0)>0,$AG$2:$AG$656)=AG2))>2)}

第三题:
=IF((AND(OR(K2=1,L2=1,M2=1,N2=1,O2=1,P2=1,Q2=1,R2=1,S2=1,T2=1,U2=1,V2=1,W2=1,X2=1,Y2=1,Z2=1,AA2=1,AB2=1,AE2=1),COUNTIF(AG:AG,AG2)>=3)),1,)
等于=(MAX(K2:AE2)>0)*(COUNTIF($AG$2:$AG$646,AG2)>2)
等于{=IF((AND(OR(K2:AE2<>0),COUNTIF(AG:AG,AG2)>=3)),1,)}
等于=SUMPRODUCT(OR(K2:AE2=1)*(IF(COUNTIF(AG:AG,AG2)>2,1,0)))

[ 本帖最后由 shanchuan 于 2010-8-8 23:35 编辑 ]

TA的精华主题

TA的得分主题

 楼主| 发表于 2010-8-1 20:58 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
如何用函数公式将附件Y列到AG列中标有“重复”的行 复制到sheet1中?
或者将 AH列标有 1的行  复制到sheet1中?
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-23 23:40 , Processed in 0.039496 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

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