ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[原创] WordVBA中字符串查找替换进阶

  [复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-11-20 13:46 | 显示全部楼层
小花鹿 发表于 2016-11-20 13:33
i.Range.Text
我试了,去掉Text也行,不知有什么区别
是不是i.Range代表段落中的文本,图片,图表,等等 ...

是的   i.Range代表段落中的文本 默认属性就是Text    类比Excelvba中  range("a1") 和range("a1").Value

评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2016-11-21 09:36 | 显示全部楼层
Sub Word文档中修改格式()
   Dim mt, oRang As Range, n%, m%, act As Range
   Set act = ActiveDocument.Content '把整个文档区域赋值个range对象变量act
   With CreateObject("vbscript.regexp")
      .Pattern = "^第[^条]+条" '这里各显其能输入正则表达式(根据自己的需求)
      .Global = True: .MultiLine = True: '.IgnoreCase = False
      For Each mt In .Execute(act.Text) '整个文档内容作为“目标文本”进行查找
         m = mt.FirstIndex: n = mt.Length
         Set oRang = ActiveDocument.Range(act.Start + m, act.Start + m + n)
         oRang.Bold = True '字符加粗,有一系列的修改格式(根据自己的需求)
      Next
   End With
End Sub
这段代码定位不准确,换成replace(act.text,chr(7),"")就行了

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-11-21 14:27 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
小花鹿 发表于 2016-11-21 09:36
Sub Word文档中修改格式()
   Dim mt, oRang As Range, n%, m%, act As Range
   Set act = ActiveDocume ...

如果文档中只由表格和文本部分构成,你这样把chr(7)字符替换后把整个文档作为“目标文本”来查找修改格式,这样没问题,比如这个代码如下(用一个中间字符串变量):Sub 修改格式或者提取字符()
   Dim mt, oRng As Range, n&, m&, str$
   str = Replace(ActiveDocument.Content, Chr(7), "")
   With CreateObject("vbscript.regexp")
      .Global = True: .IgnoreCase = False: .MultiLine = True
      .Pattern = "重庆" '正则表达式
      For Each mt In .Execute(str)
         m = mt.FirstIndex: n = mt.Length
         Set oRng = ActiveDocument.Range(m, m + n)
         oRng.Font.ColorIndex = 6 '设置格式或者提取字符S=oRng.Text
      Next
   End With
End Sub

如果文档中(除了表格外,有还是没有都无所谓,因为替换了chr(7)字符,表格不会影响了!实际上单元格结束符由chr(13)和chr(7)构成的整体,正则会把单元格“结束符”计算为2个字符,而rangge对象中计算为1个字符)还有“域”对象,也有可能含有其他对象“目录,也是域”、节对象的某些子对象(比如:分隔符等),这时候还是已整个文档为“目标文本”,同样面临定位不准的情况!!!
所以最为理想的还是遍历所有段落(排不排除表格,看具体情况)把每一段作为“目标文本”较为稳妥,只是要牺牲速度作为代价!!!

TA的精华主题

TA的得分主题

发表于 2016-11-21 22:50 | 显示全部楼层
所以最为理想的还是遍历所有段落(排不排除表格,看具体情况)把每一段作为“目标文本”较为稳妥,只是要牺牲速度作为代价!!!
好的,记住了,我也觉得遍历所有段落比较好,谢谢

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-11-22 00:51 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
小花鹿 发表于 2016-11-21 22:50
所以最为理想的还是遍历所有段落(排不排除表格,看具体情况)把每一段作为“目标文本”较为稳妥,只是要牺 ...

正如2楼龚老师所说的那样。龚老师是研究多年的word高手中的高手,我曾经得到他的帮助,在此真诚的感谢龚老师!
在word中使用正则的时候下列三大类型的对象将对正则定位造成影响:
1、word表格类:这个类型已经解决,解决方案:那就是用中间变量替换掉chr(7)字符,把整个文档作为“目标字符串”,这类完全解决。
2、word图形、图片类:这类对象,如果为浮动式将造成正则的定位不准,解决方案:把这类对象全部转换成“嵌入式”,再用正则可以定位准确。
    对于这类对象,谁有敢保证所有的都是嵌入式呢?就算都转为了嵌入式,这将对原文档的结构造成影响,因此如果有这类对象,正则慎用!
3、word域类:这个大类同样会造成正则的定位不准,解决方案:把域全部显示出来(有域大括号那种)或者解除域,再用正则可以定位准确。
      对于这类对象,同样的,正则慎用!
      其余word对象暂未发现会造成正则的定位不准!




TA的精华主题

TA的得分主题

发表于 2016-11-22 09:03 | 显示全部楼层
duquancai 发表于 2016-11-22 00:51
正如2楼龚老师所说的那样。龚老师是研究多年的word高手中的高手,我曾经得到他的帮助,在此真诚的感谢龚 ...

这样看来,用WORD的查找替换是不是保险一点?

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-11-22 09:37 | 显示全部楼层
小花鹿 发表于 2016-11-22 09:03
这样看来,用WORD的查找替换是不是保险一点?

是的,但是只要具备上述条件,正则也行啊!具体情况得具体分析。尤其是纯文本(当然还有表格也无所谓),这种只含有表格的Word文档还是很多的!!!

TA的精华主题

TA的得分主题

发表于 2016-11-22 11:36 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
还有没有后续?等着呢

TA的精华主题

TA的得分主题

发表于 2016-11-22 11:40 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
问个问题,正则能不能完全替代WORD中的查找替换?

TA的精华主题

TA的得分主题

发表于 2016-11-30 16:08 | 显示全部楼层
在excel中用vba编辑word文件时,第一次运行替换的代码可以运行,但是第二次运行时显示“Run-time error '462': The remote server machine does not exist or is unavailable”,以下是在Microsoft找到的解释
Visual Basic has established a reference to Word due to a line of code that calls a Word object, method, or property without qualifying it with a Word object variable. Visual Basic does not release this reference until you end the program. This errant reference interferes with automation code when the code is run more than once.
大伙知道怎么解决吗?
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

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

GMT+8, 2024-4-26 17:43 , Processed in 0.035592 second(s), 7 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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