タイガーラック クリエイティブブログ
2025
July
10

【VBA】Accessで全角カナ⇔半角カナ変換で検索に失敗する理由と、正しく一致させるための処理法

Access VBA で文字列を扱っていると、「全角カナを半角カナにしたい」という場面が意外とよくあります。

たとえば、顧客情報や商品名などのデータを統一するために、「カタカナ」「ガギグゲゴ」「ヴァヴィヴヴェヴォ」 などを正確に変換したいことがあるでしょう。

StrConv 関数でいいのでは?

VBA に標準で備わっている StrConv 関数には、以下のような文字種変換オプションがあります:

StrConv(文字列, vbNarrow)    ' → 半角に変換
StrConv(文字列, vbWide)      ' → 全角に変換

ところがこの StrConv表示は同じでも、文字列としては“別物”になるケースがあるんです。

StrConv("ガ", vbNarrow) → "ガ"
StrConv("ガ", vbWide) → "ガ"

このように「ガ」と「ガ」を行き来できているように思えます。

ですが実際には、変換後の「ガ」は、見た目こそ同じでも、内部的にはまったく異なる文字列になっていることがあります。

具体例:「カ」+「゛」=「ガ」

環境やフォント、場合によっては StrConv の結果が「ガ」(U+30AC:単体の濁音)ではなく、
「カ」(U+30AB)+「゛」(U+3099:結合文字)という合成文字列になるケースがあります。

Debug.Print "ガ" = "カ゛"  ' → False

つまり、見た目は同じでも文字コードとしては異なるため、検索や比較では一致しなくなるのです。

自作で変換関数を作るしかない

そこで、全角カナ ⇔ 半角カナ変換の対応表を配列として持ち、文字列を順に置き換えていく方法が有効です。

変換関数のコード例

Function ConvertZenkakuToHankaku(str As String) As String
    Dim zenkaku As Variant
    Dim hankaku As Variant
    Dim i As Long
    Dim result As String

    zenkaku = GetZenkakuKanaArray()
    hankaku = GetHankakuKanaArray()
    
    result = str
    For i = LBound(zenkaku) To UBound(zenkaku)
        result = Replace(result, zenkaku(i), hankaku(i), , , vbBinaryCompare)
    Next i
    
    ConvertZenkakuToHankaku = result
End Function

vbBinaryCompare を明示することで、文字コードを正確に比較し、大文字・小文字の違いや似た文字の誤変換を防ぎます。

対応表の定義

Function GetZenkakuKanaArray() As Variant
'-------------------------------------------------------------------------
'全角カナの配列を返す関数
'-------------------------------------------------------------------------

    Dim zenkaku As Variant
    
    ' 全角カナを定義
    zenkaku = Array("ア", "イ", "ウ", "エ", "オ", "カ", "キ", "ク", "ケ", "コ", "サ", "シ", "ス", "セ", "ソ", _
                    "タ", "チ", "ツ", "テ", "ト", "ナ", "ニ", "ヌ", "ネ", "ノ", "ハ", "ヒ", "フ", "ヘ", "ホ", _
                    "マ", "ミ", "ム", "メ", "モ", "ヤ", "ユ", "ヨ", "ラ", "リ", "ル", "レ", "ロ", "ワ", "ヲ", "ン", _
                    "ガ", "ギ", "グ", "ゲ", "ゴ", "ザ", "ジ", "ズ", "ゼ", "ゾ", "ダ", "ヂ", "ヅ", "デ", "ド", _
                    "バ", "ビ", "ブ", "ベ", "ボ", "パ", "ピ", "プ", "ペ", "ポ", _
                    "ァ", "ィ", "ゥ", "ェ", "ォ", "ャ", "ュ", "ョ", "ッ", "ヴ", "ー")
                 
    GetZenkakuKanaArray = zenkaku
End Function
Function GetHankakuKanaArray() As Variant
'-------------------------------------------------------------------------
'半角カナの配列を返す関数
'-------------------------------------------------------------------------

    Dim hankaku As Variant
    
    ' 半角カナを定義
    hankaku = Array("ア", "イ", "ウ", "エ", "オ", "カ", "キ", "ク", "ケ", "コ", "サ", "シ", "ス", "セ", "ソ", _
                     "タ", "チ", "ツ", "テ", "ト", "ナ", "ニ", "ヌ", "ネ", "ノ", "ハ", "ヒ", "フ", "ヘ", "ホ", _
                     "マ", "ミ", "ム", "メ", "モ", "ヤ", "ユ", "ヨ", "ラ", "リ", "ル", "レ", "ロ", "ワ", "ヲ", "ン", _
                     "ガ", "ギ", "グ", "ゲ", "ゴ", "ザ", "ジ", "ズ", "ゼ", "ゾ", "ダ", "ヂ", "ヅ", "デ", "ド", _
                     "バ", "ビ", "ブ", "ベ", "ボ", "パ", "ピ", "プ", "ペ", "ポ", "ァ", "ィ", "ゥ", "ェ", "ォ", _
                     "ャ", "ュ", "ョ", "ッ", "ヴ", "ー")
                     
                 
    GetHankakuKanaArray = hankaku
End Function

結論:配列 + Replaceが一番安定

  • コード量は少し増えますが、どの環境でも安定して動く
  • 処理速度も十分高速(文字列置換なので)

最後に

このように、VBAでも工夫次第で文字列処理はかなり柔軟に対応できます。
業務データのクレンジングや形式統一に、ぜひご活用ください。

このカテゴリの最新記事

関連記事

SHOP LIST

タイガーラック株式会社

〒577-0056
大阪府東大阪市長堂1-3-14 TOKUYASU Bld.