文字列が半角文字か全角文字かを調べるには?

Question 25.3 Previous Next
大変楽しく読ませていただきました。
質問ですが、変数の内容を調べる方法がわかりません? "ABC123"と"ABC123"の違いを判断したいのです。教えてください。
Answer   Copyright (C) 2000.2.22 永井善王
"ABC123"と"ABC123"の違いとは、全角文字列か半角文字列かを判定したいのでしょうか? そうだとすれば、その文字列の文字数と、保存に必要なバイト数を取得して結果を比較すれば、ある程度判定できます。
具体的には、1:1なら半角、1:2なら全角、それ以外(有効な文字列)ならば混在と判定して良いでしょう。短い質問で何のために、それをしたいのか推定しかねますので、質問文の範囲内でお答えします。
VBAには色々な手法がありますので他の方法も可能と思いますが、ここでは上記の方法で回答します。
school
文字列の文字数を求めるには Len関数を、保存に必要なバイト数を求めるには LenB関数を用います。 この LenB関数は、Excel95では簡単に使えたのですが、Excel2000(97も同じ)では少々難しくなりました。
それは、ユニコードが使われるようになったために、それまでは 1バイトであった半角文字が、全角文字と同様に 2バイトに変わりました。 よって、単純に LenB関数でバイト数を取得すると、半角でも全角でも上記の比率が 1:2になってしまい、判別不可能です。

ではどうすれば良いかですが、StrConv関数を組み合わせます。この関数は、指定された方法で文字列を変換してくれます。 大文字⇔小文字変換、半角⇔全角変換、ひらがな⇔カタカナ変換などのほかに、ユニコード⇔システム既定コード変換があります。 そして、ユニコードから既定コードに変換するには、定数 vbFromUnicode を指定します。 くわしく知りたければ、後述のサンプルブックをダウンロードして、解説を読んでください。

1. 文字数を求める Len関数のマクロコードは、次のように書けばよいでしょう。
    文字列a = "ABC123"                        'すべて全角文字
    文字数a = Len(文字列a)
2. 文字列をUnicodeから既定コードに変換して、バイト数を取得するためのユーザー定義関数のマクロは、次のとおりです。
Function バイト数関数(ByVal 文字列 As String)
    バイト数関数 = LenB(StrConv(文字列, vbFromUnicode))
End Function
3. このほかに前述の比率が 1:1か、1:2か、それ以外かを判別するための If~Then~Else文などのマクロが必要でしょう。 あなたのニーズに合わせて組んでみてください。
サンプルブックのダウンロードは ここをクリック  (YNxv9872_LenB.xls 56KB)
※ 一旦、ブックをハードディスクに保存し、後で改めて開いてから実行してください。

 

Excel VBA Macro