先日購入した英語の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文字だけ表示ができないのだ。
4文字を指定すると、"ello"が表示される。
2文字だとlo。
でも3文字でもlo。
なにこれ。。
Len関数ではちゃんと3が返ってくる。
まさかと思ってイミディエイトからコピーしてメモ帳に張り付けると、"llo"が張り付いた。
それでVBEのフォントサイズを10から12に変えたら。。
Oh My 。。
ひたすらコードを疑ったあとに全然関係ないところに原因が出てくるとけっこうがっくり来る。