不称深度指南,只愿浅度指北
之前,用 VBA 开发了一个 Excel 插件「浅北表格助手」,随后,也发了两篇关于WordVBA 的教程,后台有小伙伴留言,说希望看到一些偏实用的代码。今天,它来了。
我们在写 Word 文档时,很多情况下,都需要引用其他地方的文字,比如网上的一段话,或者某个 PDF 文档中的一句话。 你可以用复制的方式,或者使用 OCR 进行识别。 但通常,你会发现,这些粘贴过来的文字的格式都乱了: 比如上图中的这些问题:
我们在写 Word 文档时,很多情况下,都需要引用其他地方的文字,比如网上的一段话,或者某个 PDF 文档中的一句话。 你可以用复制的方式,或者使用 OCR 进行识别。 但通常,你会发现,这些粘贴过来的文字的格式都乱了: 比如上图中的这些问题:
1. 存在大量的空行
2. 同样是英文单词,有的字符前后有空格,而有的却没有
3. 使用全角空格以达到段首缩进的目的,但做法错误
4. 还有一些中英标点存在错误。
如果文字数不多还好办,但如果文字数比较多,一个个修改就很麻烦了。 而稍懂一点 Word 的人,可能会用查找与替换工具,对一些空行直接删除: 而遇到中英文标点符号错误,查找和替换就稍显笨拙了: 因为标点会有很多,逗号、句号、分号等等,而且需要一一对应。 另外,遇到那些本不应该换行的却换了行,只好一个个手动删除: 其实,使用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
`` 统一空格使用规范 删除无效空格 如果是英文环境,半角空格作为每个单词的分隔符,是不能全部删除的,我们要做的就是,查找那些连续的空格,然后替换为一个空格就可以了。 注意使用通配符。 而代码则是: 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识别 清除恶意换段 对于那些不应该换行但换行的,我称其为「恶意换行」,比如下面这种: 我们同样可以通过查找替换完成,我们可以将那些「段尾不是特定的结束符号」的段落标记删除,也就是查找「([!!?。……:;”)}】])^13」,替换「\1」。 这里需要注意的是,需要使用「^13」而不是「^p」,因为勾选了使用通配符,^p已经失效了,这个在我之前的文章有介绍。 当然,恶意换行也区分中英文,而这个都是可以通过录制来完成的,这部分就不放代码了,如果你对此有兴趣,可以在我的公众号后台回复「WV01」,获取学习。 犹记被错误标点坑害的论文 中英标点替换 我们从其他地方复制到Word中的文字,有时会出现中英标点错位的情况,尤其是在使用OCR工具时。 并且,这些错误使用的标点,很难一眼看出来,比如下面的这个‘号: 如果我不标注,换个字体,你可能根本看不出来,但甲方可能一眼就瞧出来。 当然,应对这种错误,我们同样可以使用替换功能,但标点符号比较多,而且需要一一对应,因此,我们需要替换多次才可以完成。 而在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站搜索「未央暮城」,里面有一集我自己录制的视频教程,就讲的这个。 ▼ 往期精彩回顾 ▼ —— THE END —— 百年修得同船渡,点个在看也很酷