化学式の添え字だけを下付けにする

最近、こちら↓のブログ(chemiphysさん)の読者になった。

chemiphys.hateblo.jp

上記テーマに於いてchemiphysさんは、「化学反応式の添え字を下付き文字にするマクロ」に挑戦しておられる。面白そうなテーマなので、chemiphysさんのアプローチ(正規表現)による成果がブログで語られるのを楽しみにしつつ、それ以外の方法でできないか挑戦してみた。

f:id:Infoment:20181008185808p:plain

今日やりたいこと

Excel で、化学反応式の添え字を下付き文字にする。
例)
f:id:Infoment:20181008190309p:plain

今回は先頭から一文字ずつ、それが下付き文字にすべきか否かを配列化することにした。なお、元となった考え方は↓こちら(いつも有難うございます)。
thom.hateblo.jp

必要なこと

  1. クラスモジュールの作成
  2. 一文字ずつの登録と判定
  3. セル値について下付処理

1.クラスモジュールの作成

今回下付きとなる条件を整理してみる。

  1. 下付きとなるのは、数字のみである。
  2. 数字①の前がアルファベットの場合、数字①は下付きとなる。
  3. 数字②の前が「数字①で且つ下付き」である場合、数字②は下付きとなる。

以上の条件から、取得する情報は以下の3つとした。

  1. 値そのもの
  2. 数字か否かの判定フラグ
  3. 下付か否かの判定フラグ
【クラスモジュール】(CharacterClass)
Option Explicit
Public Value As String
Public IsNumericFalg As Boolean
Public SubScriptFlag As Boolean

2.一文字ずつの登録と判定

今回は簡単のため、マクロの中に直接数式を記入している。実用の際は、もう一手間が必要になる。手順としては、以下の通り。

  1. 一文字ずつMID関数で取り出して、数字か否かを確認する。
  2. 1文字目は必ず、下付きにならない。
  3. 2文字目以降で数字の場合、数字フラグをTrueにする。
  4. 数字フラグがTrueである場合、下付きの条件に合致するか否かを確認する。
【標準モジュール】(前半)
Sub ConvertToLowerCase()
    
    Dim ChemicalFormula As String
        ChemicalFormula = "MnO2+4HCl→MnCl2+2H2O+Cl2"
        
    Dim CC() As CharacterClass
    ReDim CC(1 To Len(ChemicalFormula))
    
    Dim i As Long
        For i = 1 To UBound(CC)
            Set CC(i) = New CharacterClass
                CC(i).Value = Mid(ChemicalFormula, i, 1)
                CC(i).IsNumericFalg = IsNumeric(CC(i).Value)
                If CC(i).IsNumericFalg = True Then
                    If i = 1 Then
                        CC(i).SubScriptFlag = False
                    ElseIf CC(i - 1).Value Like "[A-Za-z]" Then
                        CC(i).SubScriptFlag = True
                    ElseIf CC(i - 1).SubScriptFlag = True Then
                        CC(i).SubScriptFlag = True
                    Else
                        CC(i).SubScriptFlag = False
                    End If
                End If
        Next

3.下付か否かの判定フラグ

先ほど取得した情報を元に一文字ずつ、下付フラグがTrueの文字のみ下付けにする。

【標準モジュール】(後半)
        Range("A1").Value = ChemicalFormula
        For i = 1 To UBound(CC)
            Range("A1").Characters(Start:=i, Length:=1).Font.Subscript = CC(i).SubScriptFlag
        Next

End Sub

結果

添え字のみ下付けになった。
↓ ステップ送りで実行
f:id:Infoment:20181009061057g:plain

参考まで。