化学式の添え字だけを下付けにする
最近、こちら↓のブログ(chemiphysさん)の読者になった。
上記テーマに於いてchemiphysさんは、「化学反応式の添え字を下付き文字にするマクロ」に挑戦しておられる。面白そうなテーマなので、chemiphysさんのアプローチ(正規表現)による成果がブログで語られるのを楽しみにしつつ、それ以外の方法でできないか挑戦してみた。
今日やりたいこと
Excel で、化学反応式の添え字を下付き文字にする。
例)
今回は先頭から一文字ずつ、それが下付き文字にすべきか否かを配列化することにした。なお、元となった考え方は↓こちら(いつも有難うございます)。
thom.hateblo.jp
必要なこと
- クラスモジュールの作成
- 一文字ずつの登録と判定
- セル値について下付処理
1.クラスモジュールの作成
今回下付きとなる条件を整理してみる。
- 下付きとなるのは、数字のみである。
- 数字①の前がアルファベットの場合、数字①は下付きとなる。
- 数字②の前が「数字①で且つ下付き」である場合、数字②は下付きとなる。
以上の条件から、取得する情報は以下の3つとした。
- 値そのもの
- 数字か否かの判定フラグ
- 下付か否かの判定フラグ
【クラスモジュール】(CharacterClass)
Option Explicit Public Value As String Public IsNumericFalg As Boolean Public SubScriptFlag As Boolean
2.一文字ずつの登録と判定
今回は簡単のため、マクロの中に直接数式を記入している。実用の際は、もう一手間が必要になる。手順としては、以下の通り。
- 一文字ずつMID関数で取り出して、数字か否かを確認する。
- 1文字目は必ず、下付きにならない。
- 2文字目以降で数字の場合、数字フラグをTrueにする。
- 数字フラグが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
結果
添え字のみ下付けになった。
↓ ステップ送りで実行
参考まで。