t-hom’s diary

主にVBAネタを扱っているブログです。

Webで動くVBAチュートリアルを作りたい その8

さて、いよいよ命令を解釈して実行してみる。

まずは、VBAの命令を文字列として呼び出すために、Wrapperを作る。

Sub VBA_MsgBox(x)
    MsgBox (x)
End Sub

次に、その6で作ったGlobalDefinitionの最後の行にVBAFunctionの中身を変更するコードを記述。

    VBAFunctions.Item("MsgBox") = "VBA_MsgBox"

そして、命令を解釈して実行するRunCommandプロシージャを作成。

Sub RunCommand(Memory() As String)
    Dim s As New Stack  'データ用のスタック
    Dim p As New Stack  'プログラム用のスタック
    
    For i = 0 To UBound(Memory)
        If VBAFunctions.Exists(Memory(i)) Then
            'Memory(i)が命令だったら、プログラムスタックにPush
            p.Push (VBAFunctions.Item(Memory(i)))
        Else
            If Memory(i) <> Empty Then
                If s.Top = "&" Then
                    s.Pop
                    Dim l, r
                    l = s.Pop: r = Memory(i)
                    If Left(l, 1) = """" And Right(l, 1) = """" Then
                        l = Left(l, Len(l) - 1)
                    End If
                    If Right(r, 1) = """" And Right(r, 1) = """" Then
                        r = Right(r, Len(r) - 1)
                    End If
                    s.Push l & r
                Else
                    s.Push (Memory(i))
                End If
            End If
        End If
    Next i
    
    'Runコマンドにプログラムスタックと、データを渡して実行
    Call Run(p.Pop, s.Pop)
    
    'スタックが残っていたら出力
    Do While s.Top <> Empty
        Debug.Print s.Pop
    Loop
End Sub

そして、その6で作ったTesterプロシージャのPrinterを呼び出す箇所を今作ったRunCommandに置き換えて実行。

        'Call Printer(Memory)
        Call RunCommand(Memory)

ダブルクォーテーションがついたままであるが、とりあえず動いた。
演算子は&にしか対応していない。

あまり先のことを考えずにコーディングしてきたので、いまにも破綻しそうである。
そろそろコードの整理を進めないと。。

当ブログは、amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、 Amazonアソシエイト・プログラムの参加者です。