VBA セルを検索する (Range.Find)

はじめに

Excel VBA マクロでセルを検索する方法を紹介します。

Range.Find または Cells.Find メソッドから、セルを検索できます。

FindNextFindPrevious メソッドから、続けて次のセルを検索できます。

数式や表示されている文字列、空のセルや空白が入ったセルなどを検索してセルを取得できます。

検索したセルの位置も取得できます。

セルを複数条件で検索するには「セルを複数条件で検索する」をご覧ください。
InStr 関数で文字列を検索するには「文字列を検索する」をご覧ください。
セルを範囲指定するすべての方法は「セルを範囲指定して取得する」をご覧ください。
  • 目次
    • Find メソッド
    • セルを検索する
    • FindNext メソッド
    • すべてのセルを検索する
    • 別シートのセルを検索する

Find メソッド

Find(What)

Find(What, After, LookIn, LookAt, SearchOrder, SearchDirection, MatchCase, MatchByte, SearchFormat)

引数「What」検索する文字列やワイルドカードを指定します。
引数「After」省略できます。検索開始点のセルを指定します。省略すると左上のセルになります。このセルの次のセルから検索されます。
引数「LookIn」 省略できます。検索対象を指定します。
  • xlFormulas:数式
  • xlValues:表示されている値
  • xlComments:コメント
引数「LookAt」 省略できます。完全に一致するセルを検索するか指定します。
  • xlPart:一部分が一致するセルの検索
  • xlWhole:完全に一致するセルを検索
引数「SearchOrder」 省略できます。どの方向に検索するか指定します。
  • xlByRows:行方向
  • xlByColumns:列方向
引数「SearchDirection」 省略できます。次のセルか前のセルか、どちらの方へ検索するか指定します。
  • xlNext:次へ
  • xlPrevious:前へ
引数「MatchCase」 省略できます。大文字と小文字を区別するか指定します。
  • True:区別する
  • False:区別しない
引数「MatchByte」 省略できます。半角と全角を区別するか指定します。
  • True:区別する
  • False:区別しない
引数「SearchFormat」 省略できます。書式を検索条件にするか指定します。
  • True:検索条件にする
  • False:検索条件にしない
戻り値の型セル (Range)

最初に見つかった 1 つ目のセルを返します。何も見つけられなかったときは Nothing を返します。

このメソッドは Excel の検索ダイアログと連動しています。引数を指定すると検索ダイアログのオプションが変更されます。逆に検索ダイアログでオプションを変更すると、引数の既定値がその値になります。引数を省略すると前回の値が引き継がれるため、すべての引数を指定するのをオススメします。

3

セルを検索する

検索条件に一致する最初の 1 つ目のセルを取得できます。すべてをまとめて取得することはできません。それをするにはループする必要があります。

Range の引数にセル名を指定すると、そのセルの範囲から検索できます。

セルの範囲「A1」~「B2」の 検索 を検索するには Range("A1:B2").Find("検索") を入力します。

Dim c As Range
Set c = Range("A1:B2").Find("検索", SearchOrder:=xlByRows)    ' 行方向に検索
Set c = Range("A1:B2").Find("検索", , xlFormulas, xlPart, xlByRows, xlNext, False, False, False)
Debug.Print(c.Address) ' $B$1

Set c = Range("A1:B2").Find("検索", SearchOrder:=xlByColumns) ' 列方向に検索
Set c = Range("A1:B2").Find("検索", , xlFormulas, xlPart, xlByColumns, xlNext, False, False, False)
Debug.Print(c.Address) ' $A$2
4
検索結果は引数「SearchOrder」によって変わりますが、セル「A1」が最初の検索結果になりません。

これは引数「After」のセルを基点として、その次のセルから検索されるためです。省略したときは範囲内の左上のセル「A1」が指定されます。その次のセルから検索するので、セル「A1」が検索結果になりません。

セル「A1」を最初に検索するには、引数「After」に範囲の最後のセルを指定します。

Dim c As Range
Set c = Range("A1:B2")
Set c = c.Find("検索", After:=c.Cells(c.Rows.Count, c.Columns.Count))
Debug.Print(c.Address) ' $A$1

すべてのセルから検索

シート全体のセルから検索するには Cells.Find を入力します。

Dim c As Range
Set c = Cells.Find("検索") ' すべてのセルを検索する
Debug.Print(c.Address)

ワイルドカード

引数「What」には、次のワイルドカードを使用できます。

パターン 説明 使用例 一致例
*任意の長さの文字"あ*"あ, あい, あいう
?任意の 1 文字"あ?"あい, あか, あき
~ワイルドカードの文字 * ? を検索する"あ~?~*"あ?*
Dim c As Range
Set c = Range("A1:B2").Find("A*") ' A から始まるセルを検索する
Set c = Range("A1:B2").Find("*")  ' 空のセル以外を検索する

空や空白のセルを検索

何も入力されていない空のセルを検索するには、引数「What」に "" を指定します。

Dim c As Range
Set c = Cells.Find("") ' 空のセル
Debug.Print(c.Address)

空白が入力されているセルを検索するには、引数「What」に " "" " を指定します。

Dim c As Range
Set c = Cells.Find(" ")  ' 半角スペースのセル
Debug.Print(c.Address)

Set c = Cells.Find(" ") ' 全角スペースのセル
Debug.Print(c.Address)

何も入力されていない空のセルをまとめて取得するには SpecialCells(xlCellTypeBlanks) を入力します。

Dim c As Range
Set c = Range("A1:B2").SpecialCells(xlCellTypeBlanks) ' 空のセルをまとめて取得する
Debug.Print(c.Address)
SpecialCells について詳しくは「セルを範囲指定して取得する」をご覧ください。

数式を検索

引数「LookIn」に xlFormulas を指定すると数式を対象に検索できます。Range.Formula の値を検索するため、数式が入力されていないときはセルの値を検索します。

引数「LookIn」に xlValues を指定すると表示されている文字を対象に検索できます。Range.Text の値を検索します。

Dim c As Range
Set c = Cells.Find("SUM(", , LookIn:=xlFormulas) ' SUM 関数のセルを検索する
Set c = Cells.Find("1,000", , LookIn:=xlValues)  ' 1,000 と表示されているセルを検索する
Debug.Print(c.Address)
Range.Formula の値を取得するには「セルの関数や数式を取得する」をご覧ください。

セルの位置を取得

検索したセルの位置を行番号と列番号で取得するには Range.Row または Range.Column を入力します。

Address プロパティから、そのセル名 (番地) を取得できます。絶対参照で取得します。

Dim c As Range
Set c = Cells.Find("検索") ' すべてのセルを検索する

Dim l As Long
l = c.Row    ' 行番号
l = c.Column ' 列番号
Debug.Print(l)

Dim s As String
s = c.Address ' $B$2 など
Debug.Print(s)
詳しくは「セルの位置を取得する」をご覧ください。

FindNext メソッド

FindNext(After)

引数「After」省略できます。検索開始点のセルを指定します。省略すると左上のセルになります。このセルの次のセルから検索されます。
戻り値の型セル (Range)

Find メソッドの検索を継続して次のセルを検索します。見つかった 1 つ目のセルが返ります。何も見つけられなかったときは Nothing を返します。

FindPrevious メソッドは前のセルを検索します。使い方は同じです。

すべてのセルを検索する

Find で検索後に FindNext を使用して、継続して次のセルを検索できます。

Dim r As Range
Set r = Range("A1:B2")

Dim c As Range
Set c = r.Find("検索", SearchOrder:=xlByColumns)
Debug.Print(c.Address) ' $A$2

Set c = r.FindNext(c)
Debug.Print(c.Address) ' $B$1

Set c = r.FindNext(c)
Debug.Print(c.Address) ' $B$2

Set c = r.FindNext(c)
Debug.Print(c.Address) ' $A$1

Set c = r.FindNext(c)
Debug.Print(c.Address) ' $A$2
4

最後のセルまで検索すると、次は最初のセルが検索されます。これが繰り返されます。

すべてのセルを検索したら終了するには、最初に検索したセルが再び検索されたかを判定します。

Dim r As Range
Set r = Range("A1:B2") ' 検索範囲

Dim c As Range
Set c = r.Find("検索", SearchOrder:=xlByColumns)

If c Is Nothing Then
    Exit Sub ' 見つけられないときは終了する
End If

Dim 最初のセル As String ' 最初に検索したセル
最初のセル = c.Address

Dim 検索結果 As Range ' 検索したすべてのセル
Set 検索結果 = c

Do
    Set c = r.FindNext(c) ' 次のセルを検索する

    If c.Address = 最初のセル Then ' 最初のセルと同じセルなら検索を終了する
        Exit Do
    End If

    Set 検索結果 = Union(検索結果, c) ' 検索結果を結合する
Loop

Debug.Print(検索結果.Address) ' $A$1:$B$2

Union メソッドで 2 つのセルの範囲を結合できます。

まとめて取得

特定の条件にあるセルをまとめて取得するには SpecialCells メソッドを入力します。

Dim c As Range
Set c = Range("A1:B2").SpecialCells(xlCellTypeBlanks) ' 空のセルをまとめて取得する
Debug.Print(c.Address)
SpecialCells について詳しくは「セルを範囲指定して取得する」をご覧ください。

別シートのセルを検索する

シートを指定するには Worksheets の引数にシート名またはインデックスを指定します。

Sheet1 を指定するには Worksheets("Sheet1") または Worksheets(1) を入力します。

sheet1
Dim c As Range
' Sheet1 のセル「A1」~「B2」を検索
Set c = Worksheets("Sheet1").Range("A1:B2").Find("検索")
Set c = Worksheets(1).Range("A1:B2").Find("検索")

' Sheet2 のセル「A1」~「B2」を検索
Set c = Worksheets("Sheet2").Range("A1:B2").Find("検索")
Set c = Worksheets(2).Range("A1:B2").Find("検索")

Sheet1 に Range や Cells を入力すると、自身のシートのセルになります。自身を表す Me. が省略されています。

' どちらも同じコード
Range("A1").Value = "Sheet1"
Me.Range("A1").Value = "Sheet1"

標準モジュールに Range や Cells を入力すると、開いているシートのセルになります。アクティブシートを表す ActiveSheet. が省略されています。

' どちらも同じコード
Range("A1").Value = "アクティブ"
ActiveSheet.Range("A1").Value = "アクティブ"