ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

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

[复制链接]

TA的精华主题

TA的得分主题

发表于 2017-3-9 22:08 | 显示全部楼层
  1. Function J0r_fzs(hxs$)
  2. Dim str, c As String, arr, arr_s, i%, dic

  3.     Set dic = CreateObject("scripting.dictionary")
  4.     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", ";")
  5.     For i = 0 To UBound(arr)
  6.         arr_s = Split(arr(i), "=")
  7.         dic.Add arr_s(0), arr_s(1)
  8.     Next
  9.    
  10.     str = Left(hxs, 1)
  11.     For i = 2 To Len(hxs)
  12.         c = Mid(hxs, i, 1)
  13.         Select Case c
  14.             Case "A" To "Z", "("
  15.                 str = str & IIf(Right(str, 1) = "(", " ", " + ") & c
  16.             Case "a" To "z", ")"
  17.                 str = str & IIf(c = ")", " ", "") & c
  18.             Case "0" To "9"
  19.                 str = str & " * " & c
  20.         End Select
  21.     Next
  22.    
  23.     arr = Split(str, " ")
  24.     For i = 0 To UBound(arr)
  25.         If dic.Exists(arr(i)) Then arr(i) = dic(arr(i))
  26.     Next
  27.    
  28.     J0r_fzs = Evaluate(Join(arr))
  29.     Debug.Print str & " = " & Evaluate(Join(arr))
  30. End Function
复制代码

测试:
?J0r_fzs("Cu(NO3)2")
Cu + ( N + O * 3 ) * 2 = 188
188
?J0r_fzs("Ca3(PO4)2")
Ca * 3 + ( P + O * 4 ) * 2 = 310
310
?J0r_fzs("Na2SO4")
Na * 2 + S + O * 4 = 142
142

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-3-9 22:38 | 显示全部楼层
解0人 发表于 2017-3-9 22:08
测试:
?J0r_fzs("Cu(NO3)2")
Cu + ( N + O * 3 ) * 2 = 188

大侠,Evaluate子过程或函数未定义!

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-3-9 22:39 | 显示全部楼层
解0人 发表于 2017-3-9 22:08
测试:
?J0r_fzs("Cu(NO3)2")
Cu + ( N + O * 3 ) * 2 = 188

能否给个完整的程序?

TA的精华主题

TA的得分主题

发表于 2017-3-9 22:48 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
dongdonggege 发表于 2017-3-9 22:39
能否给个完整的程序?

Evaluate是application的方法,怎么会未定义呢?
你写application.Evaluate试试

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-3-9 22:54 | 显示全部楼层
解0人 发表于 2017-3-9 22:08
测试:
?J0r_fzs("Cu(NO3)2")
Cu + ( N + O * 3 ) * 2 = 188

刚才我在使用ppt,好像不能使用Evaluate,现在改成excel可以了,但是有机化学后面的数字都是2位的好像不行,请试试C10H16N2O2

TA的精华主题

TA的得分主题

发表于 2017-3-9 23:07 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
稍加改动即可:
  1. Function J0r_fzs(hxs$)
  2. Dim str, c As String, arr, arr_s, i%, dic

  3.     Set dic = CreateObject("scripting.dictionary")
  4.     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", ";")
  5.     For i = 0 To UBound(arr)
  6.         arr_s = Split(arr(i), "=")
  7.         dic.Add arr_s(0), arr_s(1)
  8.     Next
  9.    
  10.     str = Left(hxs, 1)
  11.     For i = 2 To Len(hxs)
  12.         c = Mid(hxs, i, 1)
  13.         Select Case c
  14.             Case "A" To "Z", "("
  15.                 str = str & IIf(Right(str, 1) = "(", " ", " + ") & c
  16.             Case "a" To "z", ")"
  17.                 str = str & IIf(c = ")", " ", "") & c
  18.             Case "0" To "9"
  19.                 str = str & IIf(Right(str, 1) > "0" And Right(str, 1) <= "9", "", " * ") & c
  20.         End Select
  21.     Next
  22.    
  23.     arr = Split(str, " ")
  24.     For i = 0 To UBound(arr)
  25.         If dic.Exists(arr(i)) Then arr(i) = dic(arr(i))
  26.     Next
  27.    
  28.     J0r_fzs = Application.Evaluate(Join(arr))
  29.     Debug.Print str & " = " & Application.Evaluate(Join(arr))
  30. End Function
复制代码

测试:
?J0r_fzs("C10H16N2O2")
C * 10 + H * 16 + N * 2 + O * 2 = 196
196

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-3-9 23:13 | 显示全部楼层

TA的精华主题

TA的得分主题

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

大侠,你好,这个主题的11楼的代码解决了分子量的计算公式,不过,我一般喜欢ppt的。所以,11楼的这个程序Evaluate或Application.Evaluate在ppt都不适用,我把最后两句改成了J0r_fzs = Join(arr),MsgBox str & " = " & Join(arr),结果是:Cu + (N + O * 3) * 2  = 64 + (14 + 16 * 3) * 2,我想在后面添上“= 188”,这个188出不来,我不知道,我的最后一句怎么改,麻烦你再帮下忙,谢谢了。

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-3-13 09:23 | 显示全部楼层
本帖最后由 dongdonggege 于 2017-3-13 12:18 编辑
解0人 发表于 2017-3-9 22:08
测试:
?J0r_fzs("Cu(NO3)2")
Cu + ( N + O * 3 ) * 2 = 188

大侠,你好
第1个问题:我一般喜欢ppt vba的, 11楼或16楼的这个程序Evaluate或Application.Evaluate在ppt不适用,我把最后两句改成了J0r_fzs = Join(arr),MsgBox str & " = " & Join(arr),结果是:Cu + (N + O * 3) * 2  = 64 + (14 + 16 * 3) * 2,我想在后面添上“= 188”,这个188出不来。
第2个问题:针对11楼或16楼的代码,分子量计算,还有个特殊情况,就是水合物的分子量。CuSO4&#8226;5H2O(5水硫酸铜,俗称胆矾),Na2SO4&#8226;10H2O(10水硫酸钠, 俗称芒硝),像这样,把两个分子式用“&#8226;”分隔开,“&#8226;”后有数字且带分子式,产生错误算式,正确的算式为CuSO4&#8226;5H2O= Cu+S+O*4+5*(H*2+O)。请写个水合物分子量计算的程序。
第3个问题:我另写的文章《配平化学方程式》
http://club.excelhome.net/thread-1333266-1-1.html),这个程序,已能达到一般的化学方程式都能配平,但是对离子方程式还不行,如H(+) + NH4(+) + OH(-)=NH3 + H2O,配平后为H(+) + NH4(+) + 2OH(-) =NH3 + 2H2O,又如MnO(4-) + H(+) + Cl(-) =Mn(2+)+ Cl2 + H2O,最后结果为2MnO(4-) + 16H(+) + 10Cl(-) = 2Mn(2+) + 5Cl2 + 8H2O,我不知道怎么提取括号里数字与前面的原子相乘。请写个离子方程式的程序。
麻烦大侠能抽空看看,再次麻烦,感谢。

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-3-14 09:37 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
解0人 发表于 2017-3-9 22:08
测试:
?J0r_fzs("Cu(NO3)2")
Cu + ( N + O * 3 ) * 2 = 188

大侠,请再次出手,谢谢了。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

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

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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