ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 修改次序混乱不同的数量单位和重复的数量单位

[复制链接]

TA的精华主题

TA的得分主题

发表于 2022-8-30 11:06 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
* 相见:你即使未要求截图,我也要截图了!请看:(如果再不运行,建议你重装安装完整版 Office2003)
   
* sylun 老师代码,建议放到标准标准 NewMacros 中,也可放在某个模块中,在 Word 2003 中运行均正常!请看下图:
syluntest2.png
   
* 下面是 sylun 老师代码,在 Word 2003 中运行后的处理结果,请认真查看!
sylundrug2.gif

TA的精华主题

TA的得分主题

发表于 2022-8-30 11:13 | 显示全部楼层
本帖最后由 413191246se 于 2022-8-30 11:15 编辑

* 相见:sylun 老师的代码就放在 Option Explicit 下面即可在 Word 2003 中正常运行!(放在单独一个模块中也可正常运行。)——如果你照着我的图片中的位置照做了,还不运行的话,请换一个 Word 2003 版本重新安装。
   
* 上图中,左图为新文档,是处理结果;右图为旧文档,是你的附件原稿。——上图左图为 sylun 老师的代码的处理结果。
  
* 如果 sylun 老师的代码,仍然不运行,建议:1、退出 Word 2003,删除默认模板重新测试;2、重新启动电脑试试;3、重新安装 Office 2003 或 2007 或 2010。

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-8-30 13:57 | 显示全部楼层
本帖最后由 相见是缘8 于 2022-8-30 14:34 编辑
413191246se 发表于 2022-8-30 11:13
* 相见:sylun 老师的代码就放在 Option Explicit 下面即可在 Word 2003 中正常运行!(放在单独一个模块中 ...

感谢老师!
啊,看了老师你的截图,才知道,“Option Explicit” 这句,是放 sylun 老师代码的最上面,且在我这个古董电脑上,要把代码,放在 “Thi sDocument” 内,终于可以了!

7.png

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-8-30 14:18 | 显示全部楼层
本帖最后由 相见是缘8 于 2022-8-30 14:30 编辑
sylun 发表于 2022-8-29 22:31
4楼程序基本是按楼主1楼截图所编,确实有错漏。这样的文本处理复杂,主要是多重要求,文档格式需要归纳总结 ...

sylun 老师好!
在 413191246se 老师的指教下,代码终于可以运行了!
中午简单测试了一下,目前,只发现2个不足:就是各×两、各×钱、……的“各”字前面,都少了一逗号。还有一个就是图片中所示。没有改为各一两。
等有空,我再好好测试!

9.png

TA的精华主题

TA的得分主题

发表于 2022-8-30 18:36 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 413191246se 于 2022-8-31 07:50 编辑

略。。。。

TA的精华主题

TA的得分主题

发表于 2022-8-30 22:18 | 显示全部楼层
相见是缘8 发表于 2022-8-30 14:18
sylun 老师好!
在 413191246se 老师的指教下,代码终于可以运行了!
中午简单测试了一下,目前,只发 ...

在原代码基础上作了修改,可再试试:
  1. Private num(0 To 99) As String
  2. Sub test3()
  3.     Dim i%, j%, k%, m%, n%, n1%, n2%, r%
  4.     Dim data$, code$, info$(), info1$(), info2$(), data1&(), data2$()
  5.     Dim RegExp As Object
  6.     Dim Match As Object
  7.     Dim RegExp2 As Object
  8.     Dim Match2 As Object
  9.    
  10.     Call NumToCnNum
  11.     data = IIf(Selection.Type = wdSelectionIP, ActiveDocument.Content.Text, Selection.Text)
  12.     code = "斤两钱分厘枚粒片"  '数量单位据此先后排序
  13.     Set RegExp = CreateObject("VBScript.RegExp")
  14.     Set RegExp2 = CreateObject("VBScript.RegExp")
  15.     With RegExp
  16.         .Global = True
  17.         .Pattern = "([用方]:|;)([^。;:]+[十九八七六五四三二一半][斤两钱分厘枚粒片])(。|,[^。;:]+?。)"
  18.         If .test(data) = False Then
  19.             MsgBox "找不到匹配,程序退出!", vbCritical
  20.             Exit Sub
  21.         End If
  22.         
  23.         For Each Match In .Execute(data)  '获取匹配方剂各药材配伍文本相关定位参数
  24.             ReDim Preserve data1(5, m)
  25.             With Match
  26.                 data1(0, m) = .firstindex
  27.                 data1(1, m) = .Length
  28.                 data1(2, m) = data1(0, m) + data1(1, m)
  29.                 data1(3, m) = .firstindex + Len(.submatches(0))
  30.                 data1(4, m) = Len(.submatches(2))
  31.                 data1(5, m) = data1(2, m) - data1(4, m) + 1
  32.             End With
  33.             m = m + 1
  34.         Next
  35.         
  36.         With IIf(Selection.Type = wdSelectionIP, ActiveDocument.Content, Selection.Range)
  37.             For i = 0 To UBound(data1, 2)
  38.                 If Selection.Type = wdSelectionIP Then
  39.                     .SetRange data1(0, i), data1(2, i)
  40.                 Else
  41.                     .SetRange Selection.Start + data1(0, i), Selection.Start + data1(2, i)
  42.                 End If
  43.                 .HighlightColorIndex = wdYellow  '在原文档突出显示匹配文本
  44.             Next
  45.         End With
  46.         
  47.         For n = UBound(data1, 2) To 0 Step -1  '按倒序处理方剂药材配伍文本
  48.             With RegExp2
  49.                 .Global = True
  50.                 For i = 1 To Len(code)
  51.                     .Pattern = "([^、:;。]+?([十九八七六五四三二一半]+)" & Mid(code, i, 1) & ")[、,。]"
  52.                     ReDim info(Len(code))
  53.                     If .test(Mid(data, data1(3, n), data1(1, n))) = True Then
  54.                         For Each Match2 In .Execute(Mid(data, data1(3, n), data1(1, n)))
  55.                             info(i - 1) = info(i - 1) & Match2.Value
  56.                             ReDim Preserve info1(3, n1)
  57.                             info1(0, n1) = Match2.submatches(0)
  58.                             info1(1, n1) = Match2.submatches(1)
  59.                             info1(2, n1) = Match2.firstindex
  60.                             info1(3, n1) = Match2.firstindex + Match2.Length
  61.                             n1 = n1 + 1
  62.                         Next
  63.                         
  64.                         For k = 99 To 0 Step -1  '对提取的药材以剂量大小进行排序
  65.                             For j = 0 To UBound(info1, 2)
  66.                                 If info1(1, j) = num(k) Then
  67.                                     ReDim Preserve info2(n2)
  68.                                     info2(n2) = info1(0, j)
  69.                                     n2 = n2 + 1
  70.                                 End If
  71.                             Next
  72.                         Next
  73.                         ReDim Preserve data2(r)
  74.                         data2(r) = data2(r) & Join(info2, "、")  '对匹配文本的中药材重新排序后的文本
  75.                         r = r + 1
  76.                         
  77.                         Erase info1
  78.                         Erase info2
  79.                         n1 = 0
  80.                         n2 = 0
  81.                     End If
  82.                 Next
  83.             End With
  84.             
  85.             For i = 1 To Len(code)  '处理判断为相同数量及单位的药材
  86.                 If Join(data2, "") <> Empty Then
  87.                     For j = 0 To UBound(data2)
  88.                         With RegExp2
  89.                             .Pattern = "([^、;。]+?)◆?各?([十九八七六五四三二一半]+" & Mid(code, i, 1) & ")、([^、。]+?)◆?各?\2([、,。]|$)"
  90.                             If InStr(data2(j), Mid(code, i, 1)) Then
  91.                                 Do While .test(data2(j)) = True
  92.                                     data2(j) = .Replace(data2(j), "$1◇$3◆各$2$4")  '此处与原处理要求有所不同
  93.                                 Loop
  94.                                 .Pattern = "◇"
  95.                                 data2(j) = .Replace(data2(j), "、")
  96.                                 .Pattern = "◆"
  97.                                 data2(j) = .Replace(data2(j), ",")
  98.                             End If
  99.                         End With
  100.                     Next
  101.                 End If
  102.             Next
  103.             If Join(data2, "") <> Empty Then
  104.                 data = Left(data, data1(3, n)) & "△" & Join(data2, "、") & Mid(data, data1(5, n), data1(4, n)) & "▲" & Mid(data, data1(2, n) + 1)
  105.             End If
  106.             
  107.             Erase info
  108.             Erase data2
  109.             r = 0
  110.         Next
  111.         
  112.         With Documents.Add(ActiveDocument.FullName).Content.Find
  113.             .Parent.Text = data  '将处理结果输出到以原文档为模板的新文档
  114.             .Replacement.Highlight = True
  115.             .Execute "△*▲", MatchWildcards:=True, Replace:=wdReplaceAll
  116.         End With
  117.     End With
  118.     MsgBox "共处理了" & m & "条,处理条目见原文档标记、结果文本见新文档突出显示部分。"
  119. End Sub


  120. Sub NumToCnNum()
  121.     '生成百位内汉字小写数字
  122.     Const a As String = "一二三四五六七八九"
  123.     Dim i%
  124.    
  125.     For i = 1 To 99
  126.         Select Case i
  127.         Case Is >= 20
  128.             If i Mod 10 > 0 Then
  129.                 num(i) = Mid(a, Int(i / 10), 1) & "十" & Mid(a, i Mod 10, 1)
  130.             Else
  131.                 num(i) = Mid(a, Int(i / 10), 1) & "十"
  132.             End If
  133.         Case Is > 10
  134.             num(i) = "十" & Mid(a, Int(i Mod 10), 1)
  135.         Case Is < 10
  136.             num(i) = Mid(a, i, 1)
  137.         Case Else
  138.             num(i) = "十"
  139.         End Select
  140.     Next
  141.     num(0) = "半"
  142. End Sub
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-8-31 06:25 | 显示全部楼层
sylun 发表于 2022-8-30 22:18
在原代码基础上作了修改,可再试试:

sylun 老师好!
你的水平真是大师级别!凡是疑难问题,只要你一出手,没有解决不了的,佩服之至!
代码在 “附件” 上,测试完美!感谢!
因这几天公司仓库盘货,比较忙,等有空我再在真正的大文档上测试。

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-8-31 07:45 | 显示全部楼层
413191246se 发表于 2022-8-30 18:36
* 相见:sylun 老师的代码,在我的笔记本电脑中,只须放在 Word 2003 中的标准模块 NewMacros 中,或其它模 ...

413191246se老师好!
在我这个古董电脑上,sylun 老师的这个代码,一定要放在该替换文挡下属的“Thi sDocument”内,才可以正常运行,放在标准模块 “NewMacros”,或某个“模块”内,反复试了,代码都运行不了,都会弹出提示框:编译错误:子过程或函数未定义。这个不知是啥原因造成的?
你建议我文档一篇、一篇地修改,不要求多,不然学不会、记不住,也没什么用。
我知道你是为我这方面的长进设想!对你和老师们的一直帮助,我心里感激!因目前帮我弟弟,整理的这6、7本电子书,文档都较大(小的有9百多页、大的有3千多页),且他要得较急(小孩子脾气),如把文档分割成小文档一篇、一篇地整理,恐怕要几个月的时间。
再说:学会、记住这东西,唉!真难!说句实话,心里想,可迫于生活的压力,又很难真正地很下心、静下心来学这个,也只能是临时抱你和老师们的佛脚!头痛医头、脚痛医脚!

另外,你的这个代码,我刚简单测试了一下,好像没有什么变化。

TA的精华主题

TA的得分主题

发表于 2022-8-31 07:50 | 显示全部楼层
本帖最后由 413191246se 于 2022-8-31 09:25 编辑

* 天呢!—— sylun 老师的第 3 版代码,处理结果百分之百正确无误!处理速度约 0.18 秒(大约在 0.15秒-0.21秒之间)!
   
* 我的第 3 版代码,处理结果不敢说百分之百,处理速度约 4.30 秒,差距 23 倍!
   
* 编程水平 sylun 老师 是 天!我是 地!差距可谓“天壤之别”!——从今天起,我决定新建一个 sylun 文件夹,专门存放老师的代码。以前也有保存,但多数读不太懂,就没怎么重视及学习。
   
* 另外,现在我自感我的编程水平仅仅只比录制宏高一点点。还有,VBA 的许多重要技巧,如:数组(一知半解)、函数(一知半解)、正则、字典等,我都不懂,得向老师学习。
     

---------
* 相见:你好!——我之所以说让你一篇一篇地修改,不要贪多,主要是因为,我的代码运行太慢(处理结果也不敢保证百分之百正确)。今天早上,我上网看到 sylun 老师的第 3 版代码,测试之后 ,发现处理结果百分之百正确无误!处理速度之快是我的代码的 23 倍!(看来,我也要学习学习正则了!)
* 请将我的代码删除吧!我自己也不想保存了。既然代码能在你电脑上的本文档模块“This Document”中运行,你就用 sylun 老师的代码吧!并请你及你弟注意保存原始文档(打包后测试,WinRAR 可选择:最好 + 固实 + 测试 + 锁定,或建立一个文件夹叫“原始文档”,复制一份后放在“处理文档”文件夹中)。

TA的精华主题

TA的得分主题

发表于 2022-8-31 11:00 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
相见:我的代码应该放在 NewMacros 模块中(或单独模块),因为,对象是 ActiveDocument。但现在不用了,你还是用 sylun 老师的吧!(老师的代码是珍宝,我的代码是垃圾,我已经全部删除了。)
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-22 06:34 , Processed in 0.036922 second(s), 7 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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