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

VBA セルを検索する

はじめに

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

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

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

  • 目次
    • Find メソッド
    • セルを検索する
    • セルを最後まで検索する
    • 指定したシートのセルを検索する

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 の引数にシート名またはインデックスを指定します。

sheet1

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 ("検索")
  • 目次
    • Find メソッド
    • セルを検索する
    • セルを最後まで検索する
    • 指定したシートのセルを検索する