如何才能自动识别化学式并将部分数字改为下标?

网上有很多word文档的化学式的下标格式都没有,例如水就直接显示为H2O,没有显示下标,如果一篇文档全部没有下标的话有没有什么方法可以自动识别化学式并…
关注者
104
被浏览
54,071

12 个回答

@宋一喵

提醒,我只考虑了±1价的离子,确实是欠考虑。代码什么的我就不改了吧,大家领会意思就好了,(╯‵□′)╯︵┻━┻

谢邀。

VBA 来搞定这货。

因为用 VBA 分析哪些是化学式哪些是正文,确实有点困难。所以采用另外的方法,就是用户用鼠标选中化学方程式,然后点击一个按钮,然后上下标就完成了。算是半自动吧。

创建一个名为 Chemical 的宏。

点击创建后,会打开一个代码框,里面有 Word 自动生成的一段代码,删掉它,然后把下面的代码粘贴进去。

Sub Chemical()
    Dim Str As String
    ' 分子式的起始位置
    Dim Index As Integer
    ' 分子式的长度,我用 Str.Length 报错,只能曲线救国了……我对 VBA 也不是太熟
    Dim Length As Integer
    ' 遍历选中文本
    For Each c In Selection.Characters
        Select Case c
            Case " "
                ' 如果遇到空格
                If Str <> "+" And Str <> "→" Then
                    ' 而且不是连接符 + 或者 →
                    ' 调用函数 ChangeFont,改变这一个分子式的上下标
                    ChangeFont Index:=Index - Length, Length:=Length
                End If
                ' 改完后清空 Str
                Str = ""
                Length = 0
            Case Else
                ' 如果是其他字符,就认为是分子式,添加到分子式末尾
                Str = Str & c
                Length = Length + 1
        End Select
        Index = Index + 1
    Next c
    ' 调用函数 ChangeFont,改变这最后一个分子式的上下标
    ChangeFont Index:=Index - Length, Length:=Length
End Sub
Sub ChangeFont(ByVal Index As Integer, ByVal Length As Integer)
    ' 系数模式标记
    Dim CoefficientMode As Boolean
    ' 默认是 True
    CoefficientMode = True
    ' 我用 For i = Index to Index + Lenght - 1 和 Selection.Characters(i) 报错,所以只好这样了。
    Dim i As Integer    
    For Each c In Selection.Characters
        ' 遍历选中文本
        If i >= Index And i <= Index + Length - 1 Then
            ' 如果在该分子式范围内
            If c >= "0" And c <= "9" Then
                ' 且不是数字,则退出系数模式
                CoefficientMode = False
            End If
            ' 系数模式外的数字均为上下标
            If Not CoefficientMode Then
                ' 数字设置成下标
                If c >= "0" And c <= "9" Then
                    c.Font.Subscript = True
                End If
                ' +- 设置成上标
                If c = "+" Or c = "-" Then
                    c.Font.Superscript = True
                End If