インストールレスプログラミング( ´ー`)

VBA , JavaScript , HTAなど 365アプリはインストール必要ですが、仕事に無いケースはほぼないから(・_・;)

夜更かし(;´▽`A`` 化学式の分解① 続かないかも(ΦωΦ)

本職の化学のほう。

化学反応式シミュレーションでは,化学式中の各元素の数値は手入力で1分子中の数を入れ,
それをもとに係数を含めたものの中の各元素の数を計算で求めていました。

最初のところをどうにかしたかったけど,その時は後回しにしていました。

今回ちょっと考えてみた。夜更かしになった(;´▽`A``

AM5:30起きなのにトマラナカッタ

Option Explicit

Sub a()
Dim TSlide As Slide: Set TSlide = ActivePresentation.Slides(1)
Dim TRG As TextRange: Set TRG = TSlide.Shapes("text").TextFrame.TextRange
Dim tmpTRG As TextRange
Dim EachCharacter() As String
ReDim EachCharacter(1 To Len(TRG))
Dim n As Long

TRG = StrConv(TRG, vbNarrow)

For Each tmpTRG In TRG.Characters
    If IsNumeric(tmpTRG) = True Then
        EachCharacter(tmpTRG.Start) = "数値"
    ElseIf tmpTRG = Mid(UCase(TRG), tmpTRG.Start, 1) Then
        EachCharacter(tmpTRG.Start) = "大文字"
    Else
        EachCharacter(tmpTRG.Start) = "小文字"
    End If
Next

Dim colAtom As Collection: Set colAtom = New Collection
Dim colGenshisuu As Collection: Set colGenshisuu = New Collection

Dim i As Long: i = 1
Dim Keisu As String

Do While EachCharacter(i) = "数値"
    Keisu = Keisu & TRG.Characters(i)
    i = i + 1
Loop


Dim Genshisuu As String

Do While i <= Len(TRG)
    If EachCharacter(i) = "大文字" Then
        If EachCharacter(i + 1) = "小文字" Then
            colAtom.Add TRG.Characters(i, 2)
            i = i + 1
        Else
            colAtom.Add TRG.Characters(i, 1)
        End If
    End If
    i = i + 1
    Genshisuu = ""
    If i <= Len(TRG) Then
        If EachCharacter(i) = "数値" Then
            
'            Do While EachCharacter(i) = "数値"
'                Genshisuu = Genshisuu & TRG.Characters(i)
'                i = i + 1
'            Loop
            colGenshisuu.Add CLng(TRG.Characters(i))
            i = i + 1
        Else
            colGenshisuu.Add 1
        End If
    End If
Loop

i = 1
Debug.Print "係数は"; CLng(Keisu)
Debug.Print "化学式中は"
Do
    Debug.Print colAtom(i); "原子が"; colGenshisuu(i); "個"
    i = i + 1
Loop Until i = colAtom.Count + 1



End Sub

f:id:chemiphys:20170119002445p:plain
スライド1のtext というテキストボックスから値を取ります。

結果はイミディエイトウィンドウに

係数は 10
化学式中は
Na原子が 2 個
H原子が 1 個
C原子が 4 個
O原子が 3 個

こんな感じで吐き出します。

時間がなかったので,原子数が二けた以上がまだ想定されていません。

全角を許可したくなかったので,strconvを使ったら,上付き下付きが外れました(;´▽`A``

未完成だけどこんな感じのことも,スマートにやれるようにしたい。

とりあえずたたき台(ΦωΦ)