VBAで文字列検索
VBAで文字列検索するにはいくつかの方法があります。
手軽に使えるInstr関数、ワイルドカードが使えるLike演算子。そして本格的な正規表現で複雑な検索にも対応できまるRegExpオブジェクト。
これら3つの使い方を比較しながら見ていきます。
手軽に検索できるInStr関数
InStr関数は、本来検索したい文字列が検索対象の文字列の何番目に現れるかを示してくれる関数です。
もし該当する文字列が含まれなければ0を返すので、この性質を利用して文字列検索に使います。
'特定のシートを表題のキーワードで見分ける
Sub macro()
Dim sh
For Each sh In Worksheets
If InStr(sh.Range("A1"), "集計表") > 0 Then
'//// 集計表の処理
End If
Next sh
End Sub
このプログラムは、データを参照したいシートが該当するものかを検査するために、特定のセルにある表題でチェックしています。この例では、A1セルに”集計表”という文字が含まれていれば、それにマッチしてIf文が実行されます。
If InStr([検索対象], [検索文字列]) > 0 Then
というパターンはよく出てくるので覚えておくと便利です。
検索にヒットしたら置換えるReplace関数
InStr関数で検索した後、その文字列を置き換えるのであれば、直接Replace関数を使ってしまうのも一つの手です。
Replace関数は、第二引数で指定した文字列を第三引数の文字列に置き換えます。
Sub macro04()
Dim i As Long
For i = 1 To Cells(Rows.Count, "A").End(xlUp).Row
Cells(i, "B") = Replace(Cells(i, "A"), "さん", "")
Next
End Sub
この例では、A列のセルにある名前に「さん」が付いていれば削除してB列に転記しています。
ワイルドカードが使えるLike演算子
Like演算子は、正規表現モドキのキーワードで検索文字を指定できます。
正規表現モドキですので、正規表現とは異なるのですが、一部の機能ですが正規表現のように使えます。 正式な正規表現ならば、RegExpオブジェクトを使います。
? | 任意の一文字 |
* | 任意の0個以上の文字 |
# | 任意の一桁の数字(0~9) 半角、全角どちらでもOK |
[charlist] | 文字リスト(charlist)に指定した文字中の任意の一文字 |
[!charlist] | 文字リスト(charlist)に指定した文字以外の任意の一文字 |
さて、「7月」、「12月」を同時にヒットさせるにはどうしたら良いか考えてみましょう。
”*#月” とすれば、とりあえず両方Trueとなりますが、 「令和4年8月」 などにでも True となってしまいます。このような時は、If文自体で工夫してみましょう。
If sh.Range(“A1”) Like “#月” Or sh.Range(“A1”) Like “##月” Then
「99月」というあり得ない文字列も True となりますが、Like演算子で出来るのはこの程度なので、とりあえず良しとします。(汗)
セル全体を対象に出来るFind関数
FindはExcelの「ホーム」メニューから「検索」で出来る処理をVBAで実現してくれる、いわゆるアプリケーション関数になります。
実は、あまり使い勝手が良いとは言えず、やたらと面倒な手続きが必要だったりするので筆者は使いません。そもそも他の手段で同じような事は出来てしまうので、わざわざ使う必要が無いというのが実際のところです。
というわけで説明は省略したいと思います。
VBAで正規表現を利用できるRegExpオブジェクト
手軽に検索したいというときには、InStr関数、Like演算子がいいかもしれませんが、時には複雑な検索や抽出を行いたい時があります。
例えば、HTML形式のデータからお目当ての値を抜き出したい時(いわゆるスクレイピングなど)には正規表現を使用するのも一つの手です。
初心者にとっては複雑な正規表現は敷居が高いかもしれませんが物凄いパワーを秘めていますので、機会があったらぜひ挑戦してみて下さい。
簡単に説明しますと、RegExpオブジェクトは、オブジェクトを生成してから使用します。
メソッドは以下の3つがあります。大文字小文字を区別する・しないなどのオプションなども設定できます。
- Testメソッド (マッチングに成功するか)
- Replaceメソッド (マッチしたものを指定した文字に置き換える)
- Executeメソッド (マッチしたものをMatchesコレクションとして返す)
マッチしたものをコレクションとして抽出してくれるので、その後の扱いには便利です。
正規表現やRegExpオブジェクトに関しては別ページにまとめていますので、そちらを参照してください。