ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 把每个药方中的每种药材,按数量的多少,重新先后排序

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-7-17 18:16 | 显示全部楼层
过客fppt 发表于 2024-7-17 16:10
好吧,我2022年开始学的VBA,当时在B站跟着孙兴华老师的视频学的,你也可以跟着抽空学一学;时间的话,是 ...

过客 fppt 老师好!
真佩服你的毅力和天赋!

TA的精华主题

TA的得分主题

发表于 2024-7-18 00:23 | 显示全部楼层
相见是缘8 发表于 2024-7-17 15:37
batmanbbs 老师好!
你可能误会了,我在一楼提出的要求,例如……
并不是指全部需求,只是为了节省篇幅 ...

咳,怎么说呢,不会写代码就不说了,我已经说了多次没有说明换算的要求,怎么自己还是不懂呢?

我也举例:一斤和十两是否相等,一斤和十一两谁大,楼上还提示没有克,如果有克,又如何换算,等等。希望你想清楚再回复。

PS:不会再跟帖了,因为交流太累。最后再说一句,希望你的附件就是最终文档,不存在其他特殊情况,不要再麻烦各位老师浪费时间修改代码。

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-7-18 07:00 | 显示全部楼层
tcdatongye 发表于 2024-7-17 17:34
zhanglei1371已帮你做了中文数字药量排序。数词+量词为标准计量方式。而一斤半、钱半就是非标准剂 ...

Tcdatongye老师好!
zhanglei1371老师是帮我做了中文数字药量排序,但未能满足要求,且他说“无后续修改服务……”,所以,我就不好意思再……!
只能向你或其他老师求助,看能不能帮忙解决……
我再上传一个种类概括全面一些的“模拟附件”,你看看……
关于换算成标准计量方式,“斤、两、钱、分、厘、…”都为:十进制。即:1斤=10两;1两=10钱;1钱=10分;1分=10厘……

模拟附件.rar

7.99 KB, 下载次数: 4

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-7-18 08:02 | 显示全部楼层
batmanbbs 发表于 2024-7-18 00:23
咳,怎么说呢,不会写代码就不说了,我已经说了多次没有说明换算的要求,怎么自己还是不懂呢?

我也举 ...

batmanbbs 老师好!
你生气那?真是抱歉!
唉!由于天赋和智商欠缺,导致理解和描述问题总慢一些和差一点,这个没办法,还请你见凉!
前几天你和过客 fppt 老师,都欠我自学 VBA,我确实不是不学,一是确实没有多少时间,二是天赋不够,怎么也学不会,故放弃了……
至于“附件”就是最终文档,我不是不愿上传整个文档(又没有什么秘密),因我的文档一般都比较大,我以前上传整个文档,好多老师都叫我不要全部上传,多了就导致他们没兴趣和精力看,叫我简短举例即可,故后来……
麻烦各位老师修改代码的问题,有些是代码与原要求之间有出入,有些确是我的问题,因我对 VBA 还是外行,有些问题代码处理前,看不到,想不到,故……以后尽量少出现这类情况!

TA的精华主题

TA的得分主题

发表于 2024-7-18 21:57 | 显示全部楼层
batmanbbs 发表于 2024-7-18 00:23
咳,怎么说呢,不会写代码就不说了,我已经说了多次没有说明换算的要求,怎么自己还是不懂呢?

我也举 ...

不一定按照要求去做,自己可以按自己要求拿来练练笔,做了玩玩。

主治:温热病,热邪内陷心包,痰热壅闭心窍。
特征:高热烦燥,神昏谵语,以及中风昏迷,小儿惊厥属邪热内闭者。
紫雪丹:
组成:硝石四升、饴糖一升、【芒硝、黄金】各(十斤|一百两)、寒水石三斤半、石膏二斤六两、磁石一斤八两、【玄参、白术】各一斤半、熟地一斤二两四钱、【滑石、升麻】各一斤、炙甘草八两六钱、川芎八两、羚羊角(屑)五两二钱、【水牛角浓缩粉、沉香、青木香、生地】各(五两|半斤)、【朱砂、独活】各三两、丁香一两九钱、生姜一两三钱(碎)、防风六钱三分、【甘草、白芍】各六钱、【细辛、黄芩】各四钱、秦艽钱半、当归一钱三分、羌活一钱二分、石羔七分二厘、麝香五分六厘、茯苓五分、白芷四厘、红枣十二枚(切开)、葱白三段、荷叶二片(剪条)、花椒子六十粒(捣碎)、鸡子黄三个。这是复杂的事例。
功用:清热开窍,镇痉安神。
主治:温热病,热邪内陷心包。


TA的精华主题

TA的得分主题

 楼主| 发表于 2024-7-19 07:39 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 相见是缘8 于 2024-7-19 07:59 编辑
tcdatongye 发表于 2024-7-18 21:57
不一定按照要求去做,自己可以按自己要求拿来练练笔,做了玩玩。

主治:温热病,热邪内陷心包,痰热壅 ...
回重了一个,删除。

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-7-19 07:55 | 显示全部楼层
本帖最后由 相见是缘8 于 2024-7-19 08:01 编辑
tcdatongye 发表于 2024-7-18 21:57
不一定按照要求去做,自己可以按自己要求拿来练练笔,做了玩玩。

主治:温热病,热邪内陷心包,痰热壅 ...

Tcdatongye老师好!
如真碰到你例举的这种,有办法把它排列成下面我想要的样子吗?

