ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: 相见是缘8

[求助] 多处关键字符替换,要么很慢,要么死机!

[复制链接]

TA的精华主题

TA的得分主题

发表于 2021-3-31 21:12 | 显示全部楼层
估计楼主没有我的联系方式,因为没有时间完善代码,就先把代码贴上来,里面标注了存在的问题。代码比较简单,如果楼主有一点编程基础,应该可以读懂,如果没有,我很难教会您。

基于xml的快速替换.7z

1.23 KB, 下载次数: 37

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-4-1 07:29 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
z9bhd 发表于 2021-3-31 15:43
打开“测试的文档.doc”,把代码复制进去运行就可以了,你是不是打开了“替换的关键字符”的文档?

老师好!
按你教的还是不成,请看图:
图.png
图片.png

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-4-1 07:31 | 显示全部楼层
本帖最后由 相见是缘8 于 2021-4-3 06:21 编辑
  1. Sub RepXml(FindStr() As String, RepStr() As String)
  2. '替换过程开始前,需要根据替换关键词排序:被包含的放在后面,替换的关键词位置相应变动!请自己完善
  3. Dim i As Long
  4. Dim j As Long
  5. Dim p As Long
  6. Dim repNum As Long
  7. Dim XmlPart() As String
  8. Dim ParaPart() As String
  9. Dim ParaNum As Long
  10. Dim ParaStr As String
  11. Dim NewStr As String
  12. Dim txtPart() As String
  13. Dim PartNum As Long
  14. Dim StartIndex As Long
  15. Dim repLen As Long
  16. Dim DblZeroChar As String
  17. Dim ZeroChar As String
  18.     ZeroChar = ChrW$(0)
  19.     DblZeroChar = ZeroChar & ZeroChar
  20.     repNum = UBound(FindStr)
  21.     ParaPart = Split(ActiveDocument.Range.XML, "</w:p>")
  22.     ParaNum = UBound(ParaPart) - 1
  23.     For p = 0 To ParaNum
  24.         XmlPart = Split(ParaPart(p), "</w:t>")
  25.         If UBound(XmlPart) > 0 Then
  26.             PartNum = UBound(XmlPart) - 1
  27.             ReDim txtPart(PartNum) As String
  28.             For i = 0 To PartNum
  29.                '替换过程中特殊字符,主要是<>&,还有些其它字符,需要处理:先替换为正常的;,后替换回来"<", "<";">", ">";"&", "&,请自己完善
  30.                 txtPart(i) = Right$(XmlPart(i), Len(XmlPart(i)) - InStrRev(XmlPart(i), ">"))
  31.             Next
  32.             ParaStr = Join(txtPart, "")
  33.             For i = 0 To repNum
  34.                 If InStr(ParaStr, FindStr(i)) > 0 Then
  35.                     repLen = Len(FindStr(i))
  36.                     NewStr = Replace$(ParaStr, FindStr(i), String$(repLen, ZeroChar))
  37.                     StartIndex = 1
  38.                     For j = 0 To PartNum
  39.                         txtPart(j) = Mid$(NewStr, StartIndex, Len(txtPart(j)))
  40.                         StartIndex = StartIndex + Len(txtPart(j))
  41.                         Do While InStr(txtPart(j), DblZeroChar)
  42.                             txtPart(j) = Replace$(txtPart(j), DblZeroChar, ZeroChar)
  43.                         Loop
  44.                     Next
  45.                     txtPart(0) = Replace$(txtPart(0), ZeroChar, RepStr(i))
  46.                     For j = 1 To PartNum
  47.                         If Left$(txtPart(j), 1) = ZeroChar And Right$(txtPart(j - 1), 1) = ZeroChar Then
  48.                             txtPart(j) = Right$(txtPart(j), Len(txtPart(j)) - 1)
  49.                         End If
  50.                         txtPart(j) = Replace$(txtPart(j), ZeroChar, RepStr(i))
  51.                     Next
  52.                     ParaStr = Join(txtPart, "")
  53.                 End If
  54.             Next
  55.             For i = 0 To PartNum
  56.                 If Left$(txtPart(i), 1) = " " Then
  57.                     XmlPart(i) = Left$(XmlPart(i), InStrRev(XmlPart(i), "><")) & "<w:t xml:space=""preserve"">" & txtPart(i)
  58.                 Else
  59.                     XmlPart(i) = Left$(XmlPart(i), InStrRev(XmlPart(i), ">")) & txtPart(i)
  60.                 End If
  61.             Next
  62.             ParaPart(p) = Join(XmlPart, "</w:t>")
  63.         End If
  64.     Next
  65.     ActiveDocument.Range.InsertXML Join(ParaPart, "</w:p>")
  66. End Sub
  67. Sub testRep()
  68. Dim FindStr() As String
  69. Dim RepStr() As String
  70. FindStr = Split("大枣_|_亦_|_盖_|_钱,_|_钱半,_|_克,_|_枚,_|_两,_|_两半,_|_》日_|_曰._|_曰,_|_曰,_|_曰;_|_曰∶_|_曰:_|_曰︰_|_曰。_|_曰:_|_曰_|_∶_|_%_|_-_|_~_|_(_|_)_|_。)_|_ )_|_(", "_|_")
  71. RepStr = Split("红枣_|_也_|_凡_|_钱、_|_钱半、_|_克、_|_枚、_|_两、_|_两半、_|_》曰_|_曰_|_曰_|_曰_|_曰_|_曰_|_曰_|_曰_|_曰_|_曰_|_曰:_|_:_|_%_|_~_|_~_|_(_|_)_|_)。_|_)_|_(", "_|_")
  72. RepXml FindStr, RepStr
  73. End Sub

复制代码

cuteword 发表于 2021-3-31 21:12
估计楼主没有我的联系方式,因为没有时间完善代码,就先把代码贴上来,里面标注了存在的问题。代码比较简单 ...


龚老师好!
万分感谢你抽时间写的代码!代码替换速度真是飞快,十几秒就搞定!我没有你的联系方式,也没有编程基础,只会一点手动替换,你的代码和论坛上老师的代码绝大多数看不懂,只能靠网上搜,但很少搜到带中文注释的,再一个是迫于生活的压力,很难静下心来持久的学这个东西,所以总是门外汉,遇到问题只能一次又一次的向老师们求助!

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-4-1 07:49 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
tcdatongye 发表于 2021-3-31 17:40
做成替换的表格并加以说明,有的有空格,有的没有空格不知什么东西

曰,        曰       

老师好!
我上传的 “替换的关键字符” 文档内,把需求作了说明,就是把左边红色 29 组不同的字符,替换为右边蓝色 29 组不同的字符。查找的字符前后带空格的,也作了说明。

TA的精华主题

TA的得分主题

发表于 2021-4-1 08:24 | 显示全部楼层
相见是缘8 发表于 2021-4-1 07:29
老师好!按你教的还是不成,请看图:

image.png 检查一下“测试的文档.doc”与“替换的关键字符.doc”是否在同一文件?

image.png 在我电脑上运行通过,且只需4.2秒左右

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-4-1 09:04 | 显示全部楼层
z9bhd 发表于 2021-4-1 08:24
检查一下“测试的文档.doc”与“替换的关键字符.doc”是否在同一文件?

在我电脑上运行通过,且只需4. ...

老师,你问的:
文档.doc”与“替换的关键字符.doc”是否在同一文件?
是啥意思?
我把“测试的文档.doc”和“替换的关键字符”的文档,放在同一个文件夹内,2个文件都打开或只打开“测试的文档.doc”都试了。
再把“测试的文档.doc”,另外复制出来,打开也试了,结果都如我22楼的图片一样。

TA的精华主题

TA的得分主题

发表于 2021-4-1 11:15 | 显示全部楼层
相见是缘8 发表于 2021-4-1 09:04
老师,你问的:
文档.doc”与“替换的关键字符.doc”是否在同一文件?
是啥意思?

你的代码复制在什么位置?能不能截图看看?怎么在我这里运行的好好的到你哪就不行了?

TA的精华主题

TA的得分主题

发表于 2021-4-1 11:17 | 显示全部楼层
相见是缘8 发表于 2021-4-1 09:04
老师,你问的:
文档.doc”与“替换的关键字符.doc”是否在同一文件?
是啥意思?

文档.doc”与“替换的关键字符.doc”是否在同一文件夹,漏掉了一个字,不好意思

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-4-1 18:17 | 显示全部楼层
z9bhd 发表于 2021-4-1 11:15
你的代码复制在什么位置?能不能截图看看?怎么在我这里运行的好好的到你哪就不行了?

老师好!
图1的代码,是放在 “Normal” 内 “模块” 下面的 NewMacros 内。
图2、3的代码,都是放在 “Normal” 内 “模块” 下面,插入的 “模块” 1 内。
两处都试了,不知什么原因,都运行不了!
图1.png
图2.png
图3.png

TA的精华主题

TA的得分主题

发表于 2021-4-1 18:49 | 显示全部楼层
相见是缘8 发表于 2021-4-1 18:17
老师好!图1的代码,是放在 “Normal” 内 “模块” 下面的 NewMacros 内。图2、3的代码,都是放在 “Nor ...

复制到的位置不对,看到下面那个“测试的文档”了吧?在“word"图标上点一下,再插入模块,或双击再把代码粘贴进去试试
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-20 19:30 , Processed in 0.046551 second(s), 7 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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