文字種を判定する


ひらがな/カタカナ かどうか判定する

ある文字列が、ひらがな/カタカナ かどうかを判定してみましょう。1文字だけを判定するのでしたら、Like演算子を使うのが簡単です。

Sub Sample1()
    Dim msg As String
    If Left(Range("A1"), 1) Like "[あ-ん]" Then
        msg = Left(Range("A1"), 1) & " は、ひらがなです" & vbCrLf
    Else
        msg = Left(Range("A1"), 1) & " は、ひらがなではありません" & vbCrLf
    End If
    If Left(Range("A1"), 1) Like "[ア-ン]" Then
        msg = msg & Left(Range("A1"), 1) & " は、カタカナです" & vbCrLf
    Else
        msg = msg & Left(Range("A1"), 1) & " は、カタカナではありません" & vbCrLf
    End If
    MsgBox msg
End Sub

では、文字列全体を判定するのなら、文字列の先頭から1文字ずつチェックして・・・なんて必要はありません。判定したい文字列を、ひらがな/カタカナ に変換してみて、その結果が元の文字列と等しいかどうかを調べればいいんです。文字種の変換には、StrConv関数を使います。

Sub Sample2()
    Dim msg As String
    If Range("A1") = StrConv(Range("A1"), vbHiragana) Then
        msg = Range("A1") & " は、ひらがなです" & vbCrLf
    Else
        msg = Range("A1") & " は、ひらがなではありません" & vbCrLf
    End If
    If Range("A1") = StrConv(Range("A1"), vbKatakana) Then
        msg = msg & Range("A1") & " は、カタカナです" & vbCrLf
    Else
        msg = msg & Range("A1") & " は、カタカナではありません" & vbCrLf
    End If
    MsgBox msg
End Sub

もちろん、ひらがな/カタカナ が「含まれている」かどうかも判定できます。

Sub Sample3()
    If Range("A1") = StrConv(Range("A1"), vbKatakana) Then
        MsgBox "すべてカタカナです"
    Else
        MsgBox "ひらがな が含まれています"
    End If
End Sub

半角/全角 かどうか判定する

これも、上と同じようにStrConv関数で判定できます。

Sub Sample4()
    If Range("A1") = StrConv(Range("A1"), vbNarrow) Then
        MsgBox "半角です"
    Else
        MsgBox "全角です"
    End If
End Sub

半角に変換するときは、StrConv関数の第2引数にvbNarrowを指定します。全角に変換するときは、vbWideです。

半角/全角を判定する古典的な方法として、文字列のバイト数を比較するというのがあります。Len関数とLenB関数の結果が等しかったら、それは半角と。等しくなかったら全角が含まれていると。そういう考え方です。このLen関数とLenB関数は、ワークシート関数とVBAの関数で結果が異なりますので留意してください。

Sub Sample6()
    MsgBox "Len → " & Len(Range("A1")) & vbCrLf & _
           "LenB → " & LenB(Range("A1"))
End Sub

Excel 97以降、Excelでは文字をUnicodeで管理しています。Unicodeは、すべての文字を2バイトで表しますので、半角文字であってもバイト数は2バイトになります。そういう意味では、ワークシート関数の結果は間違っているのですが、これは旧バージョンと互換性を保つための仕様です。

大文字/小文字 かどうかを判定する

考え方は同じです。判定する文字列を、大文字/小文字に変換してみて、その結果が等しいかどうかを調べます。文字列を大文字に変換するのはUCase関数で、小文字に変換するのがLCase関数です。

Sub Sample7()
    If Range("A1") = UCase(Range("A1")) Then
        MsgBox "すべて大文字です"
    Else
        MsgBox "小文字が含まれています"
    End If
End Sub