ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 名课 - Power BI数据分析与可视化实战 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
Python自动化办公应用大全 Excel 2021函数公式学习大典 Kutools for Office 套件发布 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
12
返回列表 发新帖
楼主: 413191246se

[已解决] 诡异回车符(段落标记),“删除空行”宏无能为力!

[复制链接]

TA的精华主题

TA的得分主题

发表于 2011-12-9 10:39 | 显示全部楼层
几天没来了,看了一下各位的经验,又再次进行了测试,报告如下:
1.(关于空段)我所遇到过的空段落的常见结构为: 0个以上[半角空格 全角空格 不间断空格 制表符]任意组合 + 1个[段落标记 换行符]之一;
2.(关于5楼)Trim() 对 半角空格与全角空格 有效,但对 不间断空格及制表符 无效;
3.(关于6楼)^w 对 全角空格 无效,也就是说只有在空段不包含全角空格时使用 ^w 才有效;但是,因为 ^w 不兼容通配符模式,这样一来又引申出如下问题:
(1) ^p^w^p 只能匹配不包含全角空格且以“标准”段落标记(^p)结尾的空段落;
(2)如果同时还存在以换行符结尾的空段落,还需要另用 ^l^w? 或 ?^w^l 来处理;
(3)如果同时还存在以“非标准”(为了区分姑且这么叫吧)段落标记(^13)结尾的空段落,同样还需另用 ^13^w? 或 ?^w^13 来处理。
注:上面提到的 ? 指代 ^p^13^l 之一。

这样看来就比较繁琐了。

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2011-12-9 11:00 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
根据10的测试,得出如下“删除空段落”的VBA 方法,请各位斧正:
  1. Sub BlaParsDel()
  2.   Dim wPar As Paragraph
  3.   ActiveDocument.Content.Find.Execute findtext:="[^11^13]", _
  4.     replacewith:="^p", MatchWildcards:=True, Replace:=wdReplaceAll
  5.   For Each wPar In ActiveDocument.Paragraphs
  6.     If Len(Trim(Replace(Replace(wPar.Range, ChrW(9), Chr(32)), _
  7.       ChrW(160), Chr(32)))) = 1 Then
  8.       wPar.Range.Delete
  9.     End If
  10.   Next
  11. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2011-12-9 08:50 | 显示全部楼层
413191246se 发表于 2011-12-9 01:16
3Q!其实像这种  ActiveDocument.Content.Find.Execute findtext:="^13", replacewith:="^p", Replace: ...

学习ing……
谢谢413191246se兄的分享!

TA的精华主题

TA的得分主题

发表于 2011-12-9 21:02 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
偶更有兴趣的是这个回车符是怎么出来的。
今天还看见了一个字上的着重圆点,比字下的大些,也不知道怎么回来的。
晕!

TA的精华主题

TA的得分主题

