ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[原创] Word VBA删除大文档(长文档)重复标题段落

[复制链接]

TA的精华主题

TA的得分主题

发表于 2019-1-24 14:55 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 chendeyan126 于 2019-1-24 14:57 编辑

Word VBA删除大文档(长文档)重复标题段落
一、删除重复段落常用方法
有一些word文档存在许多重复的内容需要去除。人工查找这些重复的内容,不仅费时费力,而且很可能不能做到完全去重,所以要找到一些快速批量去除重复的办法。
在word中删除重复段落的方法,在网络上有很多,一般都是写正则表达式。具体做法如下:
(1)Ctrl+H调出查找和替换对话框,勾选“使用通配符”
查找内容:^13(?*^13)(*)\1
替换:^p\1\2
连续或非连续的重复段落均可去除,保留的是重复段落中第一个出现的段落。替换前将光标置于文档最开始的位置,需要点击“全部替换”多次,直到提示“0处替换”即可。
(2)Ctrl+H调出查找和替换对话框,勾选“使用通配符”
查找内容:^13(?*^13)\1
替换:^p\1
这可以去除连续的重复段落,保留的是重复段落中第一个出现的段落。替换前将光标置于文档最开始的位置,需要点击“全部替换”多次,直到提示“0处替换”即可。

如果确定文档的重复段落是连续的,那么可以使用方法(2)进行去除,运行速度会比较快;如果不确定,就用方法(1)。

以上方法对付小文档还是可以的,如果遇上百万字的大文档,就不太好用了。


二、大文档去除重复段落
一些大文档,大几百页,一百多万字。普通的办公电脑,使用上述方法进行去除,word程序将会长时间不响应,那个圈圈一直在转。况且要点击替换多次,时间就更长了。甚至程序直接崩溃。
前几天就碰到一个这样的文档,有868页,1171600字,直接用上述方法进行去除重复段落,几次尝试之后,都以无法忍受word长时间不响应而告终。
后来,观察文档,发现重复的段落都是以字符串“<目录>”开始的。这些段落其实就是文档中每篇文章的标题。如果把所有以“<目录>”开始的段落设置为标题1样式后,可以在导航窗格中看到这个文档的结构图,如下图所示。这样的标题一共有746个,分布在文档各处。
是标题重复.png


手工删除
如果手工删除,可以这样做。浏览左侧的导航窗格,把重复的标题段落中的第一个标题留下并设置为其他样式,其它不管。这样浏览完整个文档后,所以想要保留的标题都应该设置成了其他样式。如果不放心可以再检查一遍。
然后用查找替换的功能,把所有标题1样式的段落删除,这还是很容易做到的。查找替换对话框的设置如下图所示。在“查找内容”中不输入任何字符,只需要限定样式为“标题1”,在“替换为”中不输入任何字符。需要去除勾选“使用通配符”,然后点击“全部替换”,很快重复的标题就全部被删除了。
但是这样的方法最少也需要半天的时候,而也可能出现遗漏或误删。
删除所有标题1.png


使用vba删除重复标题

还可以使用vba编写代码的方式来快速完成。思路为:把所有以“<目录>”开头的段落设置为标题1样式;为标题1样式的段落加上编号,为使用listparagraphs对象做准备;使用两层嵌套循环,把标题1段落两两比较,把除了第一个标题以外的所有标题设置为斜体;最后删除所有斜体的标题1段落,从而达到删除重复标题段落的目的。代码如下:
Sub 删除大文档重复标题()
   Dim i As Long, j As Long
   Dim biaoti As Paragraph
   Dim StartTime As Single, EndTime As Single
   StartTime = Timer
   Application.ScreenUpdating = False
    '将所有以“<目录>”开头的段落设置为标题1样式
   Selection.find.ClearFormatting
   Selection.find.Replacement.ClearFormatting
   Selection.find.Replacement.Style = ActiveDocument.Styles("标题 1")
   With Selection.find
       .Text = "\<目录\>*^13"
       .Replacement.Text = ""
        .Forward = True
       .Wrap = wdFindContinue
       .Format = True
       .MatchWildcards = True
   End With
   Selection.find.Execute Replace:=wdReplaceAll

    '为标题1加上自动编号,为使用listparagraphs做准备
   With ListGalleries(wdNumberGallery).ListTemplates(1).ListLevels(1)
       .NumberFormat = "%1"
       .TrailingCharacter = wdTrailingTab
       .NumberStyle = wdListNumberStyleArabic
       .NumberPosition = CentimetersToPoints(0)
       .Alignment = wdListLevelAlignLeft
       .TextPosition = CentimetersToPoints(0.74)
       .TabPosition = wdUndefined
       .ResetOnHigher = 0
       .StartAt = 1
       .LinkedStyle = "标题 1"
   End With
   ActiveDocument.Styles("标题 1").LinkToListTemplate ListTemplate:= _
       ListGalleries(wdNumberGallery).ListTemplates(1), ListLevelNumber:=1

    '每一个标题都和其他标题比较一次,如果两标题相同,把下一标题设置为斜体,以区别于要保留的唯一标题
   For i = 1 To ActiveDocument.ListParagraphs.Count
       If ActiveDocument.ListParagraphs(i).Range.Font.Italic = False Then '去除已经比较过的标题,提高程序效率
           Set biaoti = ActiveDocument.ListParagraphs(i)  '获取第一个标题,并赋值给biaoti
           '把下面的所有标题与biaoti比较,相同,则斜体。
           For j = (i + 1) To ActiveDocument.ListParagraphs.Count
                If biaoti.Range =ActiveDocument.ListParagraphs(j).Range Then
                   ActiveDocument.ListParagraphs(j).Range.Font.Italic = True
                End If
           Next
       End If
   Next

    '删除所有斜体的标题,即重复标题
   For Each biaoti In ActiveDocument.ListParagraphs
       If biaoti.Range.Font.Italic = True Then
           biaoti.Range.Delete
       End If
   Next
   Application.ScreenUpdating = True
   EndTime = Timer
   MsgBox "用时" & EndTime - StartTime '显示程序运行时间
End Sub

最后用时195秒,得到了100多个不重复的标题。
代码中前面两段都是通过录制宏的方式得到的,做了一些删减。后面的两层嵌套循环比较并标志重复段落的方法是可行,不过应该会有更好的办法,不知道有哪位大神赐教!

对于在大文档中删除重复段落,最有效率的办法,应该是先观察文档,找到重复段落的一些特征,再结合查找替换、vba代码等方式进行删除。

最后上传一下这个大文档,供有兴趣的人试试,看有没有其他好办法。
医学纲目.zip (1.51 MB, 下载次数: 12)



评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2019-1-25 10:08 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
感谢您的辛勤劳动!感谢分享!
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2025-1-11 14:07 , Processed in 0.044296 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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