漢字かどうかを判定する関数

タイトルのマクロは、以下です。

'********************************************************
'* 関数名: isKanji
'* 概要: 指定された1文字が漢字かどうかを判定する関数
'*
'* 引数:
'*   a_Char [String] - 判定対象の1文字(1文字である必要あり)
'*
'* 戻り値:
'*   [Boolean] - 漢字であれば True、そうでなければ False
'*
'* 注意点:
'*   - 特定の漢字記号(々、〆など)は特別扱いで True とする。
'*   - 通常の Shift_JIS 漢字範囲に基づいて判定。
'********************************************************
Function isKanji(ByVal a_Char As String) As Boolean

    ' 特殊な記号的漢字を定数として定義
    Const SP_KANJI = "ヽ ヾ ゝ ゞ 〃 仝 々 〆"

    ' 文字列を配列に分割(半角スペース区切り)
    Dim arr() As String
    arr = Split(SP_KANJI)

    ' 戻り値の初期値を True に設定(基本的には漢字と仮定)
    isKanji = True

    ' 入力文字を1文字として取り出し(安全のため型指定)
    Dim char As String * 1
    char = a_Char

    Dim i As Long

    '--- ① 特殊な記号的漢字であるかを確認 ---
    For i = LBound(arr) To UBound(arr)
        If char = arr(i) Then
            Exit Function  ' 特殊記号の場合は isKanji = True のまま終了
        End If
    Next

    '--- ② 各漢字レベルの範囲で判定 ---
    ' 以下は Shift_JIS における JIS第1~第4水準漢字のコード範囲を
    ' 上から順にチェックしていく処理。
    ' 条件を満たすごとに、はみ出した文字は漢字ではないと判定。

    ' 第4水準の上限を超えていれば漢字ではない
    If CInt(Asc(char)) > &HFC4B Then
        isKanji = False
        Exit Function
    End If

    ' 第4水準の範囲を通過(ここまで来ればOK)
    If CInt(Asc(char)) > &HFA5B Then Exit Function

    ' 第3水準の上限を超えていれば漢字ではない
    If CInt(Asc(char)) > &HEAA4 Then
        isKanji = False
        Exit Function
    End If

    ' 第3水準の範囲を通過
    If CInt(Asc(char)) > &HE039 Then Exit Function

    ' 第2水準の上限を超えていれば漢字ではない
    If CInt(Asc(char)) > &H9FFC Then
        isKanji = False
        Exit Function
    End If

    ' 第2水準の範囲を通過
    If CInt(Asc(char)) > &H989E Then Exit Function

    ' 第1水準の上限を超えていれば漢字ではない
    If CInt(Asc(char)) > &H9872 Then
        isKanji = False
        Exit Function
    End If

    ' 第1水準の範囲を通過
    If CInt(Asc(char)) > &H889E Then Exit Function

    '--- ③ 最後まで判定に引っかからなければ False ---
    isKanji = False
End Function

🔎 補足:処理の流れの要点

処理ステップ内容
特殊記号のチェック などは漢字として認識(True)
Shift_JIS範囲判定第1~第4水準漢字のコード範囲で判定
該当しない場合False を返して漢字ではないと判定

🧪 使用例

Debug.Print isKanji("山")   ' 結果: True(普通の漢字)
Debug.Print isKanji("々")   ' 結果: True(特殊な記号的漢字)
Debug.Print isKanji("A")    ' 結果: False(アルファベット)
Debug.Print isKanji("あ")   ' 結果: False(ひらがな)

Follow me!