2015/09/29

[VBA] 大文字小文字、全角半角、ひらがなカタカナの変換やその周辺

カテゴリー:
タグ:

エクセルで、大文字・小文字の変換、全角・半角の変換、ひらがなカタカナの変換を行いたい場合があります。ここでは、VBAでこれらを行う方法や、その周辺の話題について書いていきます。

大文字・小文字の変換

VBAで、大文字から小文字、小文字から大文字に変換するには、LCase関数、UCase関数を使うと簡単にできます。

Sub sampleLCaseUCase()

    Dim text As String

    text = "XxXx (8)(8) あアア"

    text = LCase(text) ' xxxx (8)(8) あアア
    text = UCase(text) ' XXXX (8)(8) あアア

End Sub

LCaseはlowercase(小文字)のことで、UCaseはuppercase(大文字)のことですね。部分的に小文字・大文字に変換するということはできなくて、テキスト全体が変換されます。また、全角の英字であっても、ちゃんと小文字・大文字の変換をしてくれます。ひらがなや漢字、数字などには影響ありません。

全角・半角の変換、ひらがな・カタカナの変換

次は、VBAで全角から半角、ひらがなからカタカナへの変換やその逆を行う方法です。これを行うには、StrConv関数を使います。例えば、半角を全角へ変換する場合は、次のようにします。

Sub sampleStrConv()

    Dim text As String

    text = "XxXx (8)(8) あアア"
    text = StrConv(text, vbWide, 1041)
    ' 結果:XxXx (8)(8) あアア

End Sub

英字のxだけでなく、数字や半角カナも全角になっています。また、少しわかりにくいですが、カッコや半角スペース(英数字の間にある)も全角になっています。

StrConv関数は、次のような構文になっています。

StrConv(string, conversion, LCID)

stringは変換したいテキストです。conversionは変換の種類、LCIDはLocaleIDのことで、システムのLocaleIDと同じであれば省略できます。日本語の環境を指定したければ、「1041」を指定します。LocaleIDの一覧はこちらに載っています。なぜか今使っているPCのロケールが米国になっていて、StrConvのカナ変換などの一部機能が使えなかったのですが、1041を指定すれば動くようになりました。実はここで少しはまってしまったのですが、それがこの記事を書くきっかけにもなりました。

ここからは、conversionで指定する変換の種類を、例とともに挙げていきます。vbUpperCaseは大文字への変換、vbLowerCaseは小文字への変換です。LCaseやUCaseと同じですね。vbProperCaseは、単語の最初の文字だけ大文字にするという変換方法です。これらを使うときに、LCIDの指定は必要ありません。

上の例でも挙げたvbWideは、全角への変換です。vbNarrowは、半角への変換です。半角に変換した結果は次のようになります(東アジアロケール以外の場合はエラーが出るので、エラーが出る場合はLCIDを指定しましょう)。

    text = "XxXx (8)(8) あアア"
    text = StrConv(text, vbNarrow, 1041)
    ' 結果:XxXx (8)(8) あアア

英数字は半角になっています。スペースやカッコも半角になっています。カタカナは半角になりますが、ひらがなはそのままですね。

vbKatakanaはカタカナへの変換、vbHiraganaはひらがなへの変換です。名前の通りです。それぞれ変換した結果は次のようになります(日本ロケール以外の場合はエラーが出るので、エラーが出る場合はLCIDを指定しましょう)。

    text = "XxXx (8)(8) あアア"
    text = StrConv(text, vbHiragana, 1041)
    ' 結果:XxXx (8)(8) ああア

    text = "XxXx (8)(8) あアア"
    text = StrConv(text, vbKatakana, 1041)
    ' 結果:XxXx (8)(8) アアア

影響があるのは、ひらがなと全角のカタカナだけです。以上のことから考えると、例えばひらがなを半角カタカナにしたい場合は、まず全角カタカナへ変換し、その後半角へ変換する、という順番になります。ただ、これは、StrConvを2回使うのではなく、次のようにして一気に書くことができます。

    text = "XxXx (8)(8) あアア"
    text = StrConv(text, vbNarrow + vbKatakana, 1041)
    ' 結果:XxXx (8)(8) アアア

conversionで指定できるものには、他に、ユニコードに変換するvbUnicode、ユニコードから変換するvbFromUnicodeもあります。

大文字小文字、全角半角、ひらがなカタカナを無視した比較や検索

ここからは、今までの話を使って、大文字と小文字、全角と半角、ひらがなとカタカナの区別を無視して、2つのテキストが同じかどうかや、片方が片方を含んでいるかどうかを調べる方法を見ていきます。

アイデアとしては、「区別を無視して比較」するのではなく、「変換してから比較する」というものです。つまり、比較したいテキストを、すべて小文字、半角、カタカナに変換してから比較すれば、自動的に「区別を無視した比較」になる、ということです。

    Dim text1 As String, text2 As String

    text1 = "XxXx (8)(8) あアア"
    text2 = "xXxX (8)(8) アあア"

    text1 = StrConv(text1, vbLowerCase + vbNarrow + vbKatakana, 1041)
    text2 = StrConv(text2, vbLowerCase + vbNarrow + vbKatakana, 1041)

    If text1 = text2 Then MsgBox "同じ!"

上の場合、2つのテキストは両方とも「xxxx (8)(8) アアア」に変換され、「同じ!」というメッセージボックスが出るようになります。

区別を無視して、片方が片方に含まれているかどうかは、同じように変換した後、置換してテキストが変わるかどうかで判断します。

    Dim text1 As String, text2 As String

    text1 = "XxXx (8)(8) あアア"
    text2 = "あああ"

    text1 = StrConv(text1, vbLowerCase + vbNarrow + vbKatakana, 1041)
    text2 = StrConv(text2, vbLowerCase + vbNarrow + vbKatakana, 1041)

    If text1 <> Replace(text1, text2, "") Then MsgBox "含まれている!"

これを実行すると、「xxxx (8)(8) アアア」の中に「アアア」が含まれるかどうかの判断が行われ、「含まれている!」というメッセージボックスが表示されます。

エクセルの関数でどこまでできるか

ここまではVBAを使う方法でしたが、同じような変換をエクセルの関数でするにはどうすればいいでしょう。

大文字小文字の変換はできます。LOWER関数、UPPER関数を使えば、小文字への変換、大文字への変換ができます。

全角半角の変換もできます。半角へはASC関数、全角へはJIS関数を使えば、変換できます。

ひらがなカタカナは難しいです。「この関数1つでできる」という関数はありません。ただ、よく使うテクニックとしてPHONETIC関数があります。これは、もともとふりがなを抽出する関数なので本来の使い方ではありませんが、次のように使います。A1セルに「あああ」と記入し、A2セルに

=PHONETIC(A1)

と入力すると、「アアア」と表示されます。もしA1セルが「アアア」で、これをひらがなにするには、A1セルのふりがなの設定を「ひらがな」にすれば、「あああ」となります。一応、表示はできます。

しかし、PHONETICはあくまでも「ふりがな」なので、例えば漢字が入ったテキストだとうまくいきません。漢字まで変換されてしまいます。漢字が入ったテキストの場合に、漢字はそのまま、かなの変換だけは行いたいというときには、例えばB1セルに「=A1&”“」と入力しこれをA1セルに値貼り付けすればできます。これは強制的に漢字のふりがな情報を削除しているということです。

このように、ひらがなカタカナの変換は「関数だけでできる」とは言い難い状況です。ひらながカタカナの変換も行うなら、VBAを使って処理したほうがいいです。

前の記事:
次の記事: