ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 3123|回复: 17

[讨论] 判断是否是母子字符串?(字符串有重复,且位置不同)

[复制链接]

TA的精华主题

TA的得分主题

发表于 2013-5-13 21:45 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
判断规则:母字符串必须包括子字符串的全部字符,且母字符串每个字符的数量大于等于子字符串该字符的数量
如:
3,11,8,1,6,5,116,5,3,8,11,1
第一个字符串包括第二个字符串的全部字符;且数量均大于等于
先用字典的方法提供一个思路,望抛砖引玉,希大家提供更好的方法。
  1. Function aa(rng1, rng2)
  2. Set d = CreateObject("scripting.dictionary")
  3. x = Split(rng1, ",")
  4. For i = 0 To UBound(x)
  5.     d(x(i)) = d(x(i)) + 1
  6. Next
  7. y = Split(rng2, ",")
  8. For i = 0 To UBound(y)
  9.     d(y(i)) = d(y(i)) - 1
  10. Next
  11. aa = IIf(InStr(Join(d.items, ","), "-"), "不包含", "包含")
  12. End Function
复制代码


新建 Microsoft Excel 工作表.zip

6.86 KB, 下载次数: 22

TA的精华主题

TA的得分主题

发表于 2013-5-13 22:03 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 crazy0qwer 于 2013-5-13 22:07 编辑

这样合并字符,可能效率并不高,自己测试看看。
  1. Sub AAA()
  2.   A = aa("3,11,8,6,5,11", "6,5,3,8,11,1")
  3. End Sub

  4. Function aa(Rng1 As String, Rng2 As String) As Boolean
  5.     Dim X, N As Long
  6.     X = Split(Rng2, ",")
  7.     Rng1 = "," & Rng1 & ","
  8.     N = UBound(X)
  9.     For I = 1 To N
  10.         If InStr(Rng1, "," & X(I) & ",") = 0 Then Exit Function
  11.     Next
  12.     aa = True
  13. End Function
复制代码

点评

如果有重复,判断失误  发表于 2013-5-13 22:18

TA的精华主题

TA的得分主题

发表于 2013-5-13 23:03 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
抱歉,看错了。以为是整个字符串长度。
还要比较个数,似乎也没什么好办法。
如果你里面的数不是很大的话,不妨试试用数组来代替字典,比较创建一个数组要比一个对象要快些。
还有就是,如果没有必要的话,还是用按钮一次性判断比较好,因为数据大的话,重算比较耗时。

TA的精华主题

TA的得分主题

发表于 2013-5-14 00:28 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
用你的思路,同时取个巧:
Function bb(rng1, rng2)
Dim ar(99)
x = Split(rng1, ",")
For i = 0 To UBound(x)
    ar(x(i)) = ar(x(i)) + 1
Next
y = Split(rng2, ",")
For i = 0 To UBound(y)
    ar(y(i)) = ar(y(i)) - 1
Next
bb = IIf(InStr(Join(ar, ","), "-"), "不包含", "包含")
End Function

点评

方法不错,如果是文本则有局限性。  发表于 2013-5-14 18:08

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2013-5-14 01:05 | 显示全部楼层
本帖最后由 小花鹿 于 2013-5-14 17:45 编辑

不知用工作表函数是否会被人骂?
Function bb(rng1, rng2)
s = rng2 & ","
x = Split(rng1, ",")
For i = 0 To UBound(x)
    s = Application.Substitute(s, x(i) & ",", "", 1)
Next i
bb = IIf(s <> "", "不包含", "包含")
End Function

考虑不周,改一下:
Function bb(rng1, rng2)
s = "," & rng2 & ","
x = Split(rng1, ",")
For i = 0 To UBound(x)
    s = Application.Substitute(s, "," & x(i) & ",", ",", 1)
Next i
s = Application.Substitute(s, ",", "")
bb = IIf(s <> "", "不包含", "包含")
End Function

点评

结果有问题:s1 = "AB,AA,AAA,C":s2 = "AB,AAA,C,AA"  发表于 2013-5-14 16:06

TA的精华主题

TA的得分主题

发表于 2013-5-14 09:02 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
小花鹿 发表于 2013-5-14 01:05
不知用工作表函数是否会被人骂?
Function bb(rng1, rng2)
s = rng2 & ","

学习,很好的思路!

TA的精华主题

TA的得分主题

发表于 2013-5-14 09:03 | 显示全部楼层
本帖最后由 Zamyi 于 2013-5-14 09:07 编辑

Function aa(rng1, rng2)
Set d = CreateObject("scripting.dictionary")
For Each c In Split(rng1, ",")
  d(c) = d(c) + 1
Next
For Each c In Split(rng2, ",")
  n = d(c)
  If n = 0 Then
    aa = "不包含"
    Exit Function
    Else
    d(c) = n - 1
  End If
Next
aa = "包含"
End Function

点评

谢谢老师对5楼的指导。  发表于 2013-5-14 17:48

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2013-5-14 09:18 | 显示全部楼层
来个RUBY的
  1. Sub ruby()
  2. Dim ojs, x, y
  3. Set ojs = CreateObject("Scriptcontrol"): ojs.Language = "rubyscript"
  4. ojs.eval ("s='3,11,8,1,6,5,11';a=s.split(',');b='6,5,3,8,11,1'.split(',')")
  5. x = ojs.eval("require 'set';Set[*b].subset?(Set[*a])")
  6. y = ojs.eval("h={};a.each{|x|h[x]=h.key?(x)?h[x]+1:1};b.each{|y|h[y]=h.key?(y)?h[y]-1:1};h")
  7. MsgBox IIf(InStr(y, "-") = 0 And x, "包含", "不包含")
  8. ‘Stop
  9. Set ojs = Nothing
  10. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2013-5-14 09:25 | 显示全部楼层
本帖最后由 bluexuemei 于 2013-5-14 16:09 编辑
  1. Function z(rng1, rng2)
  2.     Dim ojs, x, y
  3.     Set ojs = CreateObject("Scriptcontrol"): ojs.Language = "rubyscript"
  4.     ojs.Eval ("s='" & rng1.Value & "';a=s.split(',');b='" & rng2.Value & "'.split(',')")
  5.     x = ojs.Eval("require 'set';Set[*b].subset?(Set[*a])")
  6.     y = ojs.Eval("h={};a.each{|x|h[x]=h.key?(x)?h[x]+1:1};b.each{|y|h[y]=h.key?(y)?h[y]-1:1};h.to_s.include?('-')")
  7.     z = IIf(Not y And x, "包含", "不包含")
  8.     Set ojs = Nothing
  9. End Function
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2013-5-14 10:25 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
  1. Function Yn(str1$, str2$)
  2.     Set oJs = CreateObject("scriptcontrol"): oJs.Language = "rubyscript"
  3.     Yn = oJs.Eval("a,b='" & str1 & "'.split(','),'" & str2 & "'.split(',');bl=1;b.uniq" _
  4.                   & ".each{|o|bl=0 if b.count(o)>a.count(o)};(bl==0?'不':'')+'包含';")
  5.     Set oJs = Nothing
  6. End Function
复制代码

评分

1

查看全部评分

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

本版积分规则

关闭

最新热点上一条 /1 下一条

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

GMT+8, 2024-4-25 07:46 , Processed in 0.061896 second(s), 21 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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