发表于 2011-12-10 09:33 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
413191246se 发表于 2011-12-10 02:18
谢谢各位!3Q!—— 11楼代码不太懂,对于删除空行、段首空格、段尾空格(这里所谓的空格包括:半角空格 ...

那我对 11楼代码 的思路进行一个简单的介绍吧:
前面提到过, 在Word里面 Trim() 对不间断空格制表符无效,但对半角空格全角空格都是有效的!因此我认为关键的是问题怎么处理可能存在的不间断空格制表符。于是我写了 11楼 的代码。
核心是这一句:
If Len(Trim(Replace(Replace(wPar.Range, ChrW(9), Chr(32)), ChrW(160), Chr(32)))) = 1 Then
里面用了两个Replace()函数(类似于Excel中的 substitute函数),将段落文本中可能存在的制表符及不间断空格先后替换为半角空格,然后再Trim()就可以把整个^w一网打尽,最后再len()丈量剔除^w后的剩余段落文本长度,这样就达到了目的。
另外需要注意的是,这里用Replace()来替换的过程只是在内存中完成,而没有对文档本身造成实质性的影响,这样对于那些非空段落,其本身包含的制表符及不间断空格不会受到破坏,当然Trim()的过程也一样,段首、段中、段尾的半角空格与全角空格也不会被破坏;这样就保证了原文的结构,因为在这个主题里,我们讨论的问题是“删除空行”。

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-12-10 23:26 | 显示全部楼层
    乱删东西? 请问  thunor 朋友,有无具体实例呢,咱们大家研究研究,发现一个问题解决一个问题。3Q!
    kqbt 朋友所谓的“保持原文结构”,我是这样看的:别人的文档,如果不排版,拿来就用好了;如果排版,必然要对段首段尾的空格统统删除,以统一自动排版,形成规范的格式。不过,我现在觉得,有些情况,像这种伪段落标记(诡异回车符,假回车符)这种情况,平时遇到的时候很少,我前几天是头一次遇到,可能与不经常排版网络文字有关吧,看来,我要拿网络上的文字拷贝下来做做自动排版练习了。——总感觉有些 VBA 代码似乎是徒劳无功,白白耽误排版速度。3Q!

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-12-10 02:18 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
    谢谢各位!3Q!—— 11楼代码不太懂,对于删除空行、段首空格、段尾空格(这里所谓的空格包括:半角空格、全角空格‘、制表符及那个圆圈空格,也许叫不间断空格吧,不太清楚),我目前的四个宏:删除段首空格、删除段尾空格、删除空行及删除段首空格(特例)已经较完美地解决了,但对于前几天那个伪段落标记(我叫它 假回车符,诡异回车符,真回车符以 Word 中的段落标记为准),我是头一次遇到,也不知它叫什么,也不知是怎么来的,我处理过很多文档,却从来没遇到过它!现在我把我的 Word 2003 通用模板 中,“一键排版”宏的代码部分地呈现上来,并且把前面提到的四个宏综合了一下(并不想用它,只是作为演示及回应各位的回答),参见下面:

Sub 删除空行及段首段尾空格()
' 删除段首空格、删除段尾空格、删除空行及删除段首空格(特例)综合版——仅作演示及回应,并不想付诸应用,仍然用各自单个过程
    Dim i As Paragraph, n As Long
    For Each i In ActiveDocument.Paragraphs
        For n = 1 To i.Range.Characters.Count
' 删除段首空格
            If i.Range Like " *" Or i.Range Like " *" Or i.Range Like Chr(9) & "*" Then
                i.Range.Characters(1).Delete
' 删除段尾空格
            ElseIf i.Range Like "* " & Chr(13) Or i.Range Like "* " & Chr(13) Or i.Range Like "*" & Chr(9) & Chr(13) Then
                Do
                    i.Range.Select
                    Selection.EndKey Unit:=wdLine
                    Selection.TypeBackspace
                Loop Until Asc(i.Range.Characters(i.Range.Characters.Count - 1)) <> 32 Or Asc(i.Range.Characters(i.Range.Characters.Count - 1)) <> 9
' 删除空行(空段落)
            ElseIf Len(i.Range) = 1 Then
                i.Range.Delete
            Else
                Exit For
            End If
        Next n
' 删除段首空格(特例)
        If Left(i.Range.Text, 2) = " “" Or Left(i.Range.Text, 2) = " (" Then
            i.Range.Select
            Selection.HomeKey Unit:=wdLine
            Selection.Delete Unit:=wdCharacter, Count:=1
        End If
    Next
End Sub

Sub 一键排版()
    ActiveDocument.Content.Find.Execute findtext:="^l", replacewith:="^p", Replace:=wdReplaceAll    ' 换行符全部替换为段落标记
    ActiveDocument.Content.Find.Execute findtext:="^13", replacewith:="^p", Replace:=wdReplaceAll   ' 真假回车符全部替换为真回车符
    ActiveDocument.Content.Find.Execute findtext:=" ", replacewith:=" ", Replace:=wdReplaceAll      ' 圆圈空格全部替换为半角空格
    删除段首空格
    删除段尾空格
    删除空行
    删除段首空格_特例
    A4纵向_页面设置
    Selection.WholeStory
    清除格式
    正文样式
    标题2自动设置
    标题3自动设置
    标题1自动判断
    换行和分页
    称呼
    自动调整1
    落款预处理
    落款自动设置
    自动调整
End Sub

*** 删除空行 这个宏,经试验,只能删除纯回车符或有附带有半角空格的回车符,对于全角空格和制表符及那个伪段落标记(假回车符)均不奏效,但无妨,配合 删除段首段尾空格宏 已经能解决问题,达到目的了。但这个宏的 4 句代码,却教会了我“循环遍历段落法”这个法宝,我可以用这个方法解决一些与段落和字符有关的问题,比如:标题2、3、4自动设置,还有[第一节]加粗 的处理,均是如此,意义太重大了!所以,我称这个过程为“循环遍历法”经典代码!——此时,TRIM函数已经没用了,因为它对付不了全角空格和制表符,所以,这个第3句核心代码可以写作:If Len(i.Range) = 1 Then i.Range.Delete,但为了保持原貌,我并不想对这个宏做任何改变了。——此宏与 守柔版主 所写的一段代码类似,因为这段宏是我摘自网络,并且稍加精简,形成了简洁的 4 句代码。所以,是不是 守版 编写的不太清楚,但我是特别喜欢 i 这个一个字母的变量。

Sub 删除空行()
    Dim i As Paragraph
    For Each i In ActiveDocument.Paragraphs
        If Len(Trim(i.Range)) = 1 Then i.Range.Delete
    Next
End Sub

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2011-12-10 17:34 | 显示全部楼层
楼主,你的第一段代码,如果说不讨论诡异的回车符,也会出现乱删东西的现象。如果有图,而且图不是以嵌入型排列于文本中,就会现象删图的现象。

TA的精华主题

TA的得分主题

发表于 2011-12-11 08:14 | 显示全部楼层
本帖最后由 tangqingfu 于 2011-12-11 10:12 编辑

网文处理的确是个大工程,可能涉及到“删除多余空格”、“删除网文干扰码”、“断行续接”、“删除水印”、“删除空行”、“软回车转硬回车”、“首行缩进”“清除底纹”、“清除文本的突出显示”等问题,直接统一用一段代码直接处理,可能会出现误操作,可分为几部分,由用户根据实际情况自行结合处理为宜。

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2011-12-11 13:12 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
tangqingfu 发表于 2011-12-11 08:14
网文处理的确是个大工程,可能涉及到“删除多余空格”、“删除网文干扰码”、“断行续接”、“删除水印”、 ...

赞同tang兄的看法,越细化可能会更人性化;所以这里说的“删除空行”只是大量排版过程中的一个具体小过程而已。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2025-12-24 23:47 , Processed in 0.025112 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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