ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

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

[复制链接]

TA的精华主题

TA的得分主题

发表于 2019-7-26 21:39 | 显示全部楼层
zhanglei1371 发表于 2019-7-26 20:55
我也来个简单版的:

针对纯文本,你这“算法”很好!!!

TA的精华主题

TA的得分主题

发表于 2019-7-26 23:09 | 显示全部楼层
本帖最后由 413191246se 于 2019-7-27 11:40 编辑

* 徒弟 139 你好!好久不见了!看到你的题目,等我忙了半天想发表,结果发现各位老师已经抢先了!

TA的精华主题

TA的得分主题

发表于 2019-7-27 01:57 | 显示全部楼层
* 楼上图片及EXCEL数据有错!
*
* 如果哪位老师看到,对不起!我弄错了,现更正如下:(原来“山刺梨”和“刺梨”还不是一回事!我是觉得后面有顿号、截住,原来前面也要有符号,我用小撇儿`放在每个段落的前面,现在估计数据是正确的了!)
* 查找重复药品名称VBA代码VS结果对照表: vs139.rar (57.15 KB, 下载次数: 3)
* 查找重复药品名称VBA代码VS结果对照图: vs139.jpg

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-7-27 07:37 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
zhanglei1371 发表于 2019-7-26 20:55
我也来个简单版的:

前辈好!
粗测了一下您的代码,速度很快,但查重结果好像不太准确,我只测了“梨”和“梅”两个药材的查重结果,原本各有2个;而您的代码查重为无。

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-7-27 07:39 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
duquancai 发表于 2019-7-26 21:05
没时间考虑算法,也就不管效率了!!!

杜前辈好!
哈哈!您的代码查重结果好像也不太准确,“梅”的查重结果,原本有2个,而您的代码查重为无。

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-7-27 09:12 | 显示全部楼层
413191246se 发表于 2019-7-27 01:57
* 楼上图片及EXCEL数据有错!
*
* 如果哪位老师看到,对不起!我弄错了,现更正如下:(原来“山刺梨”和 ...

师傅好!
好久不见,甚是想念!
您的回复早上都没显示出来,刚刚才看到,让师傅费心了!
这几天医院的人都参加市内组织的消防演习,较清闲,本想把2万多种中药材名作一个简单的整理,对重复的药材名标注重复次数,没想到因水平未到,搞了几个小时都没搞定,只能上论坛来向前辈们求助。
师傅您的这个对照表真是太捧了,什么都一目了然。代码的快慢不是排第一位,准确率才是第一位!从目前粗测来看,ming0018 前辈10楼的代码准确率最高。
师傅、怎么没看到您的代码?

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-7-27 09:31 | 显示全部楼层
ming0018 发表于 2019-7-26 16:12
这是我根据gbgbxgb的思路又写了一份代码,和gbgbxgb的区别在于,不会改成原文档的格式,缺点就是速度会 ...

前辈、抱歉!抱歉!才发现描述有重大笔误
查找word文档段落中重复的药名,在重复的药名后面标注重复的数量,如:豺肉、共有5个,就在第一个“豺肉”后面标注(重复4个),后面再出现的“豺肉”就不标注了,其它段落中重复的药名以此类推。把后面的重药名标红一下,药名后面查重记了数的除外。
劳请前辈你帮忙修改一下代码!谢谢!

TA的精华主题

TA的得分主题

发表于 2019-7-27 11:49 | 显示全部楼层
* 139 你好! 我的代码,实际上,已经几易其稿了,因为照各位老师比,水平很低,另外对于每个段落中的药品名称也没掌握好,所以,实际上是今天早上凌晨,才醒悟过来,每个段落的文字,即药品,后面有顿号做标记,前面开始没有;我后来发现“山刺梨”和“刺梨”有重复,所以,决定每个段落前要加一个小撇儿',这样,每个段落的药品才会是唯一的了!——到底哪位老师的代码是最正确的(100%),还请你仔细测试一下。
*
* 我的代码因为就是普通的 VBA 查找,水平所限,很费时,当然也有一部分原因是,我的代码前部分是初始化准备,就是当一个药名后面没有“顿号、”时,前部分初始化会自动加一个顿号;其它比如,药名中有空格、有假回车、有域等都要删除变得正常后,再查找重复药名,很费时间,大约一分钟多,请你耐心等待,继而测试一下(EXCEL对照表中,1代表相等,0代码不相等)。师傅水平低,敬请见谅!
*
* 我的代码:
  1. Sub aaab查找重复药品名称()
  2.     Dim j As Paragraph
  3.     With ActiveDocument
  4.         .Content.Find.Execute "[^13^11]", , , 1, , , , , , "^p", 2
  5.         .Fields.Unlink
  6.         .ConvertNumbersToText
  7.         .Select
  8.         With Selection
  9.             .Font.Underline = wdUnderlineNone
  10.             CommandBars.FindControl(ID:=122).Execute
  11.             CommandBars.FindControl(ID:=123).Execute
  12.             With .Find
  13.                 .ClearFormatting
  14.                 .Execute "^w", , , 0, , , , , , "", 2
  15.                 .Execute " ", , , 0, , , , , , "", 2
  16.             End With
  17.         End With
  18.         For Each j In .Paragraphs
  19.             If Asc(j.Range) = 13 Then j.Range.Delete
  20.         Next
  21.         .Content.Find.Execute "([!、])(^13)", , , 1, , , , , , "\1、\2", 2
  22.         With .Paragraphs.Last.Range
  23.             If .Text = vbCr Then .Delete
  24.         End With
  25.         .Content.Find.Execute "^p", , , , , , , , , "^p`", 2
  26.         .Paragraphs.Last.Range.Delete
  27.         .Content.InsertBefore Text:="`"
  28.     End With
  29. 'End Sub
  30. 'Sub aaab查找重复药品名称222()
  31.     Dim r As Range, a As Range, s As Range, i$, n&
  32.     With Selection
  33.         .WholeStory
  34.         .InsertBefore Text:=vbCr
  35.         Set r = .Range
  36.         Set a = .Range
  37.         Set s = .Paragraphs(1).Range
  38.     End With
  39.     Do
  40.         Set s = s.Next(4, 1)
  41.         If s.Underline = wdUnderlineSingle Then GoTo sk
  42.         With r.Find
  43.             .ClearFormatting
  44.             i = s.Text
  45.             i = Left(i, Len(i) - 1)
  46.             .Text = i
  47.             .Forward = True
  48.             .MatchWildcards = True
  49.             Do While .Execute
  50.                 With .Parent
  51.                     .MoveEnd
  52.                     .Underline = wdUnderlineSingle
  53.                     n = n + 1
  54.                     If n >= 2 Then .Font.Color = wdColorRed
  55.                     .Start = .End
  56.                 End With
  57.             Loop
  58.             If n >= 2 Then s.Characters.Last.InsertBefore Text:="(重复" & n & "个)"
  59.             n = 0
  60.             r.SetRange Start:=s.End, End:=a.End
  61.         End With
  62. sk:
  63.     Loop Until s.End = a.End
  64.     With ActiveDocument.Content
  65.         .Paragraphs(1).Range.Delete
  66.         .Underline = wdUnderlineNone
  67.         .Find.Execute "`", , , , , , , , , "", 2
  68.     End With
  69. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2019-7-27 11:56 | 显示全部楼层
本帖最后由 413191246se 于 2019-7-27 12:11 编辑

* 139,我的最新版本《Word2003 & 2007 VBA 自动排版宏(集成版)2019-7-9》中的 2003 版本代码,希望你选用,这是目前最新最好版本了!(我曾经几次想优化,发现速度不进反退,作罢!)平时简单地排版一下很好,另外你有什么好的建议也可以提出来。如果觉得好,也可以推荐给其他人。*
* 我现在是 WinXP 下联合使用:Word2003 & Word2007(但在我的电脑上,2007运行很慢,不如2003快,因为它需要内存多)。*
* 你的问题提得很好!引得好几位老师/高手/大神竞相献艺。以后在整理医学文献时,可以自行设计,有问题就来论坛提出问题(当然开始自己用录制宏的方式自行研究也很好)。
*
* 下面是将你上面标红代码,删除标红词汇的代码(不需要可以不保留,就是一句代码。这个《经典代码》我不知道你掌握没有?很好用、很简单。实际上,我很想用这个经典代码来设计排版程序,但速度上会大打折扣——我过去是个五笔打字爱好者,打多少字都不怕,现在打得少了,总搞代码)。
  1. Sub a经典代码_循环遍历段落法_ForEachNext_删除红色词汇()
  2.     Dim i As Paragraph
  3.     For Each i In ActiveDocument.Paragraphs
  4.         If i.Range.Font.Color = wdColorRed Then i.Range.Delete
  5.     Next
  6. End Sub
复制代码


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
复制代码

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

本版积分规则

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

GMT+8, 2024-11-22 15:51 , Processed in 0.047061 second(s), 7 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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