ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 数组字符串合并(化学式、分子量)(已解决)

[复制链接]

TA的精华主题

TA的得分主题

发表于 2017-3-9 18:42 | 显示全部楼层 |阅读模式
本帖最后由 dongdonggege 于 2017-3-10 08:42 编辑

我有一个字符串,使用数组,我想把符合条件的合并。比如,有一个字符串为"Na2SO4",内部包含英文、数字,我想把大小写的英文合并。
条件:
1、连续两个英文都是大写的不合并
2、前一个是大写,后一个是小写的,把后一个合并到前一个。即brr(i)=arr(i-1) & arr(i)
最后结果为,brr(i)=Na,brr(i)=2,brr(i)=S,brr(i)=O,brr(i)=4
我写的程序为
  1. Sub test() '拆分字符
  2. Dim str$, arr, brr
  3. str = "Na2SO4" 'Na2SO4,Ca3(PO4)2
  4. ReDim arr(1 To Len(str))
  5. ReDim brr(1 To UBound(arr))
  6. For i = 1 To Len(str)
  7.     arr(i) = Mid(str, i, 1)
  8.     'sm = Asc(arr(i))
  9.     If 65 < Asc(arr(i)) < 90 Then '英文大写字母
  10.         brr(i) = arr(i)
  11.     ElseIf 97 < Asc(arr(i)) < 122 Then '英文小写字母
  12.         brr(i) = arr(i - 1) & arr(i)
  13.     ElseIf 48 < Asc(arr(i)) < 57 Then '数字
  14.         brr(i) = arr(i)
  15.     End If
  16. Next i
  17. MsgBox Join(brr, ",")
  18. End Sub
复制代码
我做的达不到要求,能修改吗?或请你重写,谢谢。

TA的精华主题

TA的得分主题

发表于 2017-3-9 19:19 | 显示全部楼层
  1. Sub test()
  2.   Dim i%, arr(), ss$
  3.   Dim reg As New RegExp
  4.   ss = "Na2SO4"
  5.   With reg
  6.     .Global = True
  7.     .Pattern = "\d+|[A-Z][a-z]+|[A-Z]|[a-z]+"
  8.     Set mh = .Execute(ss)
  9.   End With
  10.   If mh.Count > 0 Then
  11.     ReDim arr(1 To mh.Count)
  12.     For i = 0 To mh.Count - 1
  13.       arr(i + 1) = mh(i)
  14.     Next
  15.   End If
  16.   MsgBox Join(arr, ",")
  17. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2017-3-9 19:20 | 显示全部楼层
提供一个正则表达式的。

正则表达式拆分字符串.rar

13.85 KB, 下载次数: 32

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-3-9 19:35 | 显示全部楼层
chxw68 发表于 2017-3-9 19:20
提供一个正则表达式的。

谢谢大侠,很高兴再次见到你,每次都是你及时解决问题。
接着请教:如果是这样的带括号的,Ca3(PO4)2,括号取消,程序怎么修改,谢谢?

TA的精华主题

TA的得分主题

发表于 2017-3-9 19:41 | 显示全部楼层
先将括号替换掉。
  1. Sub test()
  2.   Dim i%, arr(), ss$
  3.   Dim reg As New RegExp
  4. '  ss = "Na2SO4"
  5.   ss = "Ca3(PO4)2"
  6.   With reg
  7.     .Global = True
  8.     .Pattern = "\d+|[A-Z][a-z]+|[A-Z]|[a-z]+"
  9.   End With
  10.   ss = Replace(Replace(ss, "(", ""), ")", "")
  11.   Set mh = reg.Execute(ss)
  12.   If mh.Count > 0 Then
  13.     ReDim arr(1 To mh.Count)
  14.     For i = 0 To mh.Count - 1
  15.       arr(i + 1) = mh(i)
  16.     Next
  17.   End If
  18.   MsgBox Join(arr, ",")
  19. End Sub
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-3-9 19:45 | 显示全部楼层
chxw68 发表于 2017-3-9 19:20
提供一个正则表达式的。

不好意思,说的也不对,是这样的,我看到别人搞的那个化学式(求分子量的),Ca3(PO4)2最后的结果是Ca*3+P*2+O*4*2,我怕有人说太难,所以就分开问的,这样你就不走弯路了。

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-3-9 19:47 | 显示全部楼层
chxw68 发表于 2017-3-9 19:20
提供一个正则表达式的。

分子量表:太长了。
H = 1 '氢1
He = 2 '氦2
C = 12 '碳6
N = 14 '氮7
O = 16 '氧8
F = 19 '氟9
Ne = 20 '氖10
Na = 23 '钠11
Mg = 24 '镁12
Al = 27 '铝13
Si = 28 '硅14
P = 31 '磷15
s = 32 '硫16
Cl = 35.5 '氯17
Ar = 40 '氩18
K = 39 '钾19
Ca = 40 '钙20
Mn = 55 '锰25
Fe = 56 '铁26
Cu = 64 '铜29
Zn = 65 '锌30
Ag = 108 '银47
i = 127 '碘53
Ba = 137 '钡56
Pt = 195 '铂78
Au = 197 '金79
Hg = 201 '汞80

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-3-9 19:47 | 显示全部楼层
本帖最后由 dongdonggege 于 2017-3-9 21:00 编辑
chxw68 发表于 2017-3-9 19:20
提供一个正则表达式的。
不好意思,又发重了。

TA的精华主题

TA的得分主题

发表于 2017-3-9 19:52 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-3-9 21:03 | 显示全部楼层
chxw68 发表于 2017-3-9 19:20
提供一个正则表达式的。

人家都说vba 化学式求分子量太难,我觉得以大侠的水平,应该很快能做出来,这也是大侠为论坛做的贡献,我等着大侠的成果,做出来的时候,请大侠别忘了,让我们也能分享,谢谢。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-25 01:37 , Processed in 0.037592 second(s), 14 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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