Excel, Таблица Менделеева - VBA

Узнай цену своей работы

Формулировка задачи:

Подскажите, пожалуйста, каким образом можно реализовать такую идею: Составляем в Excel всю таблицу Менделеева. Программа должна понимать, что в Al2(SO4)3 - нужно все элементы нужно всё, что в скобках умножать на 3, а атомов серы в скобке - 1, а не ноль. Когда программа будет составлена, должна быть возможность ввести в строке формул =M(Al2(SO4)3) - и Excel будет подсчитывать молярную массу вещества заданной формулы. Но если ввести ПР( BaSO4) - то будет выводиться растворимость, а не молярная масса этого вещества. Реально ли осуществить такое? Если нет, то хотя бы частично помогите реализовать такую идею=)

Решение задачи: «Excel, Таблица Менделеева»

textual
Листинг программы
  1. Function MolMassa(ByVal strFormula As String) As Double
  2.     Dim i%, j%, k%, El, eM, S$, S1$, S2$, SubSum#(), OldEM#, OldEM2#, ReCalc As Boolean, LenFormula%, Chislo$, dic
  3.     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")
  4.     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)
  5.     strFormula = strFormula & "#"
  6.     LenFormula = Len(strFormula)
  7.     ReDim SubSum(1)
  8.     Set dic = CreateObject("Scripting.Dictionary")
  9.     For j = 0 To UBound(El)
  10.         dic(El(j)) = eM(j)
  11.     Next j
  12.     k = 1
  13.     i = 1
  14.     Do
  15.         S1 = Mid(strFormula, i, 1)
  16.         ReCalc = True
  17.         OldEM2 = OldEM
  18.         Select Case S1
  19.             Case "("
  20.             Case ")", "#"
  21.             Case "0" To "9"
  22.                 Chislo = Chislo & S1
  23.                 ReCalc = False
  24.             Case Else
  25.                 S2 = Mid(strFormula, i, 2)
  26.                 S = ""
  27.                 If dic.Exists(S2) Then
  28.                     S = S2
  29.                 ElseIf dic.Exists(S1) Then
  30.                     S = S1
  31.                 End If
  32.                 If S <> "" Then
  33.                     OldEM = dic(S)
  34.                     i = i - 1 + Len(S)
  35.                 End If
  36.         End Select
  37.         If ReCalc Then
  38.             If Chislo = "" Then Chislo = "1"
  39.             SubSum(k) = SubSum(k) + OldEM2 * Val(Chislo)
  40.             Chislo = ""
  41.         End If
  42.         Select Case S1
  43.             Case "("
  44.                 OldEM = 0
  45.                 k = k + 1
  46.                 ReDim Preserve SubSum(k)
  47.                 SubSum(k) = 0
  48.             Case ")"
  49.                 OldEM = SubSum(k)
  50.                 k = k - 1
  51.         End Select
  52.         i = i + 1
  53.     Loop While i <= LenFormula
  54.     MolMassa = SubSum(1)
  55.     Set dic = Nothing
  56. End Function
  57.  
  58. Sub Test_MolMassa()
  59.     Debug.Print "H", MolMassa("H")
  60.     Debug.Print "O", MolMassa("O")
  61.     Debug.Print "H2O", MolMassa("H2O")
  62.    
  63.     Debug.Print "S", MolMassa("S")
  64.     Debug.Print "Al2", MolMassa("Al2")
  65.     Debug.Print "SO4", MolMassa("SO4")
  66.     Debug.Print "(SO4)3", MolMassa("(SO4)3")
  67.     Debug.Print "Al2(SO4)3", MolMassa("Al2(SO4)3")
  68.  
  69.     Debug.Print "H2(SO4)3", MolMassa("H2(SO4)3")
  70.  
  71.     Debug.Print "(CH3)3", MolMassa("(CH3)3")
  72.     Debug.Print "(CH3)3N", MolMassa("(CH3)3N")
  73.     Debug.Print "((CH3)3N)2", MolMassa("((CH3)3N)2")
  74. End Sub

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 4.2 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут