ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[讨论] 批量清除重复段落

[复制链接]

TA的精华主题

TA的得分主题

发表于 2006-12-9 14:14 | 显示全部楼层 |阅读模式

WORD批量清除重复段落

有时候,需要整理的文档有大量重复的段落,如何批量清除呢?


如果是连续的重复段落:

点击:编辑-替换

勾选通配符

查找内容:(?{1,}^13)\1

替换为:\1

全部替换

重复几次,直到替换处数为0。


如果是不连续的重复段落:

点击:编辑-替换

勾选通配符

查找内容:^13(?{1,}^13)*\1

替换为:^13\1

全部替换

重复几次,只到替换处数为0。

Enjoy!

注意事项:

1、最好先清除多余空行;
2、替换之前,一定把光标放在文章开始处(Ctrl+Home),因为WORD默认是在光标开始处查找。或者全选

文档(Ctrl+A)。

[此贴子已经被作者于2006-12-9 14:25:43编辑过]

TA的精华主题

TA的得分主题

 楼主| 发表于 2006-12-9 14:17 | 显示全部楼层
肯定还有更好的办法,请各位大哥指点啊!

TA的精华主题

TA的得分主题

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

谢谢你的总结。

里面有一点我不是很懂,在“查找和替换”那里,不勾选“通配符”能做到吗?勾选了“通配符”有什么好处?

对于上面注意事项里面的第一点,如果遇到有许多的空行,那如果要事先都删除,那也是一件比较麻烦的事情,应该有更好的的处理方法。

TA的精华主题

TA的得分主题

发表于 2006-12-9 15:21 | 显示全部楼层

谢谢分享。

对不连续的情形,楼主替换时是否漏了星号部分的字符串文本,或是想删除它。

TA的精华主题

TA的得分主题

 楼主| 发表于 2006-12-9 15:27 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
QUOTE:
以下是引用linqiang0816在2006-12-9 15:13:00的发言:

谢谢你的总结。

里面有一点我不是很懂,在“查找和替换”那里,不勾选“通配符”能做到吗?勾选了“通配符”有什么好处?

对于上面注意事项里面的第一点,如果遇到有许多的空行,那如果要事先都删除,那也是一件比较麻烦的事情,应该有更好的的处理方法。

不勾选肯定不行,因为首先"\1"就不支持了。

第二点,清除空行可以用替换命令:把“^13^13”替换为“13”(把每两个段落标记替换为一个),来几次就可以了!

[此贴子已经被作者于2006-12-9 15:35:43编辑过]

TA的精华主题

TA的得分主题

 楼主| 发表于 2006-12-9 15:28 | 显示全部楼层
还有,这个命令我用少量的文字测试的时候没问题,但长达几百页,速度还是太慢了。

TA的精华主题

TA的得分主题

 楼主| 发表于 2006-12-9 15:33 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
QUOTE:
以下是引用sylun在2006-12-9 15:21:18的发言:

谢谢分享。

对不连续的情形,楼主替换时是否漏了星号部分的字符串文本,或是想删除它。

是的,是少了。

对于不连续的情形,应该是:

查找内容:^13(?{1,}^13)(*)\1

替换为:^13\1\2

我用相互交错的几个段落测试时,很好,于是就发上来了!但又用长文档测试时,太慢!而且好象还有些其他问题。

哪位大侠拿出更好的方案?

TA的精华主题

TA的得分主题

发表于 2006-12-9 16:19 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2006-12-9 16:47 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

不错。

我也发几个我不久前做的代码。与大家分享。

Sub 删重复行并计数()
    On Error Resume Next '忽略错误
    '++++++++++++++++++++++++++++++++++++++++++
    '要求:1.怎样将相同的行保留一行,但要在最后加上出现次数(此次应该是段的意思)
    '      2.不要格式
    '++++++++++++++++++++++++++++++++++++++++++
    Dim allstring As String  '取得文档所有内容的变量
    Dim arrpar '段落数组
    Dim i As Long '累减的序号
    Dim intlin As Long '每段的字长
    Dim k As Long    '重复的个数
    Dim newstring As String '新的文档内容
   
    allstring = ActiveDocument.Content '取得文档的内容
    allstring = Replace(allstring, Chr(13), Chr(13) & Chr(13)) '替换为双段,以便分开每段
    allstring = Chr(13) & allstring '在文档前加一个回车
    arrpar = Split(allstring, Chr(13)) '分列为数组
    For i = UBound(arrpar) - 1 To 1 Step -1
        intlin = Len(arrpar(i))
        If intlin > 0 Then '如果不是空段落
            k = (Len(allstring) - Len(Replace(allstring, Chr(13) & arrpar(i) & Chr(13), Chr(13)))) / (intlin + 1) '替换后相除即是重复的次数
            '加1是因为段落标记
            If k = 1 Then '如果没有重复
                newstring = arrpar(i) & vbCrLf & newstring '无重复直接加
            ElseIf k > 1 Then '如果有重复
                newstring = arrpar(i) & k & vbCrLf & newstring  '有重复在后面加重复的个数
            End If
                allstring = Replace(allstring, Chr(13) & arrpar(i) & Chr(13), Chr(13)) '删除判断过的内容
        End If
      Next
     
    ActiveDocument.Content = newstring '写入文档
   
