Powerpoint VBAを使おう!

Powerpoint VBAやExcelのVBAで遊んでいます。Word VBAも始めました。

正規表現 さらに続き

とても地味な記事が続いていますね。でもこれは乗り越える必要があるところなので,まだやってます。

前回は化学反応式を簡単な部品に分けることをやりましたので,さらにさらに分けることに取り組んでみました。

とはいえ,ムズカシイ。なんとなくパーツの意味はわかっている実感はあるんですが,うまく書けないです。

特にSubMatchesを使いこなしたいんですが,思い通りにはいきませんでした。

ただ,そのまま負けるのもくやしいので,二段階でやろうと思い,とにかくばらばらに分解することをやりました。

Sub test2()
    Dim Regex As VBScript_RegExp_55.RegExp, subRegEx As VBScript_RegExp_55.RegExp
    Set Regex = New VBScript_RegExp_55.RegExp
    Set subRegEx = New VBScript_RegExp_55.RegExp
    
    Dim ret As VBScript_RegExp_55.MatchCollection
    Dim RegMatches As VBScript_RegExp_55.MatchCollection
    Dim RegMatches2 As VBScript_RegExp_55.MatchCollection
    Dim Chem As Variant
    
    Dim strChem As String
    strChem = "Ca(OH)2+2HCl→CaCl2+2H2O"
    Dim strPattern As String
    strPattern = "[0-9A-Za-z\(\)]+|! +|→"
    
    With Regex
        .Pattern = strPattern
        .IgnoreCase = False
        .Global = True
        Set RegMatches = .Execute(strChem)
    End With
    
    Dim Result As Collection: Set Result = New Collection
    
    Dim strPattern2 As String
    strPattern2 = "([0-9]+|[A-Z][a-z]?)|\(|\)"
    
    For Each Chem In RegMatches
        With subRegEx
            .Pattern = strPattern2
            .IgnoreCase = False
            .Global = True
            Set RegMatches2 = .Execute(Chem)
        End With
        Result.Add RegMatches2
    Next
    
    Dim i As Long, j As Long
    For i = 0 To RegMatches.Count - 1
        Debug.Print RegMatches(i)
        For j = 0 To Result(i + 1).Count - 1
            Debug.Print vbTab; Result(i + 1)(j)
        Next
    Next

End Sub

実行すると,イミディエイトウィンドウに結果を吐き出します。

Ca(OH)2
    Ca
    (
    O
    H
    )
    2
2HCl
    2
    H
    Cl
→
CaCl2
    Ca
    Cl
    2
2H2O
    2
    H
    2
    O

こんな感じです。ほんとバラバラにできました。

チェックとしてこんなのも

strChem = "2NaHCO3→Na2CO3+H2O+CO2"

2NaHCO3
    2
    Na
    H
    C
    O
    3
→
Na2CO3
    Na
    2
    C
    O
    3
H2O
    H
    2
    O
CO2
    C
    O
    2

ちゃんと動いてそうですよね。

これだけのことを今回のコードの長さでできる時点ですごいなと思いますが,もっとうまく書ければたぶん,一発でSubMatchesまで含めて完全に分解できる力があると思うんですよね。

修業が足りませんね(;´▽`A``

引き続き精進します。