シートの全セルの全角英数字を半角に変換するには
Excelの文章修正作業でたまにあるのが、全角文字と半角文字の変換です。
ここでは全角英数字を半角に変換する際に正規表現を使う方法を紹介しますが、正規表現がわからなくても大丈夫(コードをコピペでOK)にしています。
なお、正規表現についての詳細は「VBAで正規表現(RegExp)を利用する」をご参照ください。
事前設定
以下のVBAコードは事前に正規表現の参照設定をしておく必要があります。
VBAの画面でツールメニュー→参照設定のダイアログを開き、「Microsoft VBScript Regular Expressions 5.5」にチェックを付けることで正規表現のRegExpクラスが利用できるようになります。
コード
以下のマクロはアクティブシートの全セルの全角英数字を半角にします。
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 44 45 46 47 48 49 50 51 52 53 54 |
Sub ZenToHanAlphaNumeric() Dim r As Range '// セル Dim sht As Worksheet '// シート Dim reg As New RegExp '// 正規表現クラスオブジェクト Dim omc As MatchCollection '// 検索結果コレクション Dim om As Match '// 検索結果 Dim i '// ループカウンタ Dim iCount '// 検索一致件数 Dim sConv '// 変換後文字列 '// 検索条件:連続する全角英数字 reg.Pattern = "[A-Za-z0-9]+" '// 検索範囲:文字列の最後まで検索 reg.Global = True '// アクティブシートをシートオブジェクトに設定 Set sht = ActiveSheet '// 入力セル範囲ループ For Each r In sht.UsedRange '// 空白セルの場合 If r.Value = "" Then GoTo CONTINUE End If '// 数式が設定されており、数式と値が異なる場合 If Left(r.Formula, 1) = "=" And r.Formula <> r.Value Then GoTo CONTINUE End If '// 全角英数字がない場合 If reg.Test(r.Value) = False Then GoTo CONTINUE End If '// 正規表現の条件に一致する文字列があるか検索 Set omc = reg.Execute(r.Value) '// 検索一致件数を取得 iCount = omc.Count '// 検索一致数ループ For Each om In omc '// 検索で一致した文字列を取得 sConv = StrConv(om.Value, vbNarrow) '// 置換 r.Value = Replace(r.Value, om.Value, sConv) Next CONTINUE: Next End Sub |
コード説明
全角英数字を正規表現で判定するためにPatternプロパティに全角の英字と数字の”[A-Za-z0-9]+”を指定します。+は直前の文字を1文字以上、という意味になるため、英数字が続く文字列という意味になります。
置換を全角英字だけにしたい場合は「”[A-Za-z]+”」、全角数字にしたい場合は「”[0-9]+”」にしてください。
For文でシートに入力されているセル範囲をUsedRangeプロパティを使ってループしています。
For文の中でセルを1つずつ判定していますが、置換対象としないように除外判定処理を3つ入れています。空白セルの場合、数式セルの場合、全角英数字がない場合、の3つの条件のいずれかに当てはまる場合は置換をしないようにGoTo文で次のセルの処理を行うようにしています。
あとは、正規表現のRegExpクラスのExecuteメソッドで全角英数字を含む箇所をMatchesCollectionオブジェクトに格納し、それをループで1件ずつStrConv関数を使って半角に変換し、Replace関数でセルのValueプロパティの全角英数字を半角に置換しています。