Excel、Access、WordなどのVBA(Visual Basic for Applications)環境で、指定した文字列がすべて半角か、すべて全角か、あるいは全角と半角が混在しているかを判定するためのユーザー定義関数(Is関数風)の実装例です。
文字列のバイト数(LenB)と文字数(Len)を比較する手法を利用することで、簡易かつ高速に全角・半角の判定を行うことができます。
1. この記事でできること
VBAにおいて、入力された文字列が以下の状態であるかを真偽値(True/False)で判定できます。
- すべて半角文字で構成されているか(IsHankaku)
- すべて全角文字で構成されているか(IsZenKaku)
- 全角と半角の文字が混在しているか(IsZenHankaku)
2. 前提条件
Windows環境のExcel、Access、Word等のVBAエディタ(VBE)で使用可能です。StrConv 関数の vbFromUnicode を利用しているため、マルチバイト文字(Shift-JIS等)の特性を利用した判定となります。
3. 判定関数の完全なコード
標準モジュールに以下のコードを貼り付けて使用してください。
Option Explicit
' すべて半角文字の場合に True を返す
Public Function IsHankaku(ByVal str As String) As Boolean
IsHankaku = False
Dim ANSIstr As String
ANSIstr = StrConv(str, vbFromUnicode)
Dim H As Long: H = Len(str)
Dim Z As Long: Z = LenB(ANSIstr)
If H = Z Then IsHankaku = True
End Function
' すべて全角文字の場合に True を返す
Public Function IsZenKaku(ByVal str As String) As Boolean
IsZenKaku = False
Dim ANSIstr As String
ANSIstr = StrConv(str, vbFromUnicode)
Dim H As Long: H = Len(str)
Dim Z As Long: Z = LenB(ANSIstr)
If (H * 2) = Z Then IsZenKaku = True
End Function
' 全角と半角が混在している場合に True を返す
Public Function IsZenHankaku(ByVal str As String) As Boolean
IsZenHankaku = False
Dim ANSIstr As String
ANSIstr = StrConv(str, vbFromUnicode)
Dim H As Long: H = Len(str)
Dim Z As Long: Z = LenB(ANSIstr)
If Not ((H = Z) Or ((H * 2) = Z)) Then IsZenHankaku = True
End Function
4. 実行手順とテスト用プロシージャ
作成した関数の動作を確認するためのテスト用プロシージャです。イミディエイトウィンドウに結果が出力されます。
Sub テスト_文字列判定()
Debug.Print "--- IsZenKaku のテスト ---"
Debug.Print """aaaa"" (半角のみ): "; IsZenKaku("aaaa") ' False
Debug.Print """あああ"" (全角のみ): "; IsZenKaku("あああ") ' True
Debug.Print """あああa"" (混在): "; IsZenKaku("あああa") ' False
Debug.Print """11"" (半角数字): "; IsZenKaku("11") ' False
Debug.Print """11"" (全角数字): "; IsZenKaku("11") ' True
Debug.Print "--- IsHankaku のテスト ---"
Debug.Print """aaaa"" (半角のみ): "; IsHankaku("aaaa") ' True
Debug.Print """あああ"" (全角のみ): "; IsHankaku("あああ") ' False
Debug.Print """あああa"" (混在): "; IsHankaku("あああa") ' False
Debug.Print """11"" (半角数字): "; IsHankaku("11") ' True
Debug.Print """11"" (全角数字): "; IsHankaku("11") ' False
Debug.Print "--- IsZenHankaku のテスト ---"
Debug.Print """aaa"" (半角のみ): "; IsZenHankaku("aaa") ' False
Debug.Print """あああ"" (全角のみ): "; IsZenHankaku("あああ") ' False
Debug.Print """あああa"" (混在): "; IsZenHankaku("あああa") ' True
Debug.Print """111"" (混在): "; IsZenHankaku("111") ' True
End Sub
5. コードの要点と仕組み
- Len(str): 文字列の「文字数」を返します。
- LenB(StrConv(str, vbFromUnicode)): 文字列をANSI(Shift-JIS等)のバイト列に変換した際の「バイト数」を取得します。
- 半角文字は1文字あたり1バイト、全角文字は1文字あたり2バイトとして計算されるため、文字数とバイト数を比較することで全角・半角・混在を判별できます。
6. 注意事項・制約
環境の文字コード設定や特殊文字(一部のサロゲートペア文字や絵文字など)が含まれる場合、想定通りにバイト数がカウントされない場合があります。厳密な制御が必要な場合は正規表現(VBScript.RegExp)の併用をご検討ください。
この記事の更新履歴
この記事は、生成AIを活用した自動レビュー・更新フローにより内容を見直し、必要な修正を反映しています。
2026年9月12日
- 変更リンク切れとなっていた外部サイトへの参照を見直し、Microsoft公式ドキュメント等の一次情報に基づいた解説へ刷新しました。
- 追加読者がコピー&ペーストしてすぐに動作検証できるよう、完全なコードブロックとテスト用プロシージャを追加しました。
- 追加前提条件や関数の使い方、期待される結果の解説を追加しました。
