文字列が英字(アルファベット)だけか判定するには
文字列に含まれる文字の種類が英字だけか調べたいことがあります。”abcABC” なら英字のみである、”A1″ なら英字のみではない、と判定したいような場合です。
なお、文字列から英字を抽出したい場合は「VBAで文字列から英字のみを抽出する」をご参照ください。
VBAの場合、文字の種類を調べる手段には主に2つあります。Like演算子を使う方法と、正規表現を扱うRegExpクラスを使う方法です。
どちらを使ってもいいのですが、RegExpクラスは参照設定かCreateObject関数で利用できるようにしなければならず、その部分で少し処理速度に影響があるため、ここではLike演算子を使う方法を紹介します。
Like演算子で文字列が英字だけか判定する関数
以下の関数はLike演算子を使って引数の文字列が英字だけかどうかを判定します。戻り値の型はBooleanで、英字のみの場合はTrue、英字以外がある場合はFalseを返します。
Like演算子は正規表現のように[a-z]のように文字範囲を指定できます。
10行目で「Not str Like “*[!a-zA-Za-zA-Z]*”」としていますが、これは「str Like “*[!a-zA-Za-zA-Z]*”」の部分で「a-zA-Za-zA-Zのいずれでもない文字」を探して、それがあればTrueを返しておいて、Not演算子でFalseに反転させています。
そのため、”abc”のような英字のみの場合は「a-zA-Za-zA-Zのいずれでもない文字」を探しても存在しないためFalseを返して、NotでTrueに反転させています。
知りたいのは文字列の全ての文字が英字かどうかのため、このように!を使って英字以外を探して「英字以外([!a-zA-Za-zA-Z])が見つかった。それはダメ(Not)」としています。
また、引数の文字列が未設定の場合は英字ではないと判定するようにしています。
1 2 3 4 5 6 7 8 9 10 11 |
Function IsAlpha(str As String) As Boolean '// 文字列が未設定の場合 If str = "" Then '// 英字ではないとしてFalseを返す IsAlpha = False Exit Function End If '// 文字列の全ての文字が英字の場合はTrue、そうでない場合はFalseを返す IsAlpha = Not str Like "*[!a-zA-Za-zA-Z]*" End Function |
使い方
単純な使い方と、複数の文字列がある場合の使い方をそれぞれ説明します。
まずは単純に文字列を渡す場合の使い方です。String型の変数を渡して、結果をイミディエイトウィンドウに出力しています。
1 2 3 4 5 6 7 8 9 |
Sub IsAlphaTest1() Dim s As String s = "abc" Debug.Print IsAlpha(s) s = "あいう" Debug.Print IsAlpha(s) End Sub |
実行結果
True(”abc”は英字のみである)
False(”あいう”は英字のみではない)
次の例は、いくつかの種類の文字列を複数用意して、英字かどうかをそれぞれ判定しています。元の文字列は面倒なので縦線(バーティカルバー)で区切ってSplit関数で配列化して、それをループして判定するようにしています。なんのこっちゃ分からない場合は実行結果を見ると意味が分かると思います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Sub IsAlphaTest2() Dim s As String Dim v Dim c As String Dim ret s = "|a|aa|A|AZ|aa1|1|12|12A|@|*|AZac|ab|ab1|C" v = Split(s, "|") Dim i For i = 0 To UBound(v) c = v(i) ret = IsAlpha(c) Debug.Print """" & c & """ : " & ret Next End Sub |
実行結果
“” : False
“a” : True
“aa” : True
“A” : True
“AZ” : True
“aa1” : False
“1” : False
“12” : False
“12A” : False
“@” : False
“*” : False
“AZac” : True
“ab” : True
“ab1” : False
“C” : True