【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でも工夫次第で文字列処理はかなり柔軟に対応できます。
業務データのクレンジングや形式統一に、ぜひご活用ください。
このカテゴリの最新記事
2023.04.21
2023.12.06
2025.06.23
2024.08.22