t-hom’s diary

主にVBAネタを扱っているブログ…とも言えなくなってきたこの頃。

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

JavaScriptVBAもどきを作ろうという話のつづき。

 

とりあえず、簡単なところでMsgBox命令から実装しようと思ったが、これが実は結構むずかしかった。

「MsgBox "こんにちは"」を「window.alert("こんにちは")」に変換させるだけなら楽勝だが、実際のメッセージ命令は「MsgBox "こんにちは""" & name & """さん。" & vbNewLine & "お元気ですか?"」といった具合に複数の項目から成り立つことがある。

始めたばかりのJavaScriptでいきなりこれを考えるのは厳しいので、ひとまず使い慣れたVBAで作ってからあとでJavaScriptに置き換えることにした。 

文字列の組み立ての前に要素に分解する必要がある。

まずは、与えられた文字列を要素に分解して配列にそれぞれの要素を代入するコードを作ろうと思う。

配列
Memory(0) "こんにちは"""
Memory(1) &
Memory(2) name
Memory(3) &
Memory(4) """さん。"
Memory(5) &
Memory(6) vbNewLine
Memory(7) &
Memory(8) "お元気ですか?"

 

前段階として、ひとまず文字列とそれ以外の要素を分けられるようにした。

配列
Memory(0) "こんにちは"""
Memory(1)   & name & 
Memory(2) """さん。"
Memory(3)   & vbNewLine & 
Memory(4) "お元気ですか?"

 

できたのがコレ。

Sub test()

    Dim Memory() As String
    st = """こんにちは"""""" & Name & """"""さん。"" & vbNewLine & ""お元気ですか?"""
    buf = st
    sumlen = 0
    ReDim Memory(0)
    Do While sumlen < Len(st)
        sumlen = sumlen + Len(FindString(buf))
        Memory(UBound(Memory)) = FindString(buf)
        buf = Mid(st, sumlen + 1)
        ReDim Preserve Memory(UBound(Memory) + 1)
    Loop

    'ひとつMemoryを作りすぎるので、消す
    ReDim Preserve Memory(UBound(Memory) - 1)
    For Each x In Memory
        Debug.Print x
    Next
End Sub

 

Function FindString(ByVal st As String)
    If Left(st, 1) = """" Then
        'ひと文字目が「"」の場合は、
        '次の「"」までの文字を返して終了
        'ただし、「""」と2回続く場合はそのまま検索を継続し、
        'その次の「"」までを返す。
        For i = 2 To Len(st)
            If Mid(st, i, 1) = """" Then
                If Mid(st, i, 2) = """""" Then
                    i = i + 1
                Else
                    FindString = Left(st, i)
                    Exit Function
                End If
            End If
        Next i
    Else
        'ひと文字目が「"」以外の場合は、
        '次の「"」の手前までの文字を返して終了
        For i = 2 To Len(st)
            If Mid(st, i, 1) = """" Then
                FindString = Left(st, i - 1)
                Exit Function
            End If
        Next
    End If
    '終了条件が見つからなければ、引数をそのまま返す。
    FindString = st
End Function

 

変数名はテキトー。宣言もしてないが、初版の開発中はロジックに集中したいので、その他のことは後回し。今日はここまでにしよう。変数周りは後日また整理しようと思う。

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