ラピードアクト株式会社

技術記事:ExcelVBAで仕事を効率化しようVol.18

みなさん、こんにちは。
ITソリューション事業部の林です。

本記事では、ExcelVBAのテクニックを紹介・解説いたします。
今回紹介するのは、「ワークシートの文字列検索」です。

【目次】

  1. 文字列を検索する手段について
  2. Findメソッドの構文
  3. 使用例
  4. 終わりに

それでは、始めましょう!

文字列を検索する手段について

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の機能自体はシンプルですが、処理の流れを見て理解しやすく、さらに繰り返し文よりも無駄なく動作します。
マクロに検索処理を記述するときは、積極的に使っていくことをおすすめします。

それでは、また次回お会いしましょう!