JavaScriptでVBAもどきを作ろうという話のつづき。
とりあえず、簡単なところで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
変数名はテキトー。宣言もしてないが、初版の開発中はロジックに集中したいので、その他のことは後回し。今日はここまでにしよう。変数周りは後日また整理しようと思う。