紫雪丹:
组成:硝石四升、饴糖一升、芒硝十斤、寒水石三斤半、石膏二斤六两、磁石一斤八两、玄参、白术,各一斤半、熟地一斤二两四钱、滑石、升麻,各一斤、生地半斤、黄金一百两、炙甘草八两六钱、川芎八两、羚羊角(屑)五两二钱、水牛角浓缩粉、沉香、青木香,各五两、朱砂、独活,各三两、丁香一两九钱、生姜一两三钱(碎)、防风六钱三分、甘草、白芍,各六钱、细辛、黄芩,各四钱、秦艽钱半、当归一钱三分、羌活一钱二分、石羔七分二厘、麝香五分六厘、茯苓五分、白芷四厘、红枣十二枚(切开)、葱白三段、荷叶二片(剪条)、花椒子六十粒(捣碎)、鸡子黄三个。

TA的精华主题

TA的得分主题

发表于 2024-7-19 10:51 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-7-19 13:39 来自手机 | 显示全部楼层
好,多谢!期待老师的代吗!

TA的精华主题

TA的得分主题

发表于 2024-7-19 19:11 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
相见是缘8 发表于 2024-7-19 13:39
好,多谢!期待老师的代吗!

仅供参考
Sub aa()
Selection.StartOf wdStory
    With Selection.Find
        .Text = "组成:*^13"
        .Forward = True
        .MatchWildcards = True
        Do While .Execute
          .Parent.MoveStart , 3
          .Parent.MoveEnd , -1
          排串 = Selection
          a = 排汉字药量(排串)
          If a <> "" Then Selection = a
          Selection.Move
        Loop
    End With
End Sub
Function ChineseToNumber(ByVal s)  '汉字转阿拉伯,数值不超过万。
   Dim arr(1 To 2)
    If s = "" Then Exit Function
    If Right(s, 1) = "半" Then s = s & Mid(s, Len(s) - 1, 1)
    If Left(s, 1) = "钱" Then s = "一" & s '调整为标准计量单位
    Set dic = VBA.CreateObject("scripting.dictionary")
    数值组 = Split("1, 10000, 1000, 100, 10, 1, 1, 1, 1, 1, 1,0,1,2,3,4,5,6,7,8,9,10,100,1000,0.5", ",")
    For i = 0 To UBound(数值组)
      dic(Mid("升斤两钱分厘枚段片粒个零一二三四五六七八九十百千半", i + 1, 1)) = 数值组(i)
    Next i
    flag = 1
    For i = 1 To Len(s)
      m = Mid(s, i, 1) '此处m肯定不为空。
      Select Case m
        Case "零", "一", "二", "三", "四", "五", "六", "七", "八", "九", "十", "百", "千", "半"
          nub1 = nub1 + dic(m)
        Case "十", "百", "千"
          nub2 = nub2 + nub1 * dic(m)
          nub1 = 0
        Case "升", "斤", "两", "钱", "分", "厘", "枚", "段", "片", "粒", "个"
          nub3 = nub3 + (nub1 + nub2) * dic(m) 'instr前加0,防止当m为空时,显示start值,默认为1,但程序报错。
          If flag = 1 Then fir = m: flag = 2
          nub1 = 0: nub2 = 0
      End Select
    Next i
    arr(1) = fir: arr(2) = nub3
    ChineseToNumber = arr
End Function
Function 排汉字药量(ss)
Dim arr(1 To 2)
量名 = Array("升", "斤", "两", "钱", "分", "厘", "枚", "段", "片", "粒", "个")
Set dic = VBA.CreateObject("scripting.dictionary")
Set reg = VBA.CreateObject("vbscript.regexp")
With reg
  .Global = True
  .Pattern = ".*。([^升斤两钱分厘枚段片粒个]+。$)"
  尾符 = IIf(.test(ss), .Replace(Selection, "$1"), "")
  .Pattern = "[^、。]*?(([零一二三四五六七八九十百千半]+[升斤两钱分厘枚段片粒个]半?|钱半)+)[^、。]*"
  Set jj = .Execute(ss) '取药名及数量集
  If jj.Count = 0 Then 排汉字药量 = "": Exit Function
  For Each 药名数量 In jj
    药量 = 药名数量.submatches(0)
    brr = ChineseToNumber(药量)
    If Not dic.Exists(brr(1)) Then Set dic(brr(1)) = CreateObject("scripting.dictionary")
    If Not dic(brr(1)).Exists(brr(2)) Then
        arr(1) = 药名数量
        Set dic(brr(1))(brr(2)) = CreateObject("scripting.dictionary")
        dic(brr(1))(brr(2)) = arr
      Else
        temp = dic(brr(1))(brr(2))
        temp(1) = temp(1) & "、" & 药名数量
        If temp(2) = "" Then temp(2) = 药量 '假设不会同时出现一斤半与一斤五两这种现象。
        dic(brr(1))(brr(2)) = temp
    End If
  Next
  
  
  Set arrlist = VBA.CreateObject("system.collections.arraylist")
    For Each 排量名 In 量名 '排序合并。
      If dic.Exists(排量名) Then '量名按要求逐一取出存在值。
        a = dic(排量名).keys '取出重量数组。
        If UBound(a) > 0 Then
          For Each b In a
            arrlist.Add b
          Next
          arrlist.Sort '排序
          a = arrlist.toarray
        End If
        For i = UBound(a) To 0 Step -1 '同一重量体系连接
          tmp = dic(排量名)(a(i))
          subtol = subtol & IIf(tmp(2) = "", tmp(1), Replace(tmp(1), tmp(2), "") & ",各" & tmp(2)) & "、"
        Next i
        tol = tol & subtol
        subtol = "": arrlist.Clear
      End If
    Next
    排汉字药量 = Left(tol, Len(tol) - 1) & "。" & 尾符

End With
End Function




您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-9-8 09:09 , Processed in 0.044078 second(s), 7 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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