みかん_-_コピー

VBA 半角カタカナの全角変換

前回「VBA 文字列の全角変換」では、テスト用の文字列全体を対象に全角変換する処理を作成しました。

今回は、文字列の中から、半角カタカナだけを対象に全角変換する処理に変えていきます。

半角カタカナの判定

半角カタカナは、文字コード一覧を見ると分かりますが、連続したコードで1つのブロック内に割り付けられています。
(参考ページ:「Halfwidth Katakana」)

そのため、判定対象の文字を文字コードに変換したうえで、半角カタカナのブロック範囲内にあるかどうかを調べれば、半角カタカナかどうか判定できそうです。

プログラム作成

前回ファイル「test.xlsm」のプログラムを変更します。
新たに「test2」と「KatakanaZenkaku」関数を追加しました。

Option Explicit

Public Sub test1()
    Dim sText As String
    sText = Range("B2").Value
    Range("B4").Value = StrConv(sText, vbWide)
End Sub

Public Sub test2()
    Dim sText As String
    sText = Range("B2").Value
    Range("B4").Value = KatakanaZenkaku(sText)
End Sub

Private Function KatakanaZenkaku(sInput As String) As String
    Dim sOutput As String: sOutput = ""
    Dim sPhrase As String: sPhrase = ""
    
    Dim i As Long
    For i = 1 To Len(sInput)
        Dim sChar As String: sChar = Mid(sInput, i, 1)
        If (AscW("・") <= AscW(sChar)) And (AscW(sChar) <= AscW("゚")) Then
            sPhrase = sPhrase & sChar
        Else
            If sPhrase <> "" Then
                sOutput = sOutput & StrConv(sPhrase, vbWide)
                sPhrase = ""
            End If
            sOutput = sOutput & sChar
        End If
    Next i
    
    If sPhrase <> "" Then
        sOutput = sOutput & StrConv(sPhrase, vbWide)
    End If
    
    KatakanaZenkaku = sOutput
End Function

動作確認

Sheet1シートのB2セルに適当な半角カタカナを含んだ文字列を設定したうえで、マクロ名:Sheet1.test2を実行します。

実行

実行結果例は次のようになり、B2セルの文字列の中から、半角カタカナのみが全角文字に変換されてB4セルに設定されました。

結果

プログラムの解説

それでは、プログラムの主な内容を説明します。

test2は、前回プログラムのtest1を流用改造して、StrConv関数の代わりに、後述するKatakanaZenkaku関数を呼び出すように変えてあります。

Public Sub test2()
    Dim sText As String
    sText = Range("B2").Value
    Range("B4").Value = KatakanaZenkaku(sText)
End Sub

KatakanaZenkakuは、sInputで与えられた文字列の中で、半角カタカナのみを全角変換した文字列を作成して返す関数です。

Private Function KatakanaZenkaku(sInput As String) As String
    :
End Function

sOutputは、変換後の文字列を格納する変数、sPhraseは、半角カタカナを全角変換するために一時保存する変数で、それぞれ変数宣言したうえで、空文字で初期化します。

    Dim sOutput As String: sOutput = ""
    Dim sPhrase As String: sPhrase = ""

sInput文字列から1文字ずつ取り出して処理するForループです。取り出した文字はsCharに格納します。

    Dim i As Long
    For i = 1 To Len(sInput)
        Dim sChar As String: sChar = Mid(sInput, i, 1)
        :
    Next i

sCharの文字が半角カタカナなら、sPhrase変数に連結して格納します。半角カタカナかどうかの判定は、対象文字をAscW関数でUnicode変換したうえで、中黒(・)以上、半濁点(゚)以下の範囲内かどうかで判定します。

        If (AscW("・") <= AscW(sChar)) And (AscW(sChar) <= AscW("゚")) Then
            sPhrase = sPhrase & sChar

sCharの文字が半角カタカナでないときは、Elseに分岐してきます。
このとき、sPhraseに文字列があれば、StrConv関数を利用して全角変換したうえで、sOutput変数に連結します。また、sPhraseは空文字でリセットしておきます。
そして、半角カタカナでないsCharの文字をsOutput変数に連結します。

        Else
            If sPhrase <> "" Then
                sOutput = sOutput & StrConv(sPhrase, vbWide)
                sPhrase = ""
            End If
            sOutput = sOutput & sChar
        End If

Forループの下にある処理は、sInput文字列の末尾が半角カタカナのときにsPhraseに文字列がセットされたまま、Forループを抜けてくるため、その文字列を全角変換してsOutput変数に連結します。
そして、sOutputKatakanaZenkakuに設定して関数の返り値とします。

    If sPhrase <> "" Then
        sOutput = sOutput & StrConv(sPhrase, vbWide)
    End If
    
    KatakanaZenkaku = sOutput

最後に

文字列の中から、半角カタカナだけを対象に全角変換する処理を作成しました。

次回は、PowerPoint文書のテキストを対象に変換する処理を作成していきます。

記事を気に入って頂き、お役に立てたら嬉しいです。