ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

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

[复制链接]

TA的精华主题

TA的得分主题

发表于 2017-3-14 10:32 | 显示全部楼层
chxw68 发表于 2017-3-9 19:41
先将括号替换掉。

大神,你好,能否转步,看看我这个问题,跟这个差不多的,能否帮忙一下,万分感谢

http://club.excelhome.net/thread-1333313-1-1.html

TA的精华主题

TA的得分主题

发表于 2017-3-14 13:37 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
部分代码11L的
  1. Sub fzl() '化学式、分子量
  2. s = "12H2O"
  3. 's = "Na2SO4"

  4. Set dic = CreateObject("scripting.dictionary")
  5.     arr = Split("H=1;He=2;C=12;N=14;O=16;F=19;Ne=20;Na=23;Mg=24;Al=27;Si=28;P=31;S=32;Cl=35.5;Ar=40;K=39;Ca=40;Mn=55;Fe=56;Cu=64;Zn=65;Ag=108;I=127;Ba=137;Pt=195;Au=197;Hg=201", ";")
  6.     For i = 0 To UBound(arr)
  7.         arr_s = Split(arr(i), "=")
  8.         dic.Add arr_s(0), arr_s(1)
  9.     Next
  10.    
  11. Set reg = CreateObject("vbscript.regexp")
  12. reg.Pattern = "\d+|[A-Z][a-z]|\w"
  13. reg.Global = True
  14. Set mh = reg.Execute(s)

  15. ss = ""
  16. sj = ""
  17. s1 = ""
  18. s2 = ""

  19. For Each mh1 In mh
  20.     If IsNumeric(mh1) Then
  21.         If ss = "" Then
  22.             s1 = mh1 & "*("
  23.             s2 = ")"
  24.         Else
  25.             ss = ss & "*" & mh1
  26.             sj = sj & "*" & mh1
  27.             
  28.         End If
  29.     Else
  30.         If ss = "" Then
  31.             ss = mh1
  32.             sj = dic(mh1.Value)
  33.         Else
  34.             ss = ss & "+" & mh1
  35.             sj = sj & "+" & dic(mh1.Value)
  36.         End If
  37.     End If
  38. Next
  39.     ss = s1 & ss & s2
  40.     sj = s1 & sj & s2
  41.    

  42. MsgBox ss & "=" & Evaluate(sj)
  43. End Sub
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-3-14 13:48 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

大侠辛苦了,
1、现在字符串变换成 “Na2SO4·10H2O”,能不能以这个“·”为分隔线,分隔线前面的,公式=Na*2+S+O*4。分隔线后面的=10*(H*2+O),最终结果为=Na*2+S+O*4+10*(H*2+O)
2、arr = Split("H=1;He=2;C=12;N=14;O=16;F=19;Ne=20;Na=23;Mg=24;Al=27;Si=28;P=31;S=32;Cl=35.5;Ar=40;K=39;Ca=40;Mn=55;Fe=56;Cu=64;Zn=65;Ag=108;I=127;Ba=137;Pt=195;Au=197;Hg=201", ";"),根据arr的值计算第一个公式的值。
不好意思,分开来问,是为了好解决问题,麻烦大侠了。

TA的精华主题

TA的得分主题

发表于 2017-3-14 15:33 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2017-3-14 17:00 | 显示全部楼层
dongdonggege 发表于 2017-3-14 13:48
大侠辛苦了,
1、现在字符串变换成 “Na2SO4·10H2O”,能不能以这个“·”为分隔线,分隔线前面的,公 ...
  1. Sub aa()
  2. s = "Na2SO4·10H2O"
  3. MsgBox YjhFZL(s, 2)

  4. End Sub

  5. Function YjhFZL(fzs, mode)    '化学式、分子量

  6.     Set dic = CreateObject("scripting.dictionary")
  7.     fzb = "H=1;He=2;C=12;N=14;O=16;F=19;Ne=20;Na=23;Mg=24;Al=27;Si=28;P=31"
  8.     fzb = fzb & ";S=32;Cl=35.5;Ar=40;K=39;Ca=40;Mn=55;Fe=56;Cu=64;Zn=65"
  9.     fzb = fzb & ";Ag=108;I=127;Ba=137;Pt=195;Au=197;Hg=201"
  10.     arr = Split(fzb, ";")
  11.     For i = 0 To UBound(arr)
  12.         arr_s = Split(arr(i), "=")
  13.         dic.Add arr_s(0), arr_s(1)
  14.     Next

  15.     Set reg = CreateObject("vbscript.regexp")
  16.     reg.Pattern = "\d+|[A-Z][a-z]|\w"
  17.     reg.Global = True

  18.     s = Split(fzs, "·")
  19.     ss = ""
  20.     sj = ""
  21.     For i = 0 To UBound(s)
  22.         Set mh = reg.Execute(s(i))
  23.         ssi = ""
  24.         sji = ""
  25.         s1 = ""
  26.         s2 = ""
  27.         For Each mh1 In mh
  28.             s0 = mh1.Value
  29.             If IsNumeric(s0) Then
  30.                 If ssi = "" Then
  31.                     s1 = s0 & "*("
  32.                     s2 = ")"
  33.                 Else
  34.                     ssi = ssi & "*" & s0
  35.                     sji = sji & "*" & s0
  36.                 End If
  37.             Else
  38.                 If ssi = "" Then
  39.                     ssi = s0
  40.                     sji = dic(s0)
  41.                 Else
  42.                     ssi = ssi & "+" & s0
  43.                     sji = sji & "+" & dic(s0)
  44.                 End If
  45.             End If
  46.         Next
  47.         ss = ss & "+" & s1 & ssi & s2
  48.         sj = sj & "+" & s1 & sji & s2
  49.     Next

  50.     If mode = 1 Then
  51.         YjhFZL = Mid(ss, 2)
  52.     ElseIf mode = 2 Then
  53.         YjhFZL = Mid(ss, 2) & "=" & Evaluate(sj)
  54.     Else
  55.         YjhFZL = Evaluate(sj)
  56.     End If

  57. End Function
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-3-14 17:34 | 显示全部楼层
本帖最后由 dongdonggege 于 2017-3-14 17:38 编辑

辛苦了,大侠,刚测试了几个,都比较正确。
1、不带水合物的正确;
2、纯水合物正确;
但是对带括号的,好像有问题。
比如KAl(SO4)2·12H2O,“·”前因为有括号,计算错误。
再如KAl(SO4)2也错误,11楼带括号的正确,再麻烦大侠,再完善下,谢谢。

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-3-15 08:58 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2017-3-15 11:21 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
dongdonggege 发表于 2017-3-14 17:34
辛苦了,大侠,刚测试了几个,都比较正确。
1、不带水合物的正确;
2、纯水合物正确;

正则只是按另一帖中提到的三个规则处理数字、字母,没有提取括号,所以出错。
还有什么要求一并提出,给出的分子式各类都有,方便测试。

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-3-15 13:27 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
yjh_27 发表于 2017-3-15 11:21
正则只是按另一帖中提到的三个规则处理数字、字母,没有提取括号,所以出错。
还有什么要求一并提出,给 ...

据我所知,应该没有了。说不定也有特殊的,水合物,可能带有2次“.”。谢谢大侠了。

TA的精华主题

TA的得分主题

发表于 2017-3-15 16:19 | 显示全部楼层
对于分子式这种格式化的字符串,用正则表达式来分析处理是最合适不过的了,既简洁又高效: 分子量计算函数.rar (14.86 KB, 下载次数: 35)



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

本版积分规则

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

GMT+8, 2024-11-25 03:42 , Processed in 0.039633 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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