March 03, 2004

 Excelのマクロで四苦八苦

今日はExcelで、ものすごい量の単純労働を強いられている方から、どうにかならないのかと相談を持ちかけられました。一通り仕事の手順を聞いて「ああ、不毛だ」と思いながら、これならばマクロでどうにかなるかとオンラインヘルプを頼りに組み始めました。

小一時間ほどで大体のかたちが出来上がったのですが、いざ実行してみると期待通りの動作になりませんでした。マクロを見直して、セルの文字数のカウントが予想と違う挙動を示していました。

その挙動とは、LenB関数を使ってバイト列として文字列をカウントしたのですが、全角文字も半角文字も2バイトにカウントされてしまうものでした。これには弱ってしまいました。

困ったときのgoogleということで、いろいろと調べていくと、どうもExcelでは文字を内部的にはUnicodeで扱っているらしく、全角半角問わず2バイトとしてカウントされるとのことです。

そしてこの解決策として、文字を数える前に対象となる文字列を、StrConv関数を使ってUnicodeから規定のコードページに変換する必要があるそうです。

Sub chrcount()

' Unicode
   msgbox "Unicode:" + str(lenB("テストtest"))

' Default Code Page
    msgbox "Default CP:" + str(lenB(StrConv("テストtest", vbFromUnicode)))

End Sub

上の例ですと、Unicodeだと14文字、規定のコードページに変換すると10文字にそれぞれカウントされます。

投稿者 bitterbit : March 3, 2004 08:26 PM