サイトについて      連絡先   検索

VBA セルを検索する

はじめに

Excel VBA のセルを検索する方法を紹介します。

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

Range.FindNext メソッドと Range.FindPrevious メソッドで一致する全てのセルを検索できます。

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)

検索結果が一つもないときは Nothing が返ります。

引数を省略すると前回の値が引き継がれます。予期せぬ動作にならないように、全ての引数を指定するのをオススメします。

セルを検索する

範囲内のセルを検索

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

セル「A1」~「B2」を検索するには Range("A1:B2").Find のように指定します。

Dim c As Range
Set c = Range("A1:B2").Find("検索") ' A1 の次から検索
Set c = Range("A1:B2").Find("検索", Range("A1"))
Debug.Print(c.Address) ' $B$1

上記のコードを次の画像に対して行うと、最初に検索されるセルは「B1」になります。

1

これは引数「After」の次から検索が開始されるためです。

全てのセルを検索

全てのセルを検索するには Cells.Find のように指定します。

Dim c As Range
Set c = Cells.Find("検索")
Debug.Print(c.Address) ' $B$1

空白のセルを検索

空のセルを検索するには Cells.Find("") や Cells.Find(" ") のように指定します。

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

ActiveCell.SpecialCells(xlCellTypeBlanks) で空のセルをまとめて検索できます。

Dim c As Range
Set c = ActiveCell.SpecialCells(xlCellTypeBlanks) ' 空のセル
c.Select

セルを最後まで検索する

Find で検索した結果が複数一致するときは FindNext メソッドで次のセルを検索できます。

FindNext の引数にセルを指定するとそのセルの次のセルを検索します。

Dim c As Range
Dim first As String
' 最初の検索
Set c = Cells.Find("検索")
If c Is Nothing Then
    Exit Sub
End If

first = c.Address
Debug.Print(c.Address)

Do
    ' c に対する処理

    ' 次を検索
    Set c = Cells.FindNext(c)
    If c Is Nothing Then
        Exit Do
    End If
    If c.Address = first Then
        Exit Do
    End If
    Debug.Print(c.Address)
Loop

検索は次の順番で行われます。

2

first = c.Address のように、最初の検索した位置を取得しているのは FindNext は永遠と次のセルを検索するためです。最初に検索した位置と同じ位置のセルを検索したら、処理を抜けるようにしています。

指定したシートのセルを検索する

Range.Find とコードに書くと、アクティブなシートのセルを検索します。これは ActiveSheet.Range.Find の ActiveSheet が省略されています。

' どちらも同じコード
Range("A1:B2").Find ("検索")
ActiveSheet.Range("A1:B2").Find ("検索")

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

1

Sheet1 のシートを指定するには、Sheets("Sheet1") か Sheets(1) と書きます。

' Sheet1 のセル「A1」~「B2」を検索
Sheets("Sheet1").Range("A1:B2").Find ("検索")
Sheets(1).Range("A1:B2").Find ("検索")

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

関連ページ