2/07/2021

Excel。VBA。セル内のカタカナだけを全角にしたいけど、どうしたらいいの?【Full-width katakana】

Excel。VBA。セル内のカタカナだけを全角にしたいけど、どうしたらいいの?

<Excel VBA>

Excelにはデータベース機能がありますが、並び替えや集計をするには、そのデータが綺麗である必要があります。


綺麗になっていない一例として、次のようなデータ。


A列の氏名をみてみると、大文字小文字、全角半角、カタカナひらがなが混在しています。


これをB列の調整のように、アルファベットは、半角大文字。

「カタカナ」は全角にしたい。

「ひらがな」は、そのままとするには、どうしたらいいのでしょうか?


自力で修正するとしたら、大変です。

というか、やりたくない作業ですが、現場ではこのような修正が結構あるんですよね。


なので、ここは、Excel VBAでマクロをつくったほうがよさそうです。


プログラム文はこんな感じです。

Sub セル内カタカナ()

    Dim i As Long

    Dim j As Long

    Dim zenkaku As String

    Dim moji As String

    Dim c_moji As String

    Dim lastrow As Long

    

    lastrow = Cells(Rows.Count, "a").End(xlUp).Row

    

    For i = 2 To lastrow

        zenkaku = StrConv(Range("a" & i).Value, vbWide + vbUpperCase)

        c_moji = ""

        

        For j = 1 To Len(zenkaku)

            moji = Mid(zenkaku, j, 1)

            If moji Like "[ァ-ー]" Then

                c_moji = c_moji & moji

            Else

                c_moji = c_moji & StrConv(moji, vbNarrow)

                

            End If

        Next j

        Range("b" & i).Value = c_moji

    Next i

End Sub


ちょっと長いプログラム文に見えますが、やっていることは単純です。

最初は変数宣言ですね。

Dim i As Long

Dim j As Long

Dim zenkaku As String

Dim moji As String

Dim c_moji As String

Dim lastrow As Long


lastrow = Cells(Rows.Count, "a").End(xlUp).Row

lastrowには、データの最終行の行番号を代入します。


For i = 2 To lastrow ~ Next i は、データの件数分を繰り返すためのFor To Nextです。


zenkaku = StrConv(Range("a" & i).Value, vbWide + vbUpperCase)

iが1の時で説明しましょう。


A1のセルの値を、vbWide(半角を全角に変更) さらに、 vbUpperCase(アルファベットを大文字に変更))した値を、zenkakuに代入します。


c_moji = "" は、c_mojiに空の文字列を代入しておきます。


For j = 1 To Len(zenkaku)~Next j は、セル内の文字数分繰り返しを行います。

Len関数はセル内の文字数を算出してくれます。


moji = Mid(zenkaku, j, 1)

セル内の1文字ずつをmojiに代入します。

この代入したmojiをつぎのIf文で該当した場合は文字種を変更させていきます。


If moji Like "[ァ-ー]" Then

c_moji = c_moji & moji

Else

c_moji = c_moji & StrConv(moji, vbNarrow)

End If


If文の条件がわかりにくいですね。


文字が、Like "[ァ-ー]"。

「ァ」から「ー」の間だったら、変更の必要がないので、空文字に追加していきます。

なぜか、「ア」からはじまらないで、「ァ」から始まっているんですね。


外国名の人もいた場合、「・」をつかっていることも想定されるので、「ー」までを範囲にしています。


それ以外ならば、StrConv(moji, vbNarrow)で、全角を半角に変更します。


最後に、b列に変更した値を代入して完了ですね。

Range("b" & i).Value = c_moji


ポイントは、セル内の文字、一文字ずつ確認して変更している点ですね。


このようなプログラム文をつくることで、セル内の文字種を統一することができます。

ひらがなも、カタカナにすべて変わってOKならば、次のプログラム文でも同じ処理をすることができます。


Sub セル内カタカナ()

    Dim i As Long

    Dim lastrow As Long

    lastrow = Cells(Rows.Count, "a").End(xlUp).Row


    For i = 2 To lastrow

        Cells(i, "b").Value = StrConv(Cells(i, "a"), vbWide)  '全角にする

        Cells(i, "b").Value = StrConv(Cells(i, "b"), vbUpperCase)  '大文字にする

        Cells(i, "b").Value = StrConv(Cells(i, "b"), vbHiragana)    'ひらがな

        Cells(i, "b").Value = StrConv(Cells(i, "b"), vbNarrow)  '半角にする

        Cells(i, "b").Value = StrConv(Cells(i, "b"), vbKatakana)    'カタカナにする

        Cells(i, "b").Value = Replace(Cells(i, "b"), "ー", "ー")

        Cells(i, "b").Value = Replace(Cells(i, "b"), "ヴ", "ヴ")

    Next

End Sub


「全角」にして「大文字」にして、いったん「カタカナ」を「ひらがな」にして、カタカナ以外を「半角」にもどしてから、ひらがなを「カタカナ」に変換します。

最後に、Replaceを使って、「ー」や「ヴ」に置換する


また、処理時間はちょっとかかるかもしれませんが、こんな方法もあります。

ちょっと、邪道な方法かもしれませんね。