全角英数字を半角に変換する

ここでは全角英数字を半角に変換するコードを2つ紹介します。

1つ目は正規表現とStrConv関数を使う方法で、2つ目は全角英数字と半角英数字を列挙した配列を使う方法です。

1つ目の方が汎用性はありますが、2つ目の方がコードは分かりやすいです。お好みでどちらかを使ってください。

 

文字コード判別の事前設定

以下のVBAコードは事前に正規表現の参照設定をしておく必要があります。

VBAの画面でツールメニュー→参照設定のダイアログを開き、「Microsoft VBScript Regular Expressions 5.5」にチェックを付けることで正規表現のRegExpクラスが利用できるようになります。

1. 正規表現とStrConv関数を使って全角英数字を半角に変換するマクロ

以下のマクロは第一引数の文字列に含まれる全角英数字を半角に変換し、第二引数で返却します。全角英数字ではない文字は変換しません。

 

コード説明

概要
正規表現で全角英数字を検索します。検索は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セル以降に貼り付けるサンプルです。

実行後

処理速度の向上方法

CnvZenAlphamericToHan関数の内部処理でRegExpクラスをNewしていますが、これを呼び出し元で行うようにするとインスタンスの生成がなくなるため処理速度は向上します。

2. 全角英数字と半角英数字の対応表を使って変換する方法

以下のマクロは全角英数字と半角英数字には何があるのかを列挙しておいて、変換元の文字列に含まれる全角英数字を全て半角英数字に置換する方法です。

正規表現や文字コードを意識する必要がなく、処理はより単純です。使い方は先に紹介した関数と同じですので省略します。