ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

如何用VBA提取多个字符串中相同部分

[复制链接]

TA的精华主题

TA的得分主题

发表于 2010-12-10 10:36 | 显示全部楼层 |阅读模式
各位老师好:
  遍寻不到答案,特开贴求教。我遇到的问题是这样的,假如有一列单元格,其中的内容如下:
 1.中国北京
 2.中国河北
 3.亚洲中国山西
 4.……中国……
 请问我如何用VBA来从这一列数据得到它们重叠的部分“中国”(在我不知道重叠字符串大小与内容,并且确定它们有重复内容的情况下),请各位老师指点。VBA中有这样的函数存在吗?
 谢谢dsmch 老师的提醒。

[ 本帖最后由 gddn 于 2010-12-10 11:06 编辑 ]

VBA提取相同字符串.rar

6.42 KB, 下载次数: 204

TA的精华主题

TA的得分主题

发表于 2010-12-10 10:53 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
把excel文件压缩上传,手工做个结果示意一下,方便大家帮你。

TA的精华主题

TA的得分主题

发表于 2010-12-10 11:23 | 显示全部楼层
Sub Test()
    Dim rge As Range
    Dim vt, i&
    Set rge = Range(Range("A3"), Range("A3").End(xlDown))
    vt = rge
    For i = 1 To UBound(vt)
        If vt(i, 1) Like "*" & "中国" & "*" Then
             vt(i, 1) = "中国"
        else  
             vt(i, 1) =""
        endif
    Next
    rge.Offset(0, 1) = vt
End Sub

[ 本帖最后由 ericjon 于 2010-12-10 11:26 编辑 ]

TA的精华主题

TA的得分主题

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

  1. Sub GetSameWord()
  2.     Dim Arr, i%, Str$, strTmp$

  3.     Arr = Range("A3", [A3].End(4))
  4.     Str = Join(Application.Transpose(Arr))
  5.     For i = 1 To Len(Arr(1, 1))
  6.         If Len(Str) - Len(Replace(Str, Mid(Arr(1, 1), i, 1), "")) = UBound(Arr) Then strTmp = strTmp & Mid(Arr(1, 1), i, 1)
  7.     Next
  8.    
  9.     [B2] = strTmp
  10. End Sub
复制代码

[ 本帖最后由 alzeng 于 2010-12-10 11:36 编辑 ]

TA的精华主题

TA的得分主题

发表于 2010-12-10 11:37 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
以上代码要求去除最后单元格的"……"。

TA的精华主题

TA的得分主题

 楼主| 发表于 2010-12-10 11:43 | 显示全部楼层

回复 3楼 ericjon 的帖子

谢谢ericjon老师,程序我理解了,请问如果我想要一段通用的程序(我想做成一个EXCEL中的按钮如附件截图中的),其功能是:如果两个(或者被选中的一列中的数个)单元格有按次序相同的字符串(最少两个),则以Msgbox的形式给出相同的字符串,否则返回“无相同字符串”,例如:如果选中我的上面附件中“中国河北”与“亚洲中国山西”然后点击按钮,则给出消息框“重复字符串为:中国”。如果我选中的是“中国河北”与“亚洲国中”则给出的消息框为“无相同字符串”
不知道我叙述的是否足够清楚。

[ 本帖最后由 gddn 于 2010-12-10 11:45 编辑 ]
自制按钮截图.GIF

TA的精华主题

TA的得分主题

发表于 2010-12-10 12:03 | 显示全部楼层

回复 6楼 gddn 的帖子

我理解错你的意思了,你参考下4楼代码吧

TA的精华主题

TA的得分主题

 楼主| 发表于 2010-12-10 14:13 | 显示全部楼层

回复 5楼 alzeng 的帖子

谢谢一念老师,一词一词拆分后终于搞懂了其中的逻辑,对您的代码的精简与思路的开阔佩服的五体投地,膜拜!

TA的精华主题

TA的得分主题

 楼主| 发表于 2010-12-10 14:20 | 显示全部楼层

回复 7楼 ericjon 的帖子

呵呵,从你的代码中学习了不少东西呢(我是录制宏入的VBA,所以自己写的往往十分生硬),同样谢谢您的热心解答。

TA的精华主题

TA的得分主题

发表于 2010-12-10 16:07 | 显示全部楼层
一念老师的代码如果有重复的部分,就会出现遗漏。
用笨办法写了一个
Dim arr
arr = Range("a3:a" & Range("a65536").End(xlUp).Row)
x = 1000
For i = 1 To UBound(arr)
y = Len(arr(i, 1))
If Len(arr(i, 1)) < x Then m = x: x = y: y = m
Next i
For i = 1 To UBound(arr)
If Len(arr(i, 1)) = x Then z = arr(i, 1): Exit For
Next i
For i = Len(z) To 1 Step -1
For k = 1 To Len(z) - i + 1
b = Mid(z, k, i)
s = 0
For j = 1 To UBound(arr)
If InStr(arr(j, 1), b) > 0 Then s = s + 1
Next j
If s = UBound(arr) Then Range("b2") = b: Exit Sub
Next k
Next i
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-15 10:17 , Processed in 0.043132 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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