我需要在 Excel 中使用 IUPAC(国际理论与应用化学联合会)名称计算出有关支链烷烃结构的信息。我已将问题分解为多个步骤,并且为每个步骤都包含了示例。任何步骤的帮助将不胜感激。我需要自动化该方法,因为我可能有数千个这样的名字需要处理。
第一步
我需要算出主链中的碳原子数。按照惯例,主链的名称出现在整体名称的最后。例如,2,2,3-三甲基辛烷中的主链是辛烷。正则表达式可以用来查找主链的名称,然后用来查找主链中的碳原子吗?下表提供了更多示例。
支链烷烃名称 | 主链 | 主链中的碳原子 |
---|---|---|
2-甲基丙烷 | 丙烷 | 3 |
2-甲基丁烷 | 丁烷 | 4 |
3-乙基戊烷 | 戊烷 | 5 |
3-甲基己烷 | 己烷 | 6 |
4-丙庚烷 | 庚烷 | 7 |
2-甲基辛烷 | 辛烷值 | 8 |
3-乙基壬烷 | 壬烷 | 9 |
5-甲基癸烷 | 癸烷 | 10 |
6-丁基十一烷 | 十一烷 | 11 |
3-乙基十二烷 | 十二烷 | 12 |
Excel 中的自定义 UDF 可以命名为 MainChainRegex,=MainChainRegex(2,2,3-trimethyloctane) 将返回值 8。
第二步
我还需要计算出连接到每个主链碳原子上的侧链碳原子数。例如,3-乙基戊烷有两个侧链碳原子连接到主链中的第三个碳原子,请参见下图。 “乙基”术语是指含有两个碳原子的侧链。 “乙基”前面的“3-”告诉我们侧链连接到主链中的碳原子 3。
Excel 中的自定义 UDF 可以命名为 SideChainRegex 并且 =SideChainRegex(3-ethylpentane) 将在五个单元格中返回 0, 0, 2, 0, 0 的数组。主链中的碳原子数可用于调整数组的大小,数组中的第一个和最后一个值将始终为零。
第三步
当有多个侧链时,问题变得更加复杂。例如,2,2-二甲基丁烷有两条侧链,总共包含两个碳原子,请参见下图。 “甲基”术语是指含有一个碳原子的侧链。 “di”指的是这样一个事实,即有两个这样的侧链,这意味着我们需要在“二甲基”术语之前寻找两个数字。 “二甲基”前面的“2,2-”告诉我们两条侧链都连接到主链的第 2 个碳原子上。如果 Excel 中的自定义 UDF 被命名为 SideChainRegex,那么 =SideChainRegex(2,2-dimethylbutane) 将需要在四个单元格中返回一个 0、2、0、0 的数组——数组的大小同样取决于主链
第四步
更复杂的情况是存在不止一种类型的侧链。例如,5-ethyl-2,2-dimethylheptane 有两种不同类型的侧链,见下图。如果 Excel 中的自定义 UDF 名为 SideChainRegex,则 =SideChainRegex(5-ethyl-2,2-dimethylheptane) 需要在七个单元格中返回 0, 2, 0, 0, 2, 0, 0 的数组以总计连接到每个主链碳原子的侧链碳原子数。
下表提供了可能有用的更多信息。
学期 | 开学前要找多少个数字 |
---|---|
迪 | 2 |
三 | 3 |
利乐 | 4 |
五角星 | 5 |
六边形 | 6 |
七 | 7 |
八角 | 8 |
学期 | 侧链碳原子数 |
---|---|
甲基 | 1 |
乙基 | 2 |
丙基 | 3 |
丁基 | 4 |
戊基 | 5 |
己基 | 6 |
庚基 | 7 |
辛基 | 8 |
编辑:没有完全阅读您的问题并跳转到“碳原子总数”......您可以尝试获取 SMILES 并计算括号内/外的 C.
这里有一个使用 PubChem API 从 IUPAC 名称获取 MF 的例子:
Sub Tester()
Debug.Print IUPACToSmiles("2,2-dimethylbutane")
End Sub
Function IUPACToSmiles(IUPAC As String) As String
Const SVC_URL As String = "https://pubchem.ncbi.nlm.nih.gov/rest/pug/" & _
"compound/name/<iupac>/property/CanonicalSMILES/TXT"
Dim json As Object, objhttp As Object
Set objhttp = CreateObject("MSXML2.XMLHTTP")
objhttp.Open "Get", Replace(SVC_URL, "<iupac>", URLEncode(IUPAC)), False
objhttp.Send
IUPACToSmiles = objhttp.responsetext
Debug.Print IUPAC, IUPACToSmiles
End Function
Public Function URLEncode(StringVal As String, Optional SpaceAsPlus As Boolean = False) As String
Dim StringLen As Long: StringLen = Len(StringVal)
If StringLen > 0 Then
ReDim result(StringLen) As String
Dim i As Long, CharCode As Integer
Dim Char As String, Space As String
If SpaceAsPlus Then Space = "+" Else Space = "%20"
For i = 1 To StringLen
Char = Mid$(StringVal, i, 1)
CharCode = Asc(Char)
Select Case CharCode
Case 97 To 122, 65 To 90, 48 To 57, 45, 46, 95, 126
result(i) = Char
Case 32
result(i) = Space
Case 0 To 15
result(i) = "%0" & Hex(CharCode)
Case Else
result(i) = "%" & Hex(CharCode)
End Select
Next i
URLEncode = Join(result, "")
End If
End Function
API参考:https://pubchem.ncbi.nlm.nih.gov/docs/pug-rest
要运行它(如果您改为选择 JSON 格式的输出选项),您需要从此处的项目导入 JsonConverter.bas 文件:https://github.com/VBA-tools/VBA-JSON并添加对 Microsoft 脚本运行时
的 VBA 项目引用