Excel, Таблица Менделеева - VBA
Формулировка задачи:
Подскажите, пожалуйста, каким образом можно реализовать такую идею:
Составляем в Excel всю таблицу Менделеева. Программа должна понимать, что в Al2(SO4)3 - нужно все элементы нужно всё, что в скобках умножать на 3, а атомов серы в скобке - 1, а не ноль.
Когда программа будет составлена, должна быть возможность ввести в строке формул =M(Al2(SO4)3) - и Excel будет подсчитывать молярную массу вещества заданной формулы. Но если ввести ПР( BaSO4) - то будет выводиться растворимость, а не молярная масса этого вещества. Реально ли осуществить такое? Если нет, то хотя бы частично помогите реализовать такую идею=)
Решение задачи: «Excel, Таблица Менделеева»
textual
Листинг программы
- Function MolMassa(ByVal strFormula As String) As Double
- Dim i%, j%, k%, El, eM, S$, S1$, S2$, SubSum#(), OldEM#, OldEM2#, ReCalc As Boolean, LenFormula%, Chislo$, dic
- El = Split("Ac Ag Al Am Ar As At Au Ba Be Bi Bk Br Ca Cd Ce Cf Cl Cm Co Cr Cs Cu Dy Er Es Eu Fe Fm Fr Ga Gd Ge He Hf Hg Ho In Ir Kr La Li Lr Lu Md Mg Mn Mo Na Nb Nd Ne Ni No Np Os Pa Pb Pd Pm Po Pr Pt Pu Ra Rb Re Rh Rn Ru Sb Sc Se Si Sm Sn Sr Ta Tb Tc Te Th Ti Tl Tm Xe Yb Zn Zr B C F H I K N O P S U V W Y")
- eM = Array(227.028, 107.868, 26.982, 243.061, 39.948, 74.922, 209.987, 196.967, 137.33, 9.012, 208.98, 247.07, 79.904, 40.078, 112.41, 140.12, 251.08, 35.453, 247.07, 58.933, 51.996, 132.905, 63.546, 162.5, 167.26, 252.083, 151.96, 55.847, 257.095, 223.02, 69.723, 157.25, 72.59, 4.003, 178.49, 200.59, 164.93, 114.82, 192.22, 83.8, 138.906, 6.941, 260.105, 174.967, 258.099, 24.305, 54.938, 95.94, 22.99, 92.906, 144.24, 20.179, 58.69, 259.101, 237.048, 190.2, 231.036, 207.2, 106.42, 144.913, 208.982, 140.908, 195.08, 244.064, 226.025, 85.468, 186.207, 102.906, 222.018, 101.07, 121.75, 44.956, 78.96, 28.086, 150.36, 118.71, 87.62, 180.948, 158.925, 97.907, 127.6, 232.038, 47.88, 204.383, 168.934, 131.29, 173.04, 65.39, 91.224, 10.811, 12.011, 18.998, 1.008, 126.905, 39.098, 14.007, 15.999, 30.974, 32.066, 238.029, 50.942, 183.85, 88.906)
- strFormula = strFormula & "#"
- LenFormula = Len(strFormula)
- ReDim SubSum(1)
- Set dic = CreateObject("Scripting.Dictionary")
- For j = 0 To UBound(El)
- dic(El(j)) = eM(j)
- Next j
- k = 1
- i = 1
- Do
- S1 = Mid(strFormula, i, 1)
- ReCalc = True
- OldEM2 = OldEM
- Select Case S1
- Case "("
- Case ")", "#"
- Case "0" To "9"
- Chislo = Chislo & S1
- ReCalc = False
- Case Else
- S2 = Mid(strFormula, i, 2)
- S = ""
- If dic.Exists(S2) Then
- S = S2
- ElseIf dic.Exists(S1) Then
- S = S1
- End If
- If S <> "" Then
- OldEM = dic(S)
- i = i - 1 + Len(S)
- End If
- End Select
- If ReCalc Then
- If Chislo = "" Then Chislo = "1"
- SubSum(k) = SubSum(k) + OldEM2 * Val(Chislo)
- Chislo = ""
- End If
- Select Case S1
- Case "("
- OldEM = 0
- k = k + 1
- ReDim Preserve SubSum(k)
- SubSum(k) = 0
- Case ")"
- OldEM = SubSum(k)
- k = k - 1
- End Select
- i = i + 1
- Loop While i <= LenFormula
- MolMassa = SubSum(1)
- Set dic = Nothing
- End Function
- Sub Test_MolMassa()
- Debug.Print "H", MolMassa("H")
- Debug.Print "O", MolMassa("O")
- Debug.Print "H2O", MolMassa("H2O")
- Debug.Print "S", MolMassa("S")
- Debug.Print "Al2", MolMassa("Al2")
- Debug.Print "SO4", MolMassa("SO4")
- Debug.Print "(SO4)3", MolMassa("(SO4)3")
- Debug.Print "Al2(SO4)3", MolMassa("Al2(SO4)3")
- Debug.Print "H2(SO4)3", MolMassa("H2(SO4)3")
- Debug.Print "(CH3)3", MolMassa("(CH3)3")
- Debug.Print "(CH3)3N", MolMassa("(CH3)3N")
- Debug.Print "((CH3)3N)2", MolMassa("((CH3)3N)2")
- End Sub
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д