End Sub
Sub 删重复段落()

    On Error Resume Next '忽略错误
    '++++++++++++++++++++++++++++++++++++++++++
    '要求:1.怎样将相同的行保留最后的段落
    '      2.要格式
    '      3.速度较慢
    '++++++++++++++++++++++++++++++++++++++++++
    Dim allstring As String  '取得文档所有内容的变量
    Dim i As Long '段落累减的序号
    Dim intlin As Long '每段的字长
    Dim k As Long    '重复的个数
   
    Application.ScreenUpdating = False '关闭屏幕闪幕
    allstring = ActiveDocument.Content '取得文档的内容
    allstring = Replace(allstring, Chr(13), Chr(13) & Chr(13)) '替换为双段,以便分开每段
    For i = ActiveDocument.Paragraphs.Count To 1 Step -1
        intlin = Len(ActiveDocument.Paragraphs(i).Range)
        If intlin > 1 Then '如果不是空段落
            k = (Len(allstring) - Len(Replace(allstring, Chr(13) & ActiveDocument.Paragraphs(i).Range, Chr(13)))) / (intlin + 1) '替换后相除即是重复的次数
            '加1是因为段落标记
            If k = 1 Then '如果没有重复
                 '无重复记录不变
            ElseIf k > 1 Then '如果有重复
               allstring = Replace(allstring, Chr(13) & ActiveDocument.Paragraphs(i).Range, Chr(13), 1, 1) '删除判断过的内容
               ActiveDocument.Paragraphs(i).Range.Delete  '有重复在后面加重复的个数
            End If
        End If
     Next
    Application.ScreenUpdating = False '开启屏幕闪幕
   
End Sub

Sub 删重复段落快()

    On Error Resume Next '忽略错误
    '++++++++++++++++++++++++++++++++++++++++++
    '要求:1.怎样将相同的行保留最后一段
    '      2.不要格式
    '++++++++++++++++++++++++++++++++++++++++++
    Dim allstring As String  '取得文档所有内容的变量
    Dim arrpar '段落数组
    Dim i As Long '累减的序号
    Dim intlin As Long '每段的字长
    Dim k As Long    '重复的个数
    Dim newstring As String '新的文档内容
   
    allstring = ActiveDocument.Content '取得文档的内容
    allstring = Replace(allstring, Chr(13), Chr(13) & Chr(13)) '替换为双段,以便分开每段
    allstring = Chr(13) & allstring '在文档前加一个回车
    arrpar = Split(allstring, Chr(13)) '分列为数组
    For i = UBound(arrpar) - 1 To 1 Step -1
        intlin = Len(arrpar(i))
        If intlin > 0 Then '如果不是空段落
            k = (Len(allstring) - Len(Replace(allstring, Chr(13) & arrpar(i) & Chr(13), Chr(13)))) / (intlin + 1) '替换后相除即是重复的次数
            '加1是因为段落标记
            If k = 1 Then '如果没有重复
                newstring = arrpar(i) & vbCrLf & newstring '无重复直接加
            ElseIf k > 1 Then '如果有重复
                newstring = arrpar(i) & vbCrLf & newstring  '有重复在后面加重复的个数
            End If
                allstring = Replace(allstring, Chr(13) & arrpar(i) & Chr(13), Chr(13)) '删除判断过的内容
        End If
      Next
     
    ActiveDocument.Content = newstring '写入文档
   
End Sub

Sub 排序比较()

    On Error Resume Next '忽略错误
    '++++++++++++++++++++++++++++++++++++++++++
    '要求:1.将相同的行保留第一次出现的
    '      2.要格式
    '      3.破坏原来段落的次序
    '++++++++++++++++++++++++++++++++++++++++++
    Dim par As Paragraph
    '排序比较
    Application.ScreenUpdating = False
   
  ' ActiveDocument.Content.Sort '排序
    With ActiveDocument
        For Each par In .Paragraphs
A:         If par.Range = par.Next.Range Then
            If par.Next.Range Is Nothing Then
                '如果到最后一段了,就没有next了,就跳出
                Exit For
            End If
               par.Next.Range.Delete  '因为删除后,段落数少一个,所以要再判断
               GoTo A:
           End If

        Next
     End With
    
     Application.ScreenUpdating = True
End Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2006-12-9 17:16 | 显示全部楼层

了不起的版主啊!

就是高!

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

本版积分规则

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

GMT+8, 2024-4-28 09:02 , Processed in 0.042274 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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