カタカナの「ケ」(全角)または「ケ」(半角)が漢字に挟まれている場合、それを漢字の「ヶ」に変換する関数
住所データや地名を整理しているとき、「茅ケ崎」や「関ケ原」のように、大きな「ケ」で入力されてしまっているデータを「茅ヶ崎」「関ヶ原」のような正しい「ヶ(小さなヶ)」に一括変換したいことはありませんか?
単純に「ケ」をすべて「ヶ」に置換してしまうと、「ケーキ」が「ヶーキ」になってしまうといった誤変換が発生します。 そこで、「前後の文字が漢字の場合だけ、ピンポイントで『ヶ』に変換する」実用的なマクロ関数(UDF)を作成しました。全角の「ケ」だけでなく、半角の「ケ」にも対応しています。
💡 このマクロでできること(変換例)
- 茅ケ崎 ➔ 茅ヶ崎 (前後の「茅」「崎」が漢字なので変換する)
- 関ケ原 ➔ 関ヶ原 (半角の「ケ」も、前後の「関」「原」が漢字なので変換する)
- ケーキ ➔ ケーキ (前後の文字が漢字ではないので変換しない)
- 1ヶ月 ➔ 1ヶ月 (前の文字が数字なので変換しない)
💻 ソースコード
以下のコードをVBAの標準モジュールに貼り付けてご使用ください。 ※この関数は、1文字が漢字かどうかを判定する「isKanji」関数が別途必要です。(記事の後半にリンクを掲載しています)
'********************************************************
'* 関数名: ConvertKeBetweenKanji
'* 概要 : カタカナの「ケ」(全角)または「ケ」(半角)が漢字に挟まれている場合、
'* それを漢字の「ヶ」に変換する。
'*
'* 引数:
'* text [String] - 対象の文字列
'*
'* 処理内容:
'* - 「ケ」または「ケ」が、前後ともに漢字である場合に限り、
'* それを「ヶ」(漢字としての小文字)に置き換える。
'* - 上記以外の場合は変換せず、そのまま保持する。
'*
'* 注意:
'* - この処理は「isKanji」関数の利用を前提とする。
'* (指定した1文字が漢字であるかを判定する関数。別途実装が必要)
'********************************************************
Function ConvertKeBetweenKanji(text As String) As String
Dim i As Long
Dim result As String
Dim currentChar As String
Dim prevChar As String
Dim nextChar As String
result = ""
For i = 1 To Len(text)
currentChar = Mid(text, i, 1)
If i > 1 Then
prevChar = Mid(text, i - 1, 1)
Else
prevChar = ""
End If
If i < Len(text) Then
nextChar = Mid(text, i + 1, 1)
Else
nextChar = ""
End If
' 「ケ」または「ケ」が漢字に挟まれている場合、「ヶ」に変換
If (currentChar = "ケ" Or currentChar = "ケ") Then
If isKanji(prevChar) And isKanji(nextChar) Then
currentChar = "ヶ"
End If
End If
result = result & currentChar
Next i
ConvertKeBetweenKanji = result
End Function🔍 処理の仕組み
- 1文字ずつチェック:入力された文字列を先頭から1文字ずつ読み込みます。
- 前後の文字を取得:現在チェックしている文字の「1文字前(
prevChar)」と「1文字後(nextChar)」の文字を特定します。 - 条件判定:現在の文字が「ケ」または「ケ」であり、かつ前後の文字が両方とも漢字(
isKanjiがTrue)の場合のみ、「ヶ」に置き換えます。 - 安全設計:文字列の先頭や末尾にある「ケ」を処理する際、エラー(領域外アクセス)にならないよう、位置の判定(
i > 1やi < Len(text))を丁寧に行っています。
🛠️ 合わせて必要な「漢字判定関数」の例
上記マクロを動かすために必要な、1文字が漢字かどうかを判定する isKanji 関数は、以下のリンクを参照願います。Unicodeの文字コードの範囲を利用して判定します
実行例
Debug.Print ConvertKeBetweenKanji("大ケ谷") ' → "大ヶ谷"
Debug.Print ConvertKeBetweenKanji("山ケ島") ' → "山ヶ島"
Debug.Print ConvertKeBetweenKanji("イケメン") ' → "イケメン"(変換されない)🔒 安心・安全宣言 本マクロには、外部へのデータ送信処理や広告表示などの不正なコードは一切含まれていません。完全ローカル環境で動作するため、社内の機密データや個人情報を含む名簿のクリーニングにも安心してご利用いただけます。


