読者です 読者をやめる 読者になる 読者になる

t-hom’s diary

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

VBA String型とByte型配列の相互変換を使ってLeft関数を自作する。

VBA

先日購入した英語のVBA本にVBAが内部でどのようにString型を扱っているのかが詳しく書いてある。thom.hateblo.jp

どうやらVBAのString型とはByte型の配列と等価であるらしく、相互に代入できるようだ。

    Dim ByteArray() As Byte
    ByteArray = "Hello"
    Debug.Print ByteArray

やや扱いが難しいのは、1文字に2バイト使用する点くらいである。

さて、このテクニックを使って、VBAのLeft関数を模倣してみた。

Function MyLeft(x As String, n As Long) As String
    Dim ByteArray() As Byte
    ByteArray = x
    Dim ByteArray2() As Byte
    n = n * 2
    ReDim ByteArray2(n)
    For i = 0 To n - 1
        ByteArray2(i) = ByteArray(i)
    Next
    MyLeft = ByteArray2
End Function

すでにある関数なので実用性は無いが、内部動作を知るうえでは恰好の学習材料となる。

ついでにRight関数も作ってみた。

Function MyRight(x As String, n As Long) As String
    Dim ByteArray() As Byte
    ByteArray = x
    Dim ByteArray2() As Byte
    n = n * 2
    ReDim ByteArray2(n)
    For i = 0 To n - 1
        ByteArray2(i) = ByteArray(UBound(ByteArray) - n + 1 + i)
    Next
    MyRight = ByteArray2
End Function

それらを使ったサンプル

Sub test()
    Debug.Print MyLeft("Hello", 3)
    Debug.Print MyRight("Hello", 3)
End Sub

シンプルなコードであるが、MyRight関数を作る際に思わぬところでつまづいた。

何をどうやっても、Helloの最後の3文字だけ表示ができないのだ。
f:id:t-hom:20150929211752p:plain

4文字を指定すると、"ello"が表示される。
2文字だとlo。
でも3文字でもlo。

なにこれ。。

Len関数ではちゃんと3が返ってくる。

まさかと思ってイミディエイトからコピーしてメモ帳に張り付けると、"llo"が張り付いた。

それでVBEのフォントサイズを10から12に変えたら。。
f:id:t-hom:20150929212450p:plain

Oh My 。。

ひたすらコードを疑ったあとに全然関係ないところに原因が出てくるとけっこうがっくり来る。

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