全角英数字を半角に変換する
ここでは全角英数字を半角に変換するコードを2つ紹介します。
1つ目は正規表現とStrConv関数を使う方法で、2つ目は全角英数字と半角英数字を列挙した配列を使う方法です。
1つ目の方が汎用性はありますが、2つ目の方がコードは分かりやすいです。お好みでどちらかを使ってください。
文字コード判別の事前設定
以下の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 CnvZenAlphamericToHan(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 = "[A-Za-z0-9\-\.]+" '// 検索範囲=文字列の最後まで検索 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プロパティには正規表現での検索条件を指定します。ここでは正規表現での全角英数字である[A-Za-z0-9\-\.]+を指定しています。全角英数字が連続する場合はまとめて検索一致にするために+を指定しています。なお、「-(マイナス)」と「.(ドット)」も数値表現に使うため検索対象として加えています。 |
12行目 | Globalプロパティには文字列の検索範囲を指定します。Trueは文字列の最後まで検索します。 |
14行目 | 指定した検索条件で第一引数の文字列から検索します。検索結果はMatchCollectionクラスオブジェクトが返却されます。 |
17行目 | ループ処理用にループカウンタ変数に検索で一致した数を設定しています。 |
20行目 | 第一引数の文字列の内容を初期値として第二引数に設定しています。以降の処理で全角英数字の部分は半角英数字に変換されていきます。 |
23行目 | 見つかった検索結果をループしています。 |
25行目 | 現ループの検索結果を取得しています。 |
26行目 | 現ループの検索結果の全角英数字をStrConv関数で半角に変換しています。ここで変換しているのは検索で見つかった全角英数字の部分だけになります。 |
31行目 | 第二引数の変数の全角英数字をReplace関数で半角英数字に変換しています。あとのループで同じ全角英数字がある場合も変換してしまいますが、それはOKとしています。 |
利用サンプル
A1からA4セルに入力されている状態で、それらのセルの値の全角英数字を半角に変換して、A6セル以降に貼り付けるサンプルです。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Sub CnvZenAlphamericToHanTest() Dim r As Range Dim c As Range Dim s Set r = Range("A1:A4") For Each c In r s = "" Call CnvZenAlphamericToHan(c.Value, s) c.Offset(5, 0).Value = s Next End Sub |
実行後
処理速度の向上方法
CnvZenAlphamericToHan関数の内部処理でRegExpクラスをNewしていますが、これを呼び出し元で行うようにするとインスタンスの生成がなくなるため処理速度は向上します。
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 |
Sub CnvZenAlphamericToHanEx(a_sZen, a_sHan) Dim sZenList '// 全角文字列挙 Dim sHanList '// 半角文字列挙 Dim sZenAr() '// 全角文字配列 Dim sHanAr() '// 半角文字配列 Dim sZen '// 全角文字 Dim sHan '// 半角文字 Dim i '// ループカウンタ Dim iLen '// 文字数 '// 全角文字と半角文字を列挙(並び順は全角と半角で同じ文字にする) sZenList = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.-" sHanList = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.-" '// 文字数を取得 iLen = Len(sZenList) '// 配列を初期化 ReDim sZenAr(iLen) ReDim sHanAr(iLen) '// 文字数ループし、全角文字と半角文字をそれぞれ配列化 For i = 0 To iLen - 1 '// 全角文字を取得 sZenAr(i) = Mid(sZenList, i + 1, 1) '// 半角文字を取得 sHanAr(i) = Mid(sHanList, 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 |