ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

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

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-7-13 13:02 | 显示全部楼层
snow653124 发表于 2024-7-13 06:26
我可不是老师 我是为了自己工作轻松 自己摸索的 完全野路子
平时接触较多的是排版
这个东西,我知道涉 ...

snow653124  老师好!
比我懂的就是老师!期待老师的代码!

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-7-13 13:03 | 显示全部楼层
batmanbbs 发表于 2024-7-13 08:21
想简单了,看看sylun老师的代码就知道,根据楼主的示例,至少还需要增加如下内容:
(1)这个数组至少包 ...

batmanbbs 老师好!
本以为比 sylun 老师编写代码的那个帖子要简单,或那位老师能把 sylun 老师的代码修改一下,就可以,没想到会有这么复杂!

batmanbbs 老师,如把它改为2~3个代码,可否实现?

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-7-13 13:04 | 显示全部楼层
snow653124 发表于 2024-7-13 10:46
确实是复杂
他这个组成:后,确实没太大规律。看一行一个规律,我还卡在正则匹配上
其他的也是写一步, ...

snow653124 老师好!
如太复杂,分成2~3个代码,也可。

TA的精华主题

TA的得分主题

发表于 2024-7-13 21:16 | 显示全部楼层
难度太大了,我只弄了第一种示例的情况,并且不完善,只能输出s的内容:

image.png

TA的精华主题

TA的得分主题

发表于 2024-7-13 21:17 | 显示全部楼层
过客fppt 发表于 2024-7-13 21:16
难度太大了,我只弄了第一种示例的情况,并且不完善,只能输出s的内容:
  1. Sub 药材按升斤排序()
  2.     Dim arr, crr(), drr, err
  3.     Dim i%, j%, k%, l%, index%, ShuJC%
  4.     Dim str As String, s As String
  5.     Dim brr() As String, ShuJurr
  6.     str = "组成:附子(熟)10克、干姜6克、鸡子黄1个、花椒子13粒(捣碎)。人参6克、白术(炙)10克、茯苓10克、陈皮6克、甘草(炙)6克、五味子3克、半夏(洗,去滑)10克、生姜3片、红枣4枚(切开)。"

  7.     arr = Split("克、枚、段、片、粒、个", "、")
  8.     str = Replace(str, "组成:", "")
  9.     str = Left(str, Len(str) - 1)
  10.     str = Replace(str, "。", "、")
  11.    
  12.     brr = Split(str, "、")
  13.     ReDim drr(LBound(brr) To UBound(brr))
  14.     ReDim crr(LBound(brr) To UBound(brr), 1 To 3) '表格
  15.     '正则表达式
  16.     Dim reg As Object
  17.     Dim Ma
  18.    
  19.     Set reg = CreateObject("VBScript.RegExp")
  20.     For i = LBound(brr) To UBound(brr)
  21.         With reg
  22.             .Global = False
  23.             .IgnoreCase = True '不区分大小写
  24.             .Pattern = "\d{1,}" '正则表达式
  25.             Set Ma = .Execute(brr(i)) '返回在文本中匹配的集合
  26.             '拆分为表格
  27.             crr(i, 1) = Left(brr(i), Ma(0).firstindex)
  28.             crr(i, 2) = mid(brr(i), Ma(0).firstindex + 1, Ma(0).Length)
  29.             crr(i, 3) = Right(brr(i), Len(brr(i)) - Ma(0).Length - Ma(0).firstindex)
  30.         End With
  31.     Next i

  32.     二维数组排序3 crr, 2
  33.     i = 0
  34.    
  35.     '重新组合
  36.     ReDim ShuJurr(LBound(crr) To UBound(crr))
  37.     For i = LBound(crr) To UBound(crr)
  38.         ShuJurr(i) = crr(i, 1) & crr(i, 2) & crr(i, 3)
  39.     Next
  40.    
  41.     '"克、枚、段、片、粒、个"排序
  42.     For i = LBound(arr) To UBound(arr)
  43.         For j = LBound(ShuJurr) To UBound(ShuJurr)
  44.             If InStr(ShuJurr(j), arr(i)) Then
  45.                 drr(k) = ShuJurr(j)
  46.                 k = k + 1
  47.             End If
  48.         Next
  49.     Next
  50.    
  51.     '文字输出
  52.     For i = LBound(drr) To UBound(drr)
  53.         s = s & drr(i) & "、"
  54.     Next
  55. End Sub
  56. Sub 二维数组排序3(ByRef arr() As Variant, WeiDu As Integer)
  57.     Dim numRows As Integer, i As Integer, j As Integer, k As Integer
  58.     Dim s As Single, s1 As Single
  59.     numRows = UBound(arr) - LBound(arr) + 1
  60.    
  61.     Dim temp()
  62.     ReDim temp(LBound(arr, 2) To UBound(arr, 2))
  63.    
  64.     For i = 0 To numRows - 1
  65.         For j = 0 To numRows - 2
  66.             s = arr(j, WeiDu)
  67.             s1 = arr(j + 1, WeiDu)
  68.             If s > s1 Then
  69.                 ' 交换位置
  70.                 For k = LBound(arr, 2) To UBound(arr, 2)
  71.                     temp(k) = arr(j, k)
  72.                     arr(j, k) = arr(j + 1, k)
  73.                     arr(j + 1, k) = temp(k)
  74.                 Next
  75.             End If
  76.         Next j
  77.     Next i
  78. End Sub
复制代码


评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-7-13 21:56 来自手机 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
过客fppt 发表于 2024-7-13 21:16
难度太大了,我只弄了第一种示例的情况,并且不完善,只能输出s的内容:

我目前已经实现了数量的排序以及自定义的排序,第一种的处理还好,可以用正则找出数据的位置把这些内容分解为一个表格,对数量那一列进行一个冒泡排序,但是第二种情况里面根本就不是阿拉伯数据,会使得处理更加复杂,就算了吧。
至于最后要输出各10克之类的,楼主可以自己加代码处理一下

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-7-14 05:39 | 显示全部楼层
过客fppt 发表于 2024-7-13 21:56
我目前已经实现了数量的排序以及自定义的排序,第一种的处理还好,可以用正则找出数据的位置把这些内容分 ...

过客 fppt 老师好!
感谢老师援手!代码在我这附件上运行后,附件上的内容好像没啥改动。

TA的精华主题

TA的得分主题

发表于 2024-7-14 08:27 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
相见是缘8 发表于 2024-7-14 05:39
过客 fppt 老师好!
感谢老师援手!代码在我这附件上运行后,附件上的内容好像没啥改动。

既然自己有这么多需求,有空还是自己学学VBA,求人不如求己。
恕我直言,有空整理药典,挤出时间自学一下VBA吧,在论坛泡这么多年,不会写也至少能看懂别人提供的代码了。

TA的精华主题

TA的得分主题

发表于 2024-7-14 09:30 | 显示全部楼层
相见是缘8 发表于 2024-7-14 05:39
过客 fppt 老师好!
感谢老师援手!代码在我这附件上运行后,附件上的内容好像没啥改动。

因为我是直接在论坛上复制你的示例1写的,直接用变量str = "组成:附子(熟)10克、干姜6克、鸡子黄1个、花椒子13粒(捣碎)。人参6克、白术(炙)10克、茯苓10克、陈皮6克、甘草(炙)6克、五味子3克、半夏(洗,去滑)10克、生姜3片、红枣4枚(切开)。"
针对这段内容写出核心的处理代码,但是并没有弄到文档中,建议你遍历段落,str=段落的文本即可

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-7-15 06:25 | 显示全部楼层
batmanbbs 发表于 2024-7-14 08:27
既然自己有这么多需求,有空还是自己学学VBA,求人不如求己。
恕我直言,有空整理药典,挤出时间自学一 ...

batmanbbs 老师好!
感谢直言!
我对这个VBA是“又爱又恨”,爱的是,它几秒钟就可解决你要几天顺至几个月时间做的事,恨的是,我怎么也学不进去,也可能是没这方面的天赋,也可能是兴趣不够,反正见它就头大,追根究底可能还是时间不够,像我这种打工的,白天肯定是没时间,就晚上几个小时(还经常要加班),要做的事很多,你说我借口也罢,懒也罢,实践就这么个情况,以前刚开始想学,后来发现太难了,也不是短时间能学会的,故放弃了,如我是在体制内上班的,肯定会认真深学这个东西,因它有的是时间,且无压力。
batmanbbs 老师,我也知道求人难,老话说:求人如行乞!求人如吞三尺剑!因这全凭别人愿不愿意,碰到修养好的老师还好,碰到修养不好的老师,难免心理难受(这让我想起前几年139朋友的一次发飚回复, https://club.excelhome.net/thread-1406961-2-1.html    14楼),这也没办法,人不可能面面俱到,自己不会的东西总要求人,只能自己调整心态!
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-12-25 15:59 , Processed in 0.034303 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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