ExcelVBAを使った正規表現で表記揺れの修正
VBAで正規表現 表記揺れの修正
正規表現で表記揺れの修正をする
普段Excelを使っていると、やはり表記揺れなどを編集しなければいけない、
修正しなければいけないというような場面があります。
動画では、Sheet1の列Aの全データを対象に、「㈱」、「( 株 )」、「(株)」、「(株)」の表記ゆれを「(株)」に統一します。全角の括弧と半角の括弧、そしてスペースの有無など、さまざまな表記ゆれを考慮した正規表現を使用しています。
(サンプルファイルは、こちらから
VBAで正規表現m03回サンプルデータ)
VBA Microsoft VBScript 正規表現ライブラリとは
Microsoft VBScript Regular Expressions 5.5 ライブラリには、正規表現を操作するためのクラスが4つ含まれています。
正規表現の操作を支援する 4 つのクラス
RexExp、Match、MatchCollection、および SubMatchesが含まれています。
RexExp
RegExp クラスは、正規表現を操作するための最上位のオブジェクトです。
RegExp クラスは、正規表現を使用して文字列を評価する方法の設定を制御するために使用されます。
RegExp クラスの Execute、Replace、および Test メソッドは、指定されたパターンを使用してテキストを評価するために使用されます。
Match
Match クラスは、正規表現パターンが与えられたテキスト文字列内の単一の一致を表します。
MatchCollection
MatchCollection クラスは、正規表現パターンが指定されたテキスト文字列内の一致のコレクションを表します。
SubMatches
SubMatches クラスは、パターンに一致する文字列内の正規表現パターンの部分一致を表します。
株式会社を表示する表記ゆれを統一したい
1. 今回使うサンプルの場合、
株式会社という表示を一つ取っても4通りの書き方があります。
もしかしたら担当者が多ければまた違う書き方があるかもしれません。
2. Excelの検索置換機能が優れているとはいえ、手動で置換するには 限界があるということで、この正規表現を使った置換のマグロを考えていきたいと思います。
3. マクロの作る手順を考えていきます。まず始めに、この表記揺れのパターンが、特定の文字列に対して何通りあるかというのをチェックします。 そして次に、それを効率的に表す、正規表現のパターンを考えていきます。 この部分が一番大変かと思います。
対象を1つずつ正規表現のルールと照らし合わせてチェックする
4. まずA1セルにある㈱というのは記号の㈱なんですよね。 記号じゃなくてちゃんと文字列の(株)にしたいということでAは記号であるということです。
5. また2行目の( 株 )は、これ全角の括弧に挟まれているんですけれども、その全角の中に半角が入っています。
6. 3行目の(株)は、半角のカッコに囲まれた(株)なのです。
7. 4行目の(株)は全角の括弧に囲まれた(株)ですが、カッコの中にスペースはないというものです。ということで、パターンは4種類なんです。
対象となるパターンは最終的に次のようになります。
"([\s]*株[\s]*)|\(株\)|㈱"です。これは分解すると3つの部分にわかれます。対象を正規表現で書き換える
8. では1つずつ、見ていきます。㈱を正規表現で書くとこんな風になります。 まず右端から見ていくと㈱は記号の㈱だからもうこれで完結。"㈱":"㈱"という記号そのものを表します。
9. これは半角のカッコに挟まれている株という文字。"\(株\)":半角の括弧"("と")"の間に"株"という文字があるパターンを表します。
この例でなぜ半角のカッコの前にバックスラッシュをつけているのかというと、
半角の括弧は、正規表現でも使われている特殊文字なので、それをそのままの意味として使う場合には、区別するための記号としてエスケープ(\)が必要で、そのため半角の括弧の前にバックスラッシュ(\)をつけています。
10. 次は、全角のカッコに挟まれている株という文字。さらにこの株には、半角文字で挟む場合と挟まない場合の2通りがある。
"([\s]*株[\s]*)":全角の括弧"("と")"の間に"株"という文字があり、その前後に0個以上のスペースがあるパターンを表します。
この表記がわかりにくいですが、0個以上の任意のスペースを表すものを次のように書きます。
[¥S]
ここで、"[\s]*"は0個以上の任意のスペースを表す正規表現です。
正規表現の置換コードを説明
11. 今回はMicrosoft VBScript Regular Expressions 5.5 ライブラリを先に参照設定してあります。
変数ですが、
Dim ws As Worksheet は、wsはWorksheetを特定するために使う変数です。
Dim rng As Range は、範囲を特定するための変数です。
Dim i As Long、というのはFor文で回す為のカウント変数です。
colnum As Long、というのは列番号を入れる為の変数です。
12. Dim regEx As VBScript_RegExp_55.RegExp とは、参照設定したライブラリにより使えることになったオブジェクトを扱うための変数ということです。
Dim strパターン As String, str置換 As String
Dim str対象 As String は、変数名で何を表すかわかると思いますが、どれも文字列型として宣言しています。
正規表現オブジェクトを初期化する
13. Set regEx = New VBScript_RegExp_55.RegExp ' RegExpオブジェクトを初期化するためのコード。
変数にregExを宣言しただけでは、まだ使えません。これをメモリ上にロードして実体かするのが、初期化です。
Set regEx = New VBScript_RegExp_55.RegExp strパターン = "([\s]*株[\s]*)|\(株\)|㈱" ' 置換対象の文字列を設定 str置換 = "(株)" ' 置換文字列を設定
14. 次に、置換対象のstrパターンと置換後の文字列str置換に文字列を代入します。
その次のコードで正規表現のパターンと置換文字列を設定します。
特に1行ごとにチェックしたい場合は、次の2つの設定が重要です。
.Global = True は、Globalが True の場合、すべての一致が返されます。 False の場合、最初の一致のみが返されます。
.MultiLine = True は、Multiline True の場合、^ は改行文字の後の行の先頭に一致し、$ は改行文字の前の行の末尾に一致します。
False の場合、^ は文字列全体の先頭に一致し、$ は文字列全体の末尾に一致します。
.Pattern = strパターン は、regular expression patternに設定した strパターンを入れます。
15.範囲を限定しているコード部分。
16. データ範囲内でループするコード
'============================================================== '= 153回 '= Microsoft VBScript Regular Expressions 5.5 ライブラリを参照 '============================================================== Sub 表記ゆれ置換() Dim ws As Worksheet Dim rng As Range Dim i As Long, colnum As Long Dim regEx As VBScript_RegExp_55.RegExp Dim strパターン As String, str置換 As String Dim str対象 As String colnum = 1 Set ws = ThisWorkbook.Sheets("Sheet1") Set regEx = New VBScript_RegExp_55.RegExp ' RegExpオブジェクト strパターン = "([\s]*株[\s]*)|\(株\)|㈱" ' 置換対象の文字列を設定 str置換 = "(株)" ' 置換文字列を設定 With regEx ' 正規表現のパターンと置換文字列を設定 .Global = True .MultiLine = True .Pattern = strパターン End With Set rng = ws.Range(ws.Cells(1, colnum), _ ws.Cells(ws.Cells(Rows.Count, _ colnum).End(xlUp).Row, colnum)) For i = 1 To rng.Rows.Count ' データ範囲内でループ str対象 = rng.Cells(i, colnum).Value ' 置換対象の文字列を設定 rng.Cells(i, colnum).Value = regEx.Replace(str対象, str置換) Next i End Sub
17.動画内ではFanctionにするコードも紹介しています。