テキストボックスの全角と半角を区別する


現在のExcelは、Unicode(ユニコード)という文字コードで文字を扱っています。Unicodeとは何かを解説すると、かなり難しく、かつ長い話になってしまいますので、そのへんをお知りになりたい方は、がんばって勉強してください。ただ、Unicodeの特徴を1つだけ簡単に表すと「従来の全角(2バイト文字)と半角(1バイト文字)という区別がなく、日本語もアルファベットも数字も、すべて2バイトで表される」ということです。ザックリ言えば。

そもそも、全角/半角という用語自体、最近では死語かもしれませんね。昔々、パソコンがMS-DOSというOSで動いていたとき、今のWindowsのように、自由な位置に、自由な大きさの文字を表示することはできませんでした。パソコンの画面では、アルファベット1文字を基準に位置が決められていましたが、形の複雑な日本語は、そんな狭いエリアには表示しきれません。そこで、日本語は「アルファベット2文字分のスペース」に表示することにしました。

日本語を基準に見たとき、アルファベットは日本語の"半分"の幅で表示されることから、アルファベットや数字などを「半角文字」と呼び、コンピュータの世界では、本当はそっちの方がイレギュラーだった日本語を「全角文字」と呼びました。

そして、その当時の文字コード体系では、アルファベットや数字は「1バイト」で表せたのに対して、文字数の多い日本語は「2バイト」の情報が必要でした。以上のことから、文字の大きさから「全角/半角」という区別が生まれ、文字データの大きさから「2バイト文字/1バイト文字」と区分されるようになりました。

まぁ、難しい話と、昔話はこれくらいにして、要するに「いわゆる半角文字と、いわゆる全角文字を区別するにはどうしたらいいか」ということです。まずは、文字数を調べるLen関数でやってみましょう。

"田中"は日本語で全角ですから、2バイト換算で「2文字×2バイト=4バイト」となり、半角のアルファベットは「4文字×1バイト=4文字」の合計「8文字」という結果が欲しいです。

Private Sub CommandButton1_Click()
    MsgBox Len(TextBox1.Text)
End Sub

上に書いたとおり、現在のUnicodeは全角も半角も2バイトで表しますので、どちらも同じ1文字とカウントされます。Excelの機能で「全角/半角を問わない」という仕様は、こういうことだったんですね。

こんなときは、文字コードを変換します。使うのはStrConv関数です。詳しくは下記のページをご覧ください。いろんな変換ができる便利な関数ですよ。

VBAの関数リファレンス「StrConv関数」

そして、文字数を返すLen関数ではなく、バイト数を返すLenB関数で調べます。

Private Sub CommandButton1_Click()
    Dim buf As String
    buf = StrConv(TextBox1.Text, vbFromUnicode)
    MsgBox LenB(buf)
End Sub