Excel VBA Macro ・ 値の操作 ・ FAQ
文字列が半角文字か全角文字かを調べるには?
Question 25.3
大変楽しく読ませていただきました。
質問ですが、変数の内容を調べる方法がわかりません? "ABC123"と"ABC123"の違いを判断したいのです。
教えてください。
Answer
Copyright (C) 2000.2.22 永井善王
"ABC123"と"ABC123"の違いとは、全角文字列か半角文字列かを判定したいのでしょうか? そうだとすれば、その文字列の文字数と、保存に必要なバイト数を取得して結果を比較すれば、ある程度判定できます。
具体的には、1:1なら半角、1:2なら全角、それ以外(有効な文字列)ならば混在と判定して良いでしょう。
短い質問で何のために、それをしたいのか推定しかねますので、質問文の範囲内でお答えします。
VBAには色々な手法がありますので他の方法も可能と思いますが、ここでは上記の方法で回答します。
文字列の文字数を求めるには 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) ※ 一旦、ブックをハードディスクに保存し、後で改めて開いてから実行してください。