文字列が英字(アルファベット)だけか判定するには
Excelで文字列処理を行う際、文字列に含まれる文字の種類が英字だけか調べたいことがあります。例えば、商品コードの形式チェックや、ユーザー入力の妥当性検証などです。”abcABC” なら英字のみである、”A1″ なら英字のみではない、と判定したいような場合です。
この記事では、VBAで文字列が英字(アルファベット)だけで構成されているかを判定する方法を、実用的なサンプルコードと共に詳しく解説します。
文字列が英字だけか判定する場面とは
文字列が英字のみかどうかを判定したい具体的な場面:
- 商品コードの妥当性チェック:「ABC123」のような形式で、英字部分だけを検証したい。
- ユーザー入力の検証:名前の入力欄で英字のみを許可したい。
- データクリーニング:大量のデータから英字のみのレコードを抽出したい。
- システム連携:他システムへの送信前に、英字のみのフィールドを確認したい。
判定例:
- “abcABC” → 英字のみ(True)
- “A1” → 数字が含まれる(False)
- “Hello World” → スペースが含まれる(False)
- “abc” → 全角英字のみ(True)
なお、文字列から英字を抽出したい場合は「VBAで文字列から英字のみを抽出する」をご参照ください。
VBAで文字種判定を行う2つの方法
VBAの場合、文字の種類を調べる手段には主に2つあります。
1. Like演算子を使用する方法(推奨)
- メリット:処理が高速、追加の設定不要。
- デメリット:複雑なパターンマッチングには限界がある。
2. 正規表現(RegExpクラス)を使用する方法
- メリット:柔軟なパターンマッチング(数字のみ、英字のみ、その他いろいろ)が可能。
- デメリット:参照設定やCreateObject関数が必要、処理速度がやや劣るがほとんど気にならない。
どちらを使ってもいいのですが、事前に検証するとLike演算子の方法が正規表現の方法より若干高速だったのと、一般的には使いやすいだろう、ということで本記事では処理速度と簡潔性を重視し、Like演算子を使用した方法を中心に解説します。
Like演算子で文字列が英字だけか判定する関数
以下の関数はLike演算子を使って引数の文字列が英字だけかどうかを判定します。戻り値の型はBooleanで、英字のみの場合はTrue、英字以外がある場合はFalseを返します。引数の文字列が未設定の場合は英字ではないと判定するようにしています。
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 |
関数の動作
この関数の核心部分 10行目「Not str Like "*[!a-zA-Za-zA-Z]*"
」 について詳しく説明します。
Like演算子は正規表現のように、 [a-z]
という書き方で文字範囲を指定できます。
1. [!a-zA-Za-zA-Z]
:英字以外の文字を表すパターン
!
:「〜以外」を表す否定記号a-z
:半角小文字英字の範囲A-Z
:半角大文字英字の範囲a-z
:全角小文字英字の範囲A-Z
:全角大文字英字の範囲
2. *[!a-zA-Za-zA-Z]*
:英字以外の文字が含まれているかを検索
- 前後の
*
は「任意の文字数」を表すワイルドカード
3. Not
演算子:結果を反転
- 英字以外が見つかった場合:False → True(英字のみではない)
- 英字以外が見つからない場合:True → False(英字のみ)
基本的な使い方
単純な使い方と、複数の文字列がある場合の使い方をそれぞれ説明します。まずは単純に文字列を渡す場合の使い方です。String型の変数を渡して、結果をイミディエイトウィンドウに出力しています。
1 2 3 4 5 6 7 8 9 10 11 12 |
Sub IsAlphaTest1() Dim s As String s = "abc" Debug.Print IsAlpha(s) s = "あいう" Debug.Print IsAlpha(s) s = "ABC123" Debug.Print IsAlpha(s) End Sub |
実行結果
True(”abc”は英字のみであるため、True)
False(”あいう”は英字のみではないため、False)
False(”ABC123″は英字のみではないため、False)
複数文字列の一括判定での使い方
次の例は、いくつかの種類の文字列を複数用意して、英字かどうかをそれぞれ判定しています。元の文字列は面倒なので縦線(バーティカルバー。パイプと言う方が多い)で区切ってSplit関数で配列化して、それをループして判定するようにしています。なんのこっちゃ分からない場合は実行結果を見ると意味が分かると思います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
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が配列になる) 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
実業務での活用例
1. Excelセルの値をチェックする関数
A1セルからA10のセルの範囲で英字のみのセルには緑色、そうでないセルにはピンクを付ける関数です。上のIsAlpha関数を使って判定しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
Sub CheckCellsForAlpha() Dim ws As Worksheet '// ワークシート Dim sr As Range '// セル範囲 Dim r As Range '// セル Set ws = ActiveSheet Set sr = ws.Range("A1:A10") '// チェック対象の範囲 '// セル範囲をループ For Each r In sr '// セルに値が入っている場合 If r.Value <> "" Then '// 英字のみチェックで英字のみの場合 If IsAlpha(CStr(r.Value)) = True Then '// 緑色で英字のみをハイライト r.Interior.Color = RGB(144, 238, 144) Else '// ピンク色で英字以外を含むものをハイライト r.Interior.Color = RGB(255, 182, 193) End If End If Next End Sub |
2. 入力検証付きユーザーフォーム
テキストボックスの値が英字のみかを判定します。
1 2 3 4 5 6 |
Private Sub TextBox1_AfterUpdate() If Not IsAlpha(TextBox1.Value) Then MsgBox "英字のみを入力してください。", vbExclamation TextBox1.SetFocus End If End Sub |
IsAlpha関数での半角・全角の扱いについて
上で紹介したIsAlpha関数は半角・全角両方の英字に対応しています。
半角英字:a-z
, A-Z
全角英字:a-z
, A-Z
日本語環境では全角英字の入力も考慮する必要があるため、両方に対応した実装としています。
判定文字を増やしたい場合
例えば、スペースを含む文字列をIsAlpha関数で判定すると、スペース文字は英字ではないため、False(英字ではない)と判定されます。
ただ、スペースもOkにしたい、という場合があると思います。そういう場合はLike関数の定義にスペース文字を含めてください。
修正前
IsAlpha = Not str Like "*[!a-zA-Za-zA-Z]*"
修正後:最後に半角スペースを追加
IsAlpha = Not str Like "*[!a-zA-Za-zA-Z ]*"