更新日:、 作成日:

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

はじめに

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

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

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

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

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

セルを複数条件で検索するには「セルを複数条件で検索する」をご覧ください。
InStr 関数で文字列を検索するには「文字列を検索する」をご覧ください。
セルを範囲指定するすべての方法は「セルを範囲指定して取得する」をご覧ください。

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 = "アクティブ"