Excel 5 のVBAを使っていた人にとって、次の Excel 95 のVBAで難儀な思いをされた方は多いかもしれない。というのも、内部で扱うコードが変わったからだ。
従来は、例えば あいうえおABCDE といった、全角と半角が混じった文字列の長さを取ると
・Len()関数では文字数の 10
・LenB()関数ではバイト数の 15 (全角が1文字2バイト、半角が1文字1バイト)
という値が返っていた。
ところがバージョンが上がったら
・Len()関数では文字数の 10
・LenB()関数ではバイト数の 20 (2バイトのUniCodeなので文字数の倍の値)
という値が返るようになった。それは今なお同様である。
確かに関数としては正しい動きなのかも知れない。しかし、それなら単に×2をしても求められるではないか。おかげで「全角文字がどれだけ混じっているか」というようなことをLenB関数の結果からLen関数の結果を引けば求められる、というようなことにはならず、いったんStrConvで変換してからとかすることになっている。
ただ、注意点として。StrConvでUniCodeからShiftJis+ASCIIに変換すると、内部的には「バイナリ」である訳で、変換したモノをRightB、LeftB、MidBなどで切り出すのはいいとしても、文字と一致するかを判定するには内部コードと同じUniCodeに戻してやらないといけない。
意外とこういうところではまることがあるので注意したい。
従来は、例えば あいうえおABCDE といった、全角と半角が混じった文字列の長さを取ると
・Len()関数では文字数の 10
・LenB()関数ではバイト数の 15 (全角が1文字2バイト、半角が1文字1バイト)
という値が返っていた。
ところがバージョンが上がったら
・Len()関数では文字数の 10
・LenB()関数ではバイト数の 20 (2バイトのUniCodeなので文字数の倍の値)
という値が返るようになった。それは今なお同様である。
確かに関数としては正しい動きなのかも知れない。しかし、それなら単に×2をしても求められるではないか。おかげで「全角文字がどれだけ混じっているか」というようなことをLenB関数の結果からLen関数の結果を引けば求められる、というようなことにはならず、いったんStrConvで変換してからとかすることになっている。
ただ、注意点として。StrConvでUniCodeからShiftJis+ASCIIに変換すると、内部的には「バイナリ」である訳で、変換したモノをRightB、LeftB、MidBなどで切り出すのはいいとしても、文字と一致するかを判定するには内部コードと同じUniCodeに戻してやらないといけない。
意外とこういうところではまることがあるので注意したい。