みなさん、こんにちは。
ITソリューション事業部の林です。
本記事では、ExcelVBAのテクニックを紹介・解説いたします。
今回紹介するのは、「ワークシートの文字列検索」です。
【目次】
それでは、始めましょう!
文字列を検索する手段について
ExcelVBAでシート上の文字列を検索するには、いくつか方法があります。
まず、セルの値をひとつずつ読み込んで、検索したい文字列と比較する方法です。
過去記事でも何度か紹介したことがあると思います。
Forステートメントなどを使い、セルの比較を繰り返す方法ですね。
以下はA1~A100セルに存在する"abc012"を検索し、セル位置を表示する一例です。
Sub abc012を検索() Dim RowIdx As Long For RowIdx = 1 To 100 If InStr(1, Cells(RowIdx, 1).Value, "abc012") > 0 Then MsgBox "ヒットしました 位置:" + Cells(RowIdx, 1).Address Exit For End If Next End Sub
これはこれで使いどころがあったりするのですが、ただ文字列を検索するだけであればより簡単なやり方があります。
今回紹介する「Findメソッド」がそれです。
Findメソッドの構文
Findメソッドは、指定したセル範囲の中から、文字列指定で検索します。
以下は基本的なFindメソッドの書き方です。
検索範囲.Find(what:=検索文字, LookAt:=文字列比較タイプ)
検索範囲は「Range("A1:A100")」などのように指定します。
すべてのセルを検索するには、「Cells」を指定すればOKです。
検索文字には「abc012」などの文字列を指定しましょう。
変数も使用可能です。
文字列比較タイプとは、セルの文字列と検索文字の比較基準を「全文一致」または「部分一致」で指定します。
全文一致を指定する場合には「xlWhole」、部分一致の場合は「xlPart」を指定します。
全文一致と部分一致で検索した結果の違いは、以下になります。
Findメソッドからの戻り値はRangeです。
Findの戻り値を変数に格納する場合、データ型はRangeもしくはVariantを指定します。
検索しても何も見つからなかった場合、戻り値は「Nothing」となります。
また、「ワイルドカード」という特殊文字を使ってより正確な検索をすることができます。
ワイルドカードを使用すると、「あいまい検索」が可能になります。
Findメソッドで使用できるワイルドカードは以下の2つです。
?(クエスチョンマーク):任意の一文字
*(アスタリスク) :任意の文字列
「任意の」とは、何かの文字を指します。
二つの違いは、補完される文字の長さです。
?は「1文字」を表しますが、*は「0~x文字」を表します。
それぞれのワイルドカードを使った検索結果の違いは、以下になります。
ワイルドカードを使用する場合、全文一致(xlWhole)を指定しましょう。
部分一致(xlPart)だと誤判定されてしまうことが多いためです。
使用例
使用例①
Findメソッドを用いて検索するだけの、最もシンプルなマクロです。
以下のコードでは全文一致で検索する設定ですが、3行目の「xlWhole」を「xlPart」に替えれば部分一致で検索します。
Sub ExcelVBA_018_Example1() Dim FoundRng As Range 'Findメソッドの戻り値となる変数を定義 Set FoundRng = Cells.Find(what:="abc012", lookat:=xlWhole) 'Findメソッドで検索 If FoundRng Is Nothing Then '戻り値によって分岐 '検索して見つからなかった場合 MsgBox "ヒットしませんでした。" Else '検索して見つかった場合 MsgBox "ヒットしました 位置:" + FoundRng.Address End If End Sub
使用例②
ユーザーが入力した文字を使って検索します。
Sub ExcelVBA_018_Example2() Dim FoundRng As Range 'Findメソッドの戻り値となる変数を定義 Dim InputValue As String 'ユーザー入力値を記録する変数を定義 InputValue = InputBox("検索する文字を入力してください", "文字列入力") Set FoundRng = Cells.Find(what:=InputValue, lookat:=xlPart) 'Findメソッドで検索 If FoundRng Is Nothing Then '戻り値によって分岐 '検索して見つからなかった場合 MsgBox "ヒットしませんでした。" Else '検索して見つかった場合 MsgBox "ヒットしました 位置:" + FoundRng.Address End If End Sub
使用例③
ワイルドカードを使って検索します。
<クエスチョンマークを使用>
Sub ExcelVBA_018_Example3() Dim FoundRng As Range 'Findメソッドの戻り値となる変数を定義 Dim InputValue As String '検索文字を記録する変数を定義 InputValue = "???012" '検索文字を指定 Set FoundRng = Cells.Find(what:=InputValue, lookat:=xlWhole) 'Findメソッドで検索 If FoundRng Is Nothing Then '戻り値によって分岐 '検索して見つからなかった場合 MsgBox "ヒットしませんでした。" Else '検索して見つかった場合 MsgBox "ヒットしました 位置:" + FoundRng.Address End If End Sub
<アスタリスクを使用>
Sub ExcelVBA_018_Example4() Dim FoundRng As Range 'Findメソッドの戻り値となる変数を定義 Dim InputValue As String '検索文字を記録する変数を定義 InputValue = "*012" '検索文字を指定 Set FoundRng = Cells.Find(what:=InputValue, lookat:=xlWhole) 'Findメソッドで検索 If FoundRng Is Nothing Then '戻り値によって分岐 '検索して見つからなかった場合 MsgBox "ヒットしませんでした。" Else '検索して見つかった場合 MsgBox "ヒットしました 位置:" + FoundRng.Address End If End Sub
終わりに
以上、Findメソッドを使ったマクロの紹介でした。
Findの機能自体はシンプルですが、処理の流れを見て理解しやすく、さらに繰り返し文よりも無駄なく動作します。
マクロに検索処理を記述するときは、積極的に使っていくことをおすすめします。
それでは、また次回お会いしましょう!