全角カタカナを半角に変換する
ここでは全角カタカナを半角に変換するコードを2つ紹介します。
1つ目は正規表現とStrConv関数を使う方法で、2つ目は全角カタカナの配列と半角カタカナの配列を使う方法です。
1つ目の方が汎用性はありますが、2つ目の方がコードは分かりやすいです。お好みでどちらかを使ってください。
なお、半角カタカナを全角に変換する方法は「VBAで文字列の半角カタカナを全角に変換する」をご参照ください。
事前設定
以下のVBAコードは事前に正規表現の参照設定をしておく必要があります。
VBAの画面でツールメニュー→参照設定のダイアログを開き、「Microsoft VBScript Regular Expressions 5.5」にチェックを付けることで正規表現のRegExpクラスが利用できるようになります。
1. 正規表現とStrConv関数を使って全角カタカナを半角に変換する方法
以下のマクロは第一引数の文字列に含まれる全角カタカナを半角に変換し、第二引数で返却します。全角カタカナではない文字は変換しません。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
Sub CnvZenKanaToHan(a_sZen, a_sHan) Dim reg As New RegExp '// 正規表現クラスオブジェクト Dim oMatches As MatchCollection '// RegExp.Execute結果 Dim oMatch As Match '// 検索結果オブジェクト Dim i '// ループカウンタ Dim iCount '// 検索一致件数 Dim sConv '// 半角カタカナ変換後文字列 '// 検索条件=連続する全角カタカナ reg.Pattern = "[ァ-ー]+" '// 検索範囲=文字列の最後まで検索 reg.Global = True '// 引数文字列から全角カタカナを検索 Set oMatches = reg.Execute(a_sZen) '// 検索一致件数を取得 iCount = oMatches.Count '// 変換後文字列に変換前文字列を設定 a_sHan = a_sZen '// 連続する全角カタカナの数だけループ For i = 0 To iCount - 1 '// 検索に一致した全角カタカナ部分を取得 Set oMatch = oMatches.Item(i) '// 検索に一致した全角カタカナを半角に変換 sConv = StrConv(oMatch.Value, vbNarrow) '// 半角に変換 a_sHan = Replace(a_sHan, oMatch.Value, sConv) Next End Sub |
コード説明
概要
正規表現で全角カタカナを検索します。検索は1文字ずつではなく濁音や半濁音や長音を含む連続する全角カタカナはまとめて検索しています。その後、検索で見つかった全角カタカナの数だけループし、Replace関数で全角カタカナを半角に変換しています。
1行目 | 第一引数に変換前の文字列、第二引数に変換後の文字列が返却されます。 |
2行目 | RegExpクラスのインスタンス変数を作成しています。事前に参照設定をしていることが前提になります。 |
3行目 | 正規表現での検索結果を格納するMatchCollectionクラスの変数です。 |
4行目 | MatchCollectionクラスの変数の各コレクション保持用の検索結果Matchクラスの変数です。 |
5、6、7行目 | 処理中に使うローカル変数です。 |
10行目 | Patternプロパティには正規表現での検索条件を指定します。ここでは正規表現での全角カタカナである[ァ-ー]+を指定しています。全角カタカナが連続する場合はまとめて検索一致にするために+を指定しています。なお、[ァ-ー]は文字コードでの[\u30A1-\u30FC]と書いても同じ意味になります。私は[ァ-ー]の方が分かりやすいのでこっちを使ってます。 |
12行目 | Globalプロパティには文字列の検索範囲を指定します。Trueは文字列の最後まで検索します。 |
14行目 | 指定した検索条件で第一引数の文字列から検索します。検索結果はMatchCollectionクラスオブジェクトが返却されます。 |
17行目 | ループ処理用にループカウンタ変数に検索で一致した数を設定しています。 |
20行目 | 第一引数の文字列の内容を初期値として第二引数に設定しています。以降の処理で全角カタカナの部分は半角カタカナに変換されていきます。 |
23行目 | 見つかった検索結果をループしています。 |
25行目 | 現ループの検索結果を取得しています。 |
26行目 | 現ループの検索結果の全角カタカナをStrConv関数で半角に変換しています。ここで変換しているのは検索で見つかった全角カタカナの部分だけになります。 |
31行目 | 第二引数の変数の全角カタカナをReplace関数で半角カタカナに変換しています。あとのループで同じ全角カタカナがある場合も変換してしまいますが、それはOKとしています。 |
利用サンプル
A1からB2セルに入力されている状態で、それらのセルの値の全角カタカナを半角に変換して、A4セル以降に貼り付けるサンプルです。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Sub CnvZenKanaToHanTest() Dim r As Range Dim c As Range Dim s Set r = Range("A1:B2") For Each c In r s = "" Call CnvZenKanaToHan(c.Value, s) c.Offset(3, 0).Value = s Next End Sub |
実行後
処理速度の向上方法
CnvZenKanaToHan関数の内部処理でRegExpクラスをNewしていますが、これを呼び出し元で行うようにするとインスタンスの生成がなくなるため処理速度は向上します。
2. 全角カタカナと半角カタカナの対応表を使って変換する方法
以下のマクロは全角カタカナと半角カタカナには何があるのかを列挙しておいて、変換元の文字列に含まれる全角カタカナを全て半角カタカナに置換する方法です。
全角カタカナの25文字分までが濁音と半濁音の半角カナ2文字用、といった決め打ちのコーディングです。
正規表現や文字コードを意識する必要がなく、処理はより単純です。使い方は先に紹介した関数と同じですので省略します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
Sub CnvZenKanaToHanEx(a_sZen, a_sHan) Dim sZenList '// 全角文字列挙 Dim sHanList '// 半角文字列挙 Dim sZenAr() '// 全角文字配列 Dim sHanAr() '// 半角文字配列 Dim sZen '// 全角文字 Dim sHan '// 半角文字 Dim i '// ループカウンタ Dim iLen '// 文字数 '// 全角文字と半角文字を列挙(並び順は全角と半角で同じ文字にする) sZenList = "ガギグゲゴザジズゼゾダヂヅデドバビブベボパピプペポ。「」、・ヲァィゥェォャュョッーアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン" sHanList = "ガギグゲゴザジズゼゾダヂヅデドバビブベボパピプペポ。「」、・ヲァィゥェォャュョッーアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン" '// 文字数を取得 iLen = Len(sZenList) '// 配列を初期化 ReDim sZenAr(iLen) ReDim sHanAr(iLen) '// 文字数ループし、全角文字と半角文字をそれぞれ配列化 For i = 0 To iLen - 1 '// 半角のガからポまでは記号を含めて2文字ずつ取得 If (i < 25) Then sHanAr(i) = Mid(sHanList, (i * 2) + 1, 2) Else sHanAr(i) = Mid(sHanList, i + 26, 1) End If '// 全角文字を取得 sZenAr(i) = Mid(sZenList, i + 1, 1) Next '// 第二引数に初期値として第一引数を設定 a_sHan = a_sZen '// 半角カタカナの種類数ループ For i = 0 To iLen - 1 '// カタカナの文字を全角から半角に置換 a_sHan = Replace(a_sHan, sZenAr(i), sHanAr(i)) Next End Sub |