word如何删除空行和全角空格_Word宏丨空格、空行还在一个个删?用这个一键搞定!...

不称深度指南,只愿浅度指北 之前,用 VBA 开发了一个 Excel 插件「浅北表格助手」,随后,也发了两篇关于WordVBA 的教程,后台有小伙伴留言,说希望看到一些偏实用的代码。今天,它来了。
我们在写 Word 文档时,很多情况下,都需要引用其他地方的文字,比如网上的一段话,或者某个 PDF 文档中的一句话。 你可以用复制的方式,或者使用 OCR 进行识别。 但通常,你会发现,这些粘贴过来的文字的格式都乱了: d48d91365357e340f7c90cea1f690731.png 比如上图中的这些问题:

1. 存在大量的空行

2. 同样是英文单词,有的字符前后有空格,而有的却没有

3. 使用全角空格以达到段首缩进的目的,但做法错误

4. 还有一些中英标点存在错误。

如果文字数不多还好办,但如果文字数比较多,一个个修改就很麻烦了。 而稍懂一点 Word 的人,可能会用查找与替换工具,对一些空行直接删除:

ae02528e32e78ab90dbea1e1436a9dce.png

而遇到中英文标点符号错误,查找和替换就稍显笨拙了:

2ce0364e00f36024ddd937960271cd57.png

因为标点会有很多,逗号、句号、分号等等,而且需要一一对应。 另外,遇到那些本不应该换行的却换了行,只好一个个手动删除: 89794534797bdff464d258c69fb5912a.png 其实,使用VBA,就可以将这些动作组合在一起,帮你完成这样的操作。  大众都需要  删除空行 有时,我们为了区分文字来源于不同的部分,可能会手动敲几个回车,或者在其他地方复制的文本,本身就有一些空行,而我们文档编辑最后,需要将这些空行删除。 我们可以查找「^p^p」替换为「^p」,然后多次重复这个替换过程,就可以将所有空行删除了。 当然,更好的做法是,判断每段是否只有一个字符(换行符),避免了需要多次替换的问题。 代码: ``` Sub 转换并删除空行()    If Selection.Type = wdSelectionIP Then         If MsgBox("此操作将删除文中所有空行,请确认!", vbOKCancel) = vbOK Then             Selection.WholeStory         Else             Exit Sub          End If     End If     Application.ScreenUpdating = False     For Each i In Selection.Paragraphs '在活动文档的段落集合中循环         If Len(i.Range) = 1 Then '判断段落长度             i.Range.Delete             n = n + 1 '计数         End If     Next     Application.ScreenUpdating = True '恢复屏幕更新

    MsgBox "共删除空白段落" & n & "个!"End Sub

``  统一空格使用规范  删除无效空格 如果是英文环境,半角空格作为每个单词的分隔符,是不能全部删除的,我们要做的就是,查找那些连续的空格,然后替换为一个空格就可以了。

c9012bb75fa1a4c827061bc0cfd14e15.png

注意使用通配符。 而代码则是: Sub 删除连续空格() If Selection.Type = wdSelectionIP Then     MsgBox "请选定一个区域!" Else     Application.ScreenUpdating = False '关闭屏幕更新     '替换半角空格     Selection.Find.ClearFormatting     Selection.Find.Replacement.ClearFormatting     With Selection.Find         .Text = "[ ]{2,}"         .Replacement.Text = " "         .Forward = True         .Wrap = wdFindStop    '如未找到则停止搜索         .Format = False         .MatchCase = False         .MatchWholeWord = False         .MatchByte = False         .MatchAllWordForms = False         .MatchSoundsLike = False         .MatchWildcards = True ’使用通配符     End With     Selection.Find.Execute Replace:=wdReplaceAll     ‘这里省略了全角空格和两者夹杂的部分     Application.ScreenUpdating = True '恢复屏幕更新 End If End Sub 当然,删除全部空格,就更简单了,这里不再赘述。  多 见于O CR识别  清除恶意换段 对于那些不应该换行但换行的,我称其为「恶意换行」,比如下面这种: 64b75c87e97fdd3d71444bdbd95cc2bd.png 我们同样可以通过查找替换完成,我们可以将那些「段尾不是特定的结束符号」的段落标记删除,也就是查找「([!!?。……:;”)}】])^13」,替换「\1」。

5813928593eff3d7d8e14891da731b94.png

这里需要注意的是,需要使用「^13」而不是「^p」,因为勾选了使用通配符,^p已经失效了,这个在我之前的文章有介绍。 当然,恶意换行也区分中英文,而这个都是可以通过录制来完成的,这部分就不放代码了,如果你对此有兴趣,可以在我的公众号后台回复「WV01」,获取学习。  犹记被错误标点坑害的论文  中英标点替换 我们从其他地方复制到Word中的文字,有时会出现中英标点错位的情况,尤其是在使用OCR工具时。 并且,这些错误使用的标点,很难一眼看出来,比如下面的这个‘号: 3826e56b1f27c4ac1ac819c8a7dbbf65.png 如果我不标注,换个字体,你可能根本看不出来,但甲方可能一眼就瞧出来。 0588dec6f8ce3c2af0b652bebb2a3e86.png 当然,应对这种错误,我们同样可以使用替换功能,但标点符号比较多,而且需要一一对应,因此,我们需要替换多次才可以完成。 而在VBA中,我们可以使用数组和循环来很好地解决这个问题: Sub 中英标点互转() Dim ChineseInterpunction() As Variant, EnglishInterpunction() As Variant Dim myArray1() As Variant, myArray2() As Variant, strFind As String, strRep As String Dim msgResult As VbMsgBoxResult, n As Byte ChineseInterpunction = Array(",", "。", "、", ";", ":", "?", "!", "……", "—", "~", "(", ")", "《", "》", "¥")  '定义一个中文标点的数组对象 EnglishInterpunction = Array(",", ".", ",", ";", ":", "?", "!", "…", "-", "~", "(", ")", "", "$") '定义一个英文标点的数组对象 '如果为英转中,会出现,→、和,→,两种情况,大多数为第二种 '因此,将第二种方式放在前面先转换,第一种情况就不会出现 msgResult = MsgBox("您正在使用中英标点互换功能,按Y将中文标点转为英文标点,按N将英文标点转为中文标点!退出请点击右上角关闭按钮", vbYesNoCancel) Select Case msgResult     '通过调整两数组的先后顺序,以实现中英标点互换     Case vbCancel         Exit Sub '如果用户选择了取消按钮,则退出程序运行     Case vbYes         myArray1 = ChineseInterpunction         myArray2 = EnglishInterpunction         strFind = "“(*)”"         strRep = """\1"""     Case vbNo         myArray1 = EnglishInterpunction         myArray2 = ChineseInterpunction         strFind = """(*)"""         strRep = "“\1”" End Select Application.ScreenUpdating = False '关闭屏幕更新 If Selection.Type = wdSelectionIP Then     If MsgBox("此操作将应用至整个文档,请确认!", vbOKCancel) = vbOK Then         Selection.WholeStory     Else         Exit Sub     End If End If For n = 0 To UBound(ChineseInterpunction) '从数组的下标到上标间作一个循环     With Selection.Find         .ClearFormatting '不限定查找格式         .MatchWildcards = False '不使用通配符         '查找相应的array1的标点,替换为对应的array2的标点         .Execute FindText:=myArray1(n), replacewith:=myArray2(n), Replace:=wdReplaceAll     End With Next '替换引号部分 With Selection.Find     .ClearFormatting '不限定查找格式     .MatchWildcards = True '使用通配符     .Execute FindText:=strFind, replacewith:=strRep, Replace:=wdReplaceAll End With Application.ScreenUpdating = True '恢复屏幕更新 End Sub 最后的叨逼叨 以上,就是我们日常中见到最多的格式错误问题了,如果你也有这样的困境,可以后台回复「WV01」下载我制作的VBA代码。 当然,如果你不会用,可以在B站搜索「未央暮城」,里面有一集我自己录制的视频教程,就讲的这个。 ▼ 往期精彩回顾 ▼

bffe1fcc5e44eea05f43a1f46f70efc9.png

1de138ce6d1c25640cdbc7843ceae2f1.png

—— THE END ——

09ec2eb83a059069774cf281f0e491dd.gif

百年修得同船渡,点个在看也很酷 fa0c8de139eb326794abe2801da839bd.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值