文字列の括弧をなんやかんやする

背景

練習がてら、文字列の括弧をなんやかんやするやつを作った。
ちょっと他所で使いそうなのでVBAで作った。

コード

Function Scan(St As String, h As Integer) As Variant()
'####################################################
'引数
'String:パーサ対象文字(250くらいまで)
'h :最大階層数
'返却値
'variant():二次元配列で(string, integer)
'例:(hoge(foo(piyo))hoge, 1) → (hoge,0) , (foo(piyo),1), (hoge,0)
'################################q###################

    'かっこがない時はそのまま返しておしまい
    If InStr(1, St, "(") = 0 And InStr(1, St, ")") = 0 Then
        Dim Arr_R2(1, 0) As Variant
        Arr_R2(0, 0) = St
        Arr_R2(1, 0) = 0
        Scan = Arr_R2
        Exit Function
    End If
    
    Dim i As Integer
    Dim buf_St As String: buf_St = ""   'キャッシュ
    
    Dim Buf_arr() As String '保存用
    ReDim Buf_arr(1, Len(St) - 1) '(0, n):開始文字、(1, n);それまでの階層
    '動的に要素数を決めるべきなんだろうけど面倒になった
    
    Dim buf As String   '参照文字列
    Dim q As Integer: q = 0 'ポインタ
    Dim hn As Integer: hn = 0 '階層

    For i = 1 To Len(St)
        buf = Mid(St, i, 1)
        
        If buf = "(" Then
            If hn < h And Len(buf_St) > 0 Then
                'hn => h の時はstackされない
                '各階層でつなげる必要はないのでpopもしちゃう
                Buf_arr(0, q) = buf_St
                Buf_arr(1, q) = hn
                buf_St = "": q = q + 1
            End If
            hn = hn + 1
        ElseIf buf = ")" Then
            If hn <= h And Len(buf_St) > 0 Then
                Buf_arr(0, q) = buf_St
                Buf_arr(1, q) = hn
                buf_St = "": q = q + 1
            End If
            hn = hn - 1
        End If
    
        '判定するの面倒だから手癖でやった
        If (hn > h Or Not buf = "(") And (hn >= h Or Not buf = ")") Then buf_St = buf_St & buf
    Next i
    
    'キャッシュ掃き出し
    Buf_arr(0, q) = buf_St
    Buf_arr(1, q) = 0
    
    '値が入っている要素の最大値を取る
    q = 0
    Do While Len(Buf_arr(0, q)) > 0
        q = q + 1
    Loop
    
    '返却用
    Dim Arr_R() As Variant
    ReDim Arr_R(1, q - 1)
    For i = 0 To q - 1
        Arr_R(0, i) = Buf_arr(0, i)
        Arr_R(1, i) = Val(Buf_arr(1, i))
    Next
    
    Scan = Arr_R
    
End Function

総括

いつも他人のVBAに文句言っているけど自分も大概。
それでもVBAは悪い文明。