夜更かし(;´▽`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
スライド1のtext というテキストボックスから値を取ります。
結果はイミディエイトウィンドウに
係数は 10
化学式中は
Na原子が 2 個
H原子が 1 個
C原子が 4 個
O原子が 3 個
こんな感じで吐き出します。
時間がなかったので,原子数が二けた以上がまだ想定されていません。
全角を許可したくなかったので,strconvを使ったら,上付き下付きが外れました(;´▽`A``
未完成だけどこんな感じのことも,スマートにやれるようにしたい。
とりあえずたたき台(ΦωΦ)