本帖最后由 duquancai 于 2016-11-10 20:43 编辑
一直以来,大家都熟悉WordVBA中可以创建正则对象,利用强大的正则表达式来处理字符,但是大家都熟悉Word文档都是含有诸多的格式、样式以及表格等,虽然这个正则对象是处理字符串之王,但是苦于只能处理“纯文本”,大家既爱又恨! 鉴于以上情况,本帖就是要解决WordVBA中大家既爱又恨正则对象,本帖解决在Word文档含有诸多的格式、样式以及表格等而不改变这些格式、样式及表格等前提下在WordVBA中创建正则来解决两大类型问题:1、修改格式,2、查找并替换字符 前条件:在Word文档含有诸多的格式、样式以及表格等,以下代码在不对原文档做修改下进行。1、修改格式
分享到新浪微博 3楼 duquancai 楼主 2016-11-10 19:05
本帖最后由 duquancai 于 2016-11-10 19:21 编辑
引用: cuteword 发表于 2016-11-10 18:11 感谢龚老师的提醒!我测试了一下:Word文档中有表格、有字符格式、有自选图形(浮动式自选图形)、有嵌入式图片、有浮动式图片等,替换位置有这些对象,查找替换也不会有影响。 原因:第一个for each循环是按照遍历段落,在所有的段落中查找得到多个range对象并重新定义的range对象变量,并把查找到的所有的range对象按照循序储存到一个集合;第二个for j循环是逐个从集合中取出之前查找到的range对象并逐个替换查找到的range对象。不会有任何的影响啊? 顺便更正以下:这句定义变量 Dim i%, mt, oRang As Range, n%, m% 由于笔误,i变量不是整型变量,是段落对象。现把这句更正为:Dim i As Paragraph, mt, oRang As Range, n%, m% 查找替换原理: 将一个 Range 对象变量设置为等于另一个 Range 对象变量 下列指令(语句)将名为 Range2 的区域变量设为与 Range1 代表的位置相同。 Set Range2 = Range1 '译为:设置Range2对象与 Range1 代表的位置相同 现在两个变量代表同一区域。修改 Range2 的起点、终点或其中的文本将影响 Range1,反之亦然。4楼 413191246se LV5 2016-11-19 21:54
____杜先生 你好!
____真心地说,你是最近一段时间以来最高水平的在线正则专家了!名符其实,实至名归! ____最近看到 守柔版主 的一篇测试文章,说正则比普通查找快74倍!此帖发布好多天了,无奈我未引起重视,因为我看不懂你的正则代码。刚才试验一番,发现你的代码中除正则部分外,还在用 For Each...Next 循环。这个循环确实好,以前我把它奉为至宝,但最近我觉得在 Word 查找和替换操作中,Do While...Loop 循环 查找操作比较好,感觉会比 For Each...Next 循环快,如果头部换上正则,是不是更快呢? ____下面我献上最近的拙作《第一条》代码,请 杜先生 修改一下(加个正则表达式的头部 Do While...Loop 循环):
5楼 413191246se LV5 2016-11-19 22:07
补:杜先生,守柔版主 文章中说,查找时用域(Range)会比用 Selection 对象慢一些,我实测后感觉也是如此,杜先生认为呢?(我看 杜先生 代码中都是用 0Rang 域的。)
6楼 duquancai 楼主 2016-11-19 22:35
本帖最后由 duquancai 于 2016-11-19 22:37 编辑
引用: 413191246se 发表于 2016-11-19 21:54 我并不是热衷于for 循环,其实我也很喜欢do循环。我有些回帖使用的就没有遍历每一个段落(直接整个文档作为的目标文本),原因如下: 用正则的时候 1、word文档中,如果有表格并且需要查找的内容有可能会在表格中,使用正则时 那么就得遍历每一个段落(包括表格中的单元格中的每个段落)以每一个段落作为“目标文本”,否则在整个文档中(这是候目标文本为整个文档)使用正则查找到的是在表格中的字符“位置定位就定位不准了!所以要遍历每一个段落!”。 2、如果Word文档中无表格或者说就算有表格但是需要查找的内容根本不可能在表格中出现,那么就不用遍历文档中的每一个段落了,直接把“整个文档当做目标文本进行查找”,我想在这种情况下正则查找要快很多!这也是其中一个原因吧! 7楼 duquancai 楼主 2016-11-19 22:42
本帖最后由 duquancai 于 2016-11-19 22:45 编辑
引用: 413191246se 发表于 2016-11-19 22:07 你可能误会了,我并没有用“域”,那是用的range对象变量。其实我个人:不太喜欢selection对象和select方法,我跟热衷于range对象。但是调试程序和学习其它对象、方法、属性的时候,用selection对象和select方法是比较好的,如果熟悉了,我认为没必要用selection对象和select方法,但是有时候也不得不用!!! 8楼 duquancai 楼主 2016-11-19 23:01引用: 413191246se 发表于 2016-11-19 21:54 如果Word文档中无表格或者说就算有表格但是需要查找的内容根本不可能在表格中出现,代码可以:
9楼 duquancai 楼主 2016-11-19 23:44引用: 413191246se 发表于 2016-11-19 21:54 不好意思,我没注意看你的代码,你不但修改了格式还添加了字符,不过你使用的通配符查找。要是比如“第一条”这个是在文档首,且“第一条”之前没有回车符,你的代码是应该查找不到的。正则能够弥补Word通配符的不足,所以我喜欢正则,呵呵!我重新写了一个代码,你测试:
|
|