Excel VBAで文字列の検索や置換を行う際に、一定の条件に当てはまる文字列を何パターンもまとめて処理したいと思ったことはありませんか?正規表現を使いこなせるようになると、文字列の検索・置換などの処理が一気に便利に行えるようになります。
VBAの正規表現について徹底解説
この記事では、VBAにおける正規表現について解説していきます。まずは基本的なところを押さえて解説していきます。
- 正規表現とは?
- VBAで正規表現を扱うための設定方法
- 正規表現を表すRegExpオブジェクトとは?
- 正規表現による表現のパターン
そして、実際にVBAで正規表現を使うときに役立つ応用的な内容についても分かりやすく解説していきます。
- Testメソッドで正規表現に一致する文字列が存在するか検索する
- Executeメソッドで正規表現に一致する文字列を抽出する
- Replaceメソッドで正規表現に一致する文字列を置換する
正規表現とは?
正規表現(Regular Expression)とは、複数の文字列に対して一定のパターンや条件に当てはまるものを検索・置換するための手法、あるいはそのパターンや条件を表すための文法です。
正規表現を使用することで、条件に当てはまる文字列の全てのパターンに対して一括で検索・置換などの操作を行うことができるため、普通の文字列検索のようにFindメソッドを使用して一つ一つ当てはまるものを検索して処理していく方法よりも、効率的に処理が実行できます。
【Findメソッドの使い方はこちら】
【Excel VBA】Findメソッドで検索(完全一致、部分一致、複数一致)を行う方法を解説
VBAで正規表現を扱うための設定方法
VBAで正規表現を扱うためには、正規表現に関するオブジェクトやメソッドを呼び出すためのライブラリを読み込む必要があります。実際に正規表現を使って文字列を操作する前に、まずはその設定を済ませておきましょう。
【手順】
- VBAの編集画面を開く
- メニューの「ツール」から「参照設定」の項目をクリックする
- 「Microsoft VBScript Regular Expressions 5.5」の項目にチェックを入れ、OKを押して設定を閉じる
【設定画面】
ライブラリを読み込まなくても実装する方法はありますが、上の方法を使うことでVBAの入力支援が使えるようになり、コードの記述量も減ります。
そのため、こちらの設定を適用してライブラリを読み込んでから実装するのがオススメです。
正規表現を表すRegExpオブジェクトとは?
VBAで正規表現のパターンを表すにはRegExpというオブジェクトを呼び出します。
RegExpオブジェクトが持っているプロパティは以下のとおりです。
プロパティ | 説明 |
Pattern | 検索に使用する正規表現のパターンを表現します。パターンの表現については後述します。 |
IgnoreCase | パターン検索で大文字と小文字を区別するかどうかを設定します。Trueの場合は区別して、Falseの場合は区別しません。初期値はFalseです。 |
Global | 検索文字列の全体についてパターンとの一致を検索するか、最初の一致だけを検索するかを設定します。Trueで文字列全体について一致を検索し、Falseで最初の一致だけを検索します。初期値はFalseです。 |
また、RegExpオブジェクトが持っているメソッドは以下のとおりです。
メソッド | 説明 |
Test | 正規表現のパターンに一致する文字列を検索して、その文字列が存在するかどうかをTrue/Falseで返します。 |
Replace | 正規表現で検索を行い、一致するものがあった場合は指定した文字列と置換します。 |
Execute | 文字列を正規表現パターンで検索した結果をMatchCollectionで返します。一致するものがなかった場合は空のMatchCollectionを返します。 |
MatchCollectionは、検索した文字列の中で一致が見つかった文字列ごとに存在するMatchオブジェクトの集合です。MatchCollectionとMatchオブジェクトについては後述します。
正規表現による表現のパターン
正規表現では、文字列のパターンを記号と文字の組み合わせによって表現します。ここでは、よく使われる正規表現について表にまとめて説明します。
記号 | 説明 | 書き方と一致するパターンの例 |
. | 任意の1文字(改行文字は除く) | “.ar”: car, var, ]ar, … |
* | 直前の1文字が0回以上繰り返されている | “hoge*”: hog, hoge, hogeeeee |
^ | 行の先頭の文字 | “^foo”: food, foot |
$ | 行の末尾の文字 | “10$”: 410, 1010, 110, … |
[ ] | 括弧内の任意の1文字と一致する文字列。ハイフン – で範囲指定ができる。 | “[a-z]”: 小文字のアルファベット全て “[a-Z]”: アルファベット全て |
[^ ] | 括弧内の任意の1文字と一致しない文字列。ハイフン – で範囲指定ができる。 | “[^a-Z]”: アルファベット以外の文字列 |
+ | 直前の1文字が1回以上繰り返される | “a+b”: ab, aaaab, aaaaaab, …. |
{ } | 括弧の直前の文字が括弧内の数値の回数ぶんだけ繰り返される。カンマ , を数値の前に入れると以下、後ろに入れると以上、二つの数値の間に入れると二つの数値の範囲内の繰り返しになる。 | “a{3}”: aaa, caaa, aaa “a{,3}”: aa, ca, aaa, … “a{3,}”: aaa, aaaa, aaaaaaa “a{2,4}”: aaa, aa, aaaa |
| | 記号の前後の文字列どちらかに一致する。 | “foo|bar”: foo, bar |
( ) | 括弧の中の文字列をグループ化する。また、その文字列を参照することができる。 | – |
\ | 記号をエスケープする。上に示した記号をそのまま検索文字列に含めたい場合に使用する。 | “\[a+\]”: [a], [aaaa], … |
実際にRegExpオブジェクトを使用して正規表現で文字列を操作する際の、パターンなどの指定についてサンプルコードで解説していきます。
【サンプルコード】
Dim re As New RegExp 'RegExpオブジェクトが生成される
With re
.Pattern = "#[1-9]"
.Global = True
.IgnoreCase = True
End With
ここでは正規表現を使うためのパターンの指定など、プロパティの設定だけを行っています。
RegExpオブジェクトの生成は一行目で行っています。ここで型の宣言時にNewというキーワードを付けることで、オブジェクトのインスタンスを生成しています。これによって、オブジェクトを宣言したあとにSetステートメントを使う必要がなくなりました。
また、Withステートメントを使うことで、reオブジェクトの記述を省略しています。
実際に正規表現を使った検索や置換を行うには、Test/Replace/Executeメソッドを使用して処理を実行していきます。順番に見ていきましょう。
Testメソッドで正規表現に一致する文字列が存在するか検索する
まずは、正規表現のパターンに一致している文字列が存在しているかどうかを調べる方法から解説していきます。
正規表現のパターンに一致する文字列の存在を調べるには、Testメソッドを使用します。
Testメソッドは正規表現で検索した結果がある場合はTrueを、無い場合はFalseを返します。
【基本構文】
RegExpオブジェクト.Test(検索対象の文字列)
RegExpオブジェクトの部分には、実際のオブジェクト変数の名前が入ります。文字列の部分は検索する文字列を指定します。
【サンプルコード】
Sub Regex_Test()
Dim re As New RegExp
Dim str As String
Dim testVal As Variant
With re
.Pattern = "#[1-9]" '#1, #2, #3, ... #9までのどれかに一致する
.Global = True
.IgnoreCase = True
End With
str = "123 6#5 adcb" '正規表現で検索する対象の文字列
testVal = re.Test(str)
If testVal Then
MsgBox "パターンに一致する文字列が1つ以上見つかりました"
Else
MsgBox "パターンに一致する文字列は見つかりませんでした"
End If
End Sub
【実行結果】
ここでは、”123 6#5 adcb”という文字列の中で、#1, #2, #3, … というように、#のあとに1から9までの数字が1つ続くパターンを検索しています。そして、検索した結果一致する文字列が存在するかどうかをメッセージボックスで表示しています。
Testメソッド自体の機能はパターンに一致する文字列が存在するかどうかを調べるだけですが、その有無に応じてIfステートメントで処理を分けるなど、使い方は様々に応用できるメソッドです。
Executeメソッドで正規表現に一致する文字列を抽出する
次に、正規表現パターンに一致する文字列そのものを返すExecuteメソッドについて解説します。
Executeメソッドは、正規表現検索に一致する文字列の情報を表すMatchオブジェクトの集合であるMatchCollectionを返します。
【基本構文】
RegExpオブジェクト.Execute(検索文字列)
【Matchオブジェクトとは】
Matchオブジェクトとは、Executeメソッドで正規表現パターンに一致する文字列を検索した結果の、1つ1つの文字列に関する情報を格納したオブジェクトです。FirstIndex, Length, Valueの3つのプロパティを持っています。全てのプロパティは参照のみ可能で、値を書き換えることはできません。
プロパティ | 説明 | データの型 |
FirstIndex | 検索した結果、文字列の中で最初に合致した位置を表します。 | 数値(1文字目を0で表す) |
Length | 検索で合致した文字列の長さを表します。 | 数値 |
Value | 検索で合致した文字列そのものを表します。 | 文字列 |
【MatchCollectionとは】
MatchCollectionとはMatchオブジェクトの集合で、Collectionという形式のオブジェクトです。MatchCollectionの個別の値がMatchオブジェクトであると同時に、MatchCollection自体にもCount, Itemという2つのプロパティがあります。どちらも参照のみ可能で、書き換えることはできません。
プロパティ | 説明 |
Count | 格納されているMatchオブジェクトの数 |
Item | 格納されているMatchオブジェクトの個別の項目 |
実際にExecuteメソッドを使用する場合のサンプルコードは以下のようになります。
【サンプルコード】
Sub ExtractMatches()
Dim re As New RegExp
Dim matches As MatchCollection
Dim match As Match
Dim inputString As String
'正規表現パターンの設定
With re
.Pattern = "#[1-9]"
.Global = True
.IgnoreCase = True
End With
'入力文字列の設定
inputString = "Sample text with #1, #2, and #3 as tags."
'パターンに一致する部分を抽出
Set matches = re.Execute(inputString)
'マッチした部分を表示
For Each match In matches
Debug.Print match.Value
Next match
End Sub
【実行結果】
ここでは、パターンに一致する文字列をExecuteメソッドで抽出し、返り値のMatchCollectionをFor Eachステートメントのループで回しています。For Eachを使用することで、MatchCollectionに格納されている全てのMatchオブジェクトに1つずつアクセスすることができます。
ループの中の処理では文字列の先頭から一致した順にDebug.Printでイミディエイトウィンドウに表示しています。
Testメソッドでは文字列が存在しているかどうかまでしかわかりませんでしたが、Executeメソッドを使用することで、合致する文字列そのものを参照することができます。
この2つのメソッドの具体的な使い分けの例としては、たとえばTestメソッドはメールアドレスのような形式の決まっている文字列に対して正規表現で検索をかけ、有効なメールアドレスかどうかを検証するといった、単純な条件分岐を利用する処理に適しています。
一方でExecuteメソッドは、正しいメールアドレスだけを抽出するなど、合致した文字列を実際に参照する場合に使用します。
これらのメソッドをうまく使い分けて、より効率的な処理を実装していきましょう!
最後に、正規表現のパターンに一致する文字列を置換するReplaceメソッドについて解説していきます。
Replaceメソッドで正規表現に一致する文字列を置換する
VBAのReplaceメソッドは、正規表現のパターンに一致した文字列を指定した文字列で置換する操作を行うためのメソッドです。
【基本構文】
RegExpオブジェクト.Replace(検索対象の文字列, 置換後の文字列)
Replaceメソッドは2つの引数を取ります。1番目が正規表現による検索の対象となる文字列で、2番目がその検索で合致したものに対して置換する文字列となります。
実際に、正規表現で検索した文字列を置換してみましょう。
【サンプルコード】
Sub DeleteChars()
Dim re As New RegExp
Dim inputString As String
Dim resultString As String
' 正規表現パターンの設定
With re
.Pattern = "[a-z]+" '小文字のアルファベットが1回以上現れる文字列に一致する
.Global = True
End With
' 入力文字列の設定
inputString = "sdfasdfTEefdsdfCHkjhg lkijMdadjeclANIfducpleA編jaqv集cxli部"
' パターンに一致する部分を置換
resultString = re.Replace(inputString, "")
' 結果を表示
MsgBox resultString
End Sub
【実行結果】
このコードでは、”sdfasdfTEefdsdfCHkjhg lkijMdadjeclANIfducpleA編jaqv集cxli部”という文字列から小文字のアルファベットだけを正規表現で検索し、空文字列で置換することで削除しています。
正規表現で検索する場合のReplaceメソッドは、書式や形式が同じで内容が異なる文字列を一括で置換処理したいケースなどに非常に有効です。
まとめ
VBAで大量の文字列を操作する際、正規表現による検索・置換は必須です。正規表現を利用することで、処理の効率は格段に向上します。
正規表現を使いこなせるようになるまで、ぜひこの記事を何度も読んで活用してください!
関連記事
VBAの勉強方法は?
書籍やインターネットで学習する方法があります。昨今では、YouTubeなどの動画サイトやエンジニアのコミュニティサイトなども充実していて多くの情報が手に入ります。
そして、より効率的に知識・スキルを習得するには、知識をつけながら実際に手を動かしてみるなど、インプットとアウトプットを繰り返していくことが重要です。特に独学の場合は、有識者に質問ができたりフィードバックをもらえるような環境があると、理解度が深まるでしょう。
ただ、VBAに限らず、ITスキルを身につける際、どうしても課題にぶつかってしまうことはありますよね。特に独学だと、わからない部分をプロに質問できる機会を確保しにくく、モチベーションが続きにくいという側面があります。独学でモチベーションを維持する自信がない人にはプログラミングスクールという手もあります。費用は掛かりますが、その分スキルを身につけやすいです。しっかりと知識・スキルを習得して実践に活かしたいという人はプログラミングスクールがおすすめです。
プログラミングスクールならテックマニアがおすすめ!
ITスキル需要の高まりとともにプログラミングスクールも増えました。しかし、どのスクールに通うべきか迷ってしまう人もいるでしょう。そんな方にはテックマニアをおすすめします!これまで多くのITエンジニアを育成・輩出してきたテックマニアでもプログラミングスクールを開講しています。
<テックマニアの特徴>
・たしかな育成実績と親身な教育 ~セカンドキャリアを全力支援~
・講師が現役エンジニア ~“本当”の開発ノウハウを直に学べる~
・専属講師が学習を徹底サポート ~「わからない」を徹底解決~
・実務ベースでスキルを習得 ~実践的な凝縮カリキュラム~
このような特徴を持つテックマニアはITエンジニアのスタートラインとして最適です。
話を聞きたい・詳しく知りたいという方はこちらからお気軽にお問い合わせください。