ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

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

[复制链接]

TA的精华主题

TA的得分主题

发表于 2022-8-18 10:52 | 显示全部楼层 |阅读模式
本帖最后由 相见是缘8 于 2022-8-19 05:19 编辑

老师好!
求老师们帮忙,谢谢!详见附件!
1.png

附件.rar

4.94 KB, 下载次数: 19

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-8-23 10:36 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 相见是缘8 于 2022-8-24 10:29 编辑

奇怪了,这么多天都不见有老师回复,是难度太大,还是的老师,没有上线呢?

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-8-27 09:28 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
继续向老师们求助!

TA的精华主题

TA的得分主题

发表于 2022-8-27 18:15 | 显示全部楼层
是较复杂,感觉文本不是很规范,特别是标点符号与断句。可试试如下代码,有些段落未能匹配。已有简单说明,可自行修改代码以尽量适应实际文档
  1. Private num(0 To 99) As String

  2. Sub test()
  3.     Dim i%, j%, k%, n1%, n2%, r%, s%
  4.     Dim data$, code$, info$(), info1$(), info2$(), data2$()
  5.     Dim RegExp As Object
  6.     Dim Match As Object
  7.     Dim RegExp2 As Object
  8.     Dim Match2 As Object
  9.    
  10.     data = IIf(Selection.Type = wdSelectionIP, ActiveDocument.Content.Text, Selection.Text)
  11.     code = "斤两钱分厘枚粒片"  '数量单位据此先后排序
  12.     Set RegExp = CreateObject("VBScript.RegExp")
  13.     Set RegExp2 = CreateObject("VBScript.RegExp")
  14.     With RegExp
  15.         .Global = True
  16.         .Pattern = "[用方]:([^。:]+。)"  '特征文本:用字加冒号开头,同一段落至句号结束
  17.         For Each Match In .Execute(data)
  18.             ReDim info(Len(code))
  19.             With RegExp2
  20.                 .Global = True
  21.                 For i = 1 To Len(code)
  22.                     
  23.                     '提取用于排序的文本特征,暂定数量及单位后须跟顿号或句号
  24.                     .Pattern = "([^、。]+?([十九八七六五四三二一半]+)" & Mid(code, i, 1) & ")[、。]"
  25.                     If .test(Match.submatches(0)) = True Then
  26.                         
  27.                         For Each Match2 In .Execute(Match.submatches(0))
  28.                             info(i - 1) = info(i - 1) & Match2.Value
  29.                             ReDim Preserve info1(1, n1)
  30.                             info1(0, n1) = Match2.submatches(0)
  31.                             info1(1, n1) = Match2.submatches(1)
  32.                             n1 = n1 + 1
  33.                         Next
  34.                         
  35.                         For k = 99 To 0 Step -1
  36.                             For j = 0 To UBound(info1, 2)
  37.                                 If info1(1, j) = num(k) Then
  38.                                     ReDim Preserve info2(n2)
  39.                                     info2(n2) = info1(0, j)
  40.                                     n2 = n2 + 1
  41.                                 End If
  42.                             Next
  43.                         Next
  44.                         ReDim Preserve data2(r)
  45.                         data2(r) = data2(r) & Join(info2, "、")
  46.                         r = r + 1
  47.                         
  48.                         Erase info1
  49.                         Erase info2
  50.                         n1 = 0
  51.                         n2 = 0
  52.                     End If
  53.                 Next
  54.             End With
  55.             
  56.             With Match
  57.                 data = Left(data, .firstindex + 2) & Join(data2, "、") & Mid(data, .firstindex + .Length)
  58.             End With
  59.             
  60.             Erase info
  61.             Erase data2
  62.             r = 0
  63.         Next
  64.         For i = 1 To Len(code)  '用于处理判断为相同数量及单位的药
  65.             RegExp2.Pattern = "([^、。]+?)各?([十九八七六五四三二一半]+" & Mid(code, i, 1) & ")[、。]([^、。]+?)\2([、。])"
  66.             If InStr(data, Mid(code, i, 1)) Then
  67.                 Do While RegExp2.test(data) = True
  68.                     data = RegExp2.Replace(data, "$1,$3各$2$4")
  69.                     s = s + 1
  70.                 Loop
  71.             End If
  72.         Next
  73.         Documents.Add(ActiveDocument.FullName).Content.Text = data
  74.     End With
  75. End Sub

  76. Sub NumToCnNum()
  77.     '生成百位内汉字小写数字
  78.     Const a As String = "一二三四五六七八九"
  79.     Dim i%, n%
  80.    
  81.     For i = 1 To 99
  82.         Select Case i
  83.         Case Is >= 20
  84.             If i Mod 10 > 0 Then
  85.                 num(i) = Mid(a, Int(i / 10), 1) & "十" & Mid(a, i Mod 10, 1)
  86.             Else
  87.                 num(i) = Mid(a, Int(i / 10), 1) & "十"
  88.             End If
  89.         Case Is > 10
  90.             num(i) = "十" & Mid(a, Int(i Mod 10), 1)
  91.         Case Is < 10
  92.             num(i) = Mid(a, i, 1)
  93.         Case Else
  94.             num(i) = "十"
  95.         End Select
  96.     Next
  97.     num(0) = "半"
  98. End Sub
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2022-8-27 22:19 来自手机 | 显示全部楼层
sylun 发表于 2022-8-27 18:15
是较复杂,感觉文本不是很规范,特别是标点符号与断句。可试试如下代码,有些段落未能匹配。已有简单说明, ...

高深强大,虽然看不懂

TA的精华主题

TA的得分主题

发表于 2022-8-28 10:00 | 显示全部楼层
sylun 老师的代码,我也看不懂,我只能叹服老师四个字:“叹为观止!”!老师辛苦了!

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-8-28 10:30 | 显示全部楼层
sylun 发表于 2022-8-27 18:15
是较复杂,感觉文本不是很规范,特别是标点符号与断句。可试试如下代码,有些段落未能匹配。已有简单说明, ...

终于等到大神出手相助!非常感谢sylun老师!
可不知啥原因,代码在我这运行出错!
1.png

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-8-28 10:33 | 显示全部楼层

TA的精华主题

TA的得分主题

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

* 相见,代码复制到 VBE 中,运行正常,但处理结果不正确(如果是 2019,需要复制到空白文档后,再全选,剪切,复制到 VBE 中运行)。
   
* sylun 老师:我帮 相见 也测试了一下,实话实说,错误不少。单位大小关系不正确(如:三两在四两前面等)。——我粗浅地提出一个建议:能否把处理结果放在每一段的后面,以与所处理的前一段对照修改可好。
   
* 万望 老师 好好休息,别累坏了。不愿意做就不做,有兴趣时再做(这一夏天,我也是断断续续地想修改自动排版宏代码,但因为天热、身体不好、水平不高,所以,每天都是做得不多,还经常放弃、反复),人毕竟不是机器人,有时挺累(我发现,出成果要在午前,午后就困,晚上更是)。

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-8-28 17:35 | 显示全部楼层
本帖最后由 相见是缘8 于 2022-8-28 18:09 编辑
413191246se 发表于 2022-8-28 12:41
* 相见,代码复制到 VBE 中,运行正常,但处理结果不正确(如果是 2019,需要复制到空白文档后,再全选,剪 ...

413191246se老师好!
你运行也正常?我用的还是公司的电脑,系统是XP,用的 Word是2003版的,测试几遍都不成!
2.png
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-9-17 03:43 , Processed in 0.046590 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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