ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 查找段落中重复药名标红并记数

[复制链接]

TA的精华主题

TA的得分主题

发表于 2019-7-27 11:57 | 显示全部楼层
本帖最后由 duquancai 于 2019-7-27 12:19 编辑
13907933959 发表于 2019-7-27 07:39
杜前辈好!
哈哈!您的代码查重结果好像也不太准确,“梅”的查重结果,原本有2个,而您的代码查重为无 ...

请试试》》》》》》》
  1. Sub main()
  2.     Dim doc As Document, d As Object
  3.     Set doc = ActiveDocument
  4.     Set d = CreateObject("Scripting.Dictionary")
  5.     Call get_num(doc, d)
  6.     Call mark_num(doc, d)
  7. End Sub
  8. Sub get_num(ByVal doc As Document, ByRef d As Object)
  9.     Dim re As Object, mh As Object
  10.     Set re = CreateObject("VBScript.Regexp")
  11.     re.Global = True: re.MultiLine = True
  12.     re.Pattern = "^[^、]+"
  13.     For Each mh In re.Execute(doc.Content.Text)
  14.         d(mh.Value) = d(mh.Value) + 1
  15.     Next
  16. End Sub
  17. Sub mark_num(ByRef doc As Document, ByVal d As Object)
  18.     Dim key, re As Object, mh As Object, n As Long
  19.     key = d.keys()
  20.     Set re = CreateObject("VBScript.Regexp")
  21.     re.MultiLine = True
  22.     For i = 0 To UBound(key)
  23.         If d(key(i)) > 1 Then
  24.             re.Pattern = "^" & key(i)
  25.             Set mh = re.Execute(doc.Content.Text)
  26.             n = mh(0).FirstIndex + Len(key(i)) + 1
  27.             With doc.Range(n, n)
  28.                 If .MoveEndWhile("(") <> 1 Then .InsertAfter "(重复" & d(key(i)) - 1 & "个)"
  29.             End With
  30.         End If
  31.     Next
  32. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2019-7-27 12:15 | 显示全部楼层
* 139,在测试时,不管发现哪位老师的测试结果,如果有一个词不正确,就可以判断为:代码错误!希求老师重新编码以求正确结果(先从最短词汇测试校对,用我的 EXCEL对照表)。可以公布一下结果。

TA的精华主题

TA的得分主题

发表于 2019-7-27 12:59 | 显示全部楼层
13907933959 发表于 2019-7-27 09:31
前辈、抱歉!抱歉!才发现描述有重大笔误!
查找word文档段落中重复的药名,在重复的药名后面标注重复的 ...

请测试》》》》》》》》》》》》》》
  1. Sub main()
  2.     Dim doc As Document, d As Object
  3.     Set doc = ActiveDocument
  4.     Set d = CreateObject("Scripting.Dictionary")
  5.     Call get_num(doc, d)
  6.     Call mark_num(doc, d)
  7. End Sub
  8. Sub get_num(ByVal doc As Document, ByRef d As Object)
  9.     Dim re As Object, mh As Object
  10.     Set re = CreateObject("VBScript.Regexp")
  11.     re.Global = True: re.MultiLine = True
  12.     re.Pattern = "^[^、]+、"
  13.     For Each mh In re.Execute(doc.Content.Text)
  14.         d(mh.Value) = d(mh.Value) + 1
  15.     Next
  16. End Sub
  17. Sub mark_num(ByRef doc As Document, ByVal d As Object)
  18.     Dim key, re As Object, mh As Object, n As Long, i As Long
  19.     key = d.keys()
  20.     Set re = CreateObject("VBScript.Regexp")
  21.     re.MultiLine = True
  22.     For i = 0 To UBound(key)
  23.         If d(key(i)) > 1 Then
  24.             re.Pattern = "^" & key(i)
  25.             Set mh = re.Execute(doc.Content.Text)
  26.             n = mh(0).FirstIndex + Len(key(i))
  27.             With doc.Range(n, n)
  28.                 If .MoveEndWhile("(") <> 1 Then
  29.                     .InsertAfter "(重复" & d(key(i)) - 1 & "个)"
  30.                     .MoveEndUntil vbCr
  31.                     .Font.ColorIndex = 6
  32.                 End If
  33.             End With
  34.         End If
  35.     Next
  36. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2019-7-27 13:06 | 显示全部楼层
413191246se 发表于 2019-7-27 12:15
* 139,在测试时,不管发现哪位老师的测试结果,如果有一个词不正确,就可以判断为:代码错误!希求老师重 ...

这样的题有深挖掘的必要?显然,可完成目标任务的代码就是好代码,难道要把它写成一个软件?
另:楼主早先一直跟帖说我们几个人的代码统计有误。我对此一直纳闷。我们统计的结果与楼主附件中的要求是一致的,这可通过手工查找来对正。楼主后来自行纠正说附件中的“描述”有重大笔误,却原来是统计的数量结果要排除标注“重复”字样的本身这一个。

回到你的楼层,提供附件代码供检测。

附件.rar

25.11 KB, 下载次数: 6

TA的精华主题

TA的得分主题

发表于 2019-7-27 13:48 | 显示全部楼层
本帖最后由 duquancai 于 2019-7-27 15:52 编辑
13907933959 发表于 2019-7-27 09:31
前辈、抱歉!抱歉!才发现描述有重大笔误!
查找word文档段落中重复的药名,在重复的药名后面标注重复的 ...

你的需求 不断的改变!下次想清楚了,一次性吐完吧!按照你这次的需求写的,请测试!
  1. Sub main()
  2.     Dim doc As Document, d As Object
  3.     Set doc = ActiveDocument
  4.     Set d = CreateObject("Scripting.Dictionary")
  5.     Call get_num(doc, d)
  6.     Call mark_num(doc, d)
  7. End Sub
  8. Sub get_num(ByVal doc As Document, ByRef d As Object)
  9.     Dim re As Object, mh As Object
  10.     Set re = CreateObject("VBScript.Regexp")
  11.     re.Global = True: re.MultiLine = True
  12.     re.Pattern = "^[^、]+、$"
  13.     For Each mh In re.Execute(doc.Content.Text)
  14.         d(mh.Value) = d(mh.Value) + 1
  15.     Next
  16. End Sub
  17. Sub mark_num(ByRef doc As Document, ByVal d As Object)
  18.     Dim key, re As Object, mhs As Object, n&, i&, j&, flag As Boolean, t&
  19.     key = d.keys()
  20.     Set re = CreateObject("VBScript.Regexp")
  21.     re.Global = True: re.MultiLine = True
  22.     For i = 0 To UBound(key)
  23.         If d(key(i)) > 1 Then
  24.             re.Pattern = "^" & key(i): flag = False: t = 0
  25.             Set mhs = re.Execute(doc.Content.Text)
  26.             For j = 0 To mhs.Count - 1
  27.                 n = mhs(j).FirstIndex
  28.                 If Not flag Then
  29.                     With doc.Range(n, n + Len(key(i)))
  30.                         If .MoveEndWhile("(") = 1 Then Exit For
  31.                         .InsertAfter "(重复" & d(key(i)) - 1 & "个)"
  32.                         t = Len("(重复" & d(key(i)) - 1 & "个)")
  33.                     End With
  34.                     flag = True
  35.                 Else
  36.                     doc.Range(n + t, t + n + Len(key(i))).Font.ColorIndex = 6
  37.                 End If
  38.             Next
  39.         End If
  40.     Next
  41. End Sub
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2019-7-27 14:03 | 显示全部楼层
* gbgbxgb 老师,您好!——我早注意到您了,但我现在不得不衷心地说,您太厉害了!以后我就称您为老师了!请笑纳。
*
* 正则代码如表中显示,您的代码执行速度是最快的。正则我还一点不会。我觉得还是按我徒弟 139 所要求对代码精益求精一下比较好。
*
* 今天凌晨,经我几易其稿后,发现,我徒弟 139 的这道题,用 杜老师(duquancai)的话说就是,有“坑”!
刚开始,我发现每个词,后面必须是“顿号、”截止;后来,发现不仅如此,前面还要有符号来代表起始,用回车符也行,我用了个笨办法,每段前面加了一个小撇儿(‘),后来觉得还是找到每个词后,只要判断前一字符是回车符(13)即可,这样,每位老师的代码可能就不会有问题了!
*
* 刚才又看了一下各位老师的代码,因为不懂正则,现在我最推崇的是 zhangelei1371 老师的代码,他的代码就是最普通又经典的《循环遍历段落法ForEachNext》集合遍历法,因为代码最少,速度仅次于老师您的代码,所以我最喜欢 zhanglei1371 老师的代码(我判断他的代码结果现在是错误的,因为没有判断前一字符是回车或加小撇儿‘)。
*
* 各位老师/高人/大神在一起 VS 一下代码,我觉得总是有高有低,有快有慢,做个比较是正常的。
*
* 如果您有兴趣的话,建议重新推敲一下代码,重新审视一下是否彻底正确地解决了我徒弟 139 的问题。
*
* 谢谢!

TA的精华主题

TA的得分主题

发表于 2019-7-27 14:12 | 显示全部楼层
    gbgbxgb 老师,您好! 请不要生气!人的认识是一步一步发展的,我刚开始比较武断,判定各位老师的代码结果不正确,后来逐步认识到问题不太简单。比如:我徒弟 139 这道题,“刺梨”和“刺梨根”不一样,后来发现还有“山刺梨”,后面有顿号截止,前面怎么限定一个词?就是回车或加一字符(如小撇儿‘)。否则,查找结果就不对了。

TA的精华主题

TA的得分主题

发表于 2019-7-27 14:25 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
413191246se 发表于 2019-7-27 14:12
gbgbxgb 老师,您好! 请不要生气!人的认识是一步一步发展的,我刚开始比较武断,判定各位老师的代码 ...

我没生气啊。
看来我用“?”表述疑问让你产生了语句中含有“火药味”了,下回我注意尽量用陈述句,不用问句或感叹句。

另:VBA代码过度关注代码的效率完全没必要。当然了,你也说了,你想要代码精益求精,甚至想让代码既精简又高效,那才是好代码。但遗憾的是,往往精简的代码却不周到,可能错漏百出。
还是一句话表明我对VBA的看法:它仅是办公的得力助手,自己写的且能完成目标的就是最适合的代码,哪怕它有缺陷。因为日后工作中发现代码存在错漏了,那么,再慢慢完善它也不迟。你说呢?(原谅我又用“?”了,^_^)

TA的精华主题

TA的得分主题

发表于 2019-7-27 20:41 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
* gbgbxgb 老师,您没生气,太好了!咱们又可以做朋友了!——我来论坛也有 8 年了吧,2011年7月上本坛的。过去,曾经学习过 VB6,但最终连一个计算器都不会编。后来,在工作中,日益熟悉了一些 Word 用法,像“邮件合并”功能,是自学的,这点现在很多人还不会哩!
*
* 再后来,直到 2011年7月吧,突然灵机一动,有一次偶然的机会,我就到 VBE 中改了改代码(其实在 VB6 中我已经在 VBE 中学习过一阵子,但在 WORD 中竟然不懂!),至此,一发不可收拾,就开始喜欢 VBA 编程了,开始是一直利用录制宏这个便利方法学习的。后来,学习了 VBA 微软官方帮助文档,又找了一本电子书《VBA从入门到精通第二版》和《守柔VBA代码集》等,逐步入门。但感觉进步最大的还是近几年得益于 杜老师(duquancai)等一些高人大神的帮助,从一些VBA“方法”,到简写方法。目前,感觉初步掌握了 VBA 的一些查找方法,算法朴素,代码初步,深感与各位老师的差距还是很大的,我还得向各位老师学习(现在仅初步掌握VBA查找方法,数组、函数、递归、字典、正则等统统不会)。

TA的精华主题

TA的得分主题

发表于 2019-7-27 22:09 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
* 139,我重新提供一下最新VBA代码对照结果,gbgbxgb 老师 和 duquancai 老师 都重新提供了代码。
* EXCEL对照表: 139vs2.rar (64.65 KB, 下载次数: 6)
* VBA结果对照: 139vs2.GIF
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-6-2 15:16 , Processed in 0.034228 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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