-
∨目次
- Find メソッド
- セルを検索する
- FindNext メソッド
- すべてのセルを検索する
- 指定したシートのセルを検索する
VBA セルを検索する
はじめに
Excel VBA マクロのセルを検索する方法を紹介します。
Range.Find メソッドまたは Cells.Find メソッドでセルを検索できます。FindNext や FindPrevious メソッドで次のセルを検索できます。
空や空白のセルの他に、条件に一致するすべてのセルを取得できます。
- セルを複数条件で検索するには「セルを複数条件で検索する」をご覧ください。
- 文字列を検索するには「文字列を操作する」をご覧ください。
- セルを取得するには「セルや範囲を取得する」をご覧ください。
-
目次
- Find メソッド
- セルを検索する
- FindNext メソッド
- すべてのセルを検索する
- 指定したシートのセルを検索する
Find メソッド
Find(What)
Find(What, After, LookIn, LookAt, SearchOrder, SearchDirection, MatchCase, MatchByte, SearchFormat)
引数「What」 | 検索する文字列やワイルドカードを指定します。 |
引数「After」 | 省略できます。検索開始点のセルを指定します。省略すると左上のセルになります。このセルの次のセルから検索されます。 |
引数「LookIn」 |
省略できます。検索対象を指定します。
|
引数「LookAt」 |
省略できます。完全に一致するセルを検索するか指定します。
|
引数「SearchOrder」 |
省略できます。どの方向に検索するか指定します。
|
引数「SearchDirection」 |
省略できます。次のセルか前のセルか、どちらの方へ検索するか指定します。
|
引数「MatchCase」 |
省略できます。大文字と小文字を区別するか指定します。
|
引数「MatchByte」 |
省略できます。半角と全角を区別するか指定します。
|
引数「SearchFormat」 |
省略できます。書式を検索条件にするか指定します。
|
戻り値の型 | セル (Range) |
最初に見つかった 1 つ目のセルが返ります。何も見つけられなかったときは Nothing が返ります。
このメソッドは Excel の検索ダイアログと連動しています。引数を指定すると検索ダイアログのオプションが変更されます。逆に検索ダイアログでオプションを変更すると、引数の既定値がその値になります。引数を省略すると前回の値が引き継がれるため、すべての引数を指定するのをオススメします。

スポンサーリンク
セルを検索する
検索条件に一致する最初の 1 つ目のセルを取得できます。すべてをまとめて取得することはできません。それをするにはループする必要があります。
範囲内のセルから検索
Range の引数にセル名を指定すると、そのセルの範囲から検索できます。
セル「A1」~「B2」を検索するにはRange("A1:B2").Findを入力します。
Dim c As Range
Set c = Range("A1:B2").Find("検索", SearchOrder:=xlByRows)
Debug.Print(c.Address) ' $B$1
Set c = Range("A1:B2").Find("検索", SearchOrder:=xlByColumns)
Debug.Print(c.Address) ' $A$2

これは引数「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)
次のセルを検索
Find で検索後に FindNext メソッドでその次のセルを検索できます。
詳しくは下記の「すべてのセルを検索する」をご覧ください。
ワイルドカード
引数「What」には、次のワイルドカードを使用できます。
パターン | 説明 | 使用例 | 一致例 |
* | 任意の長さの文字 | "あ*" | あ, あい, あいう |
? | 任意の 1 文字 | "あ?" | あい, あか, あき |
~ | ワイルドカードの文字 * ? を検索する | "あ~?~*" | あ?* |
Dim c As Range
Set c = Range("A1:B2").Find("A*") ' A から始まる文字列を検索する
空や空白のセルを検索
何も入力されていない空のセルを検索するには、引数「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)
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

最後のセルまで検索すると、次は最初のセルが検索されます。これが繰り返されます。
すべてのセルを検索したら終了するには、最初に検索したセルが再び検索されたかを判定します。
Sub 実行()
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
End Sub
Union メソッドで 2 つのセルの範囲を結合できます。
指定したシートのセルを検索する
シートを指定するには Worksheets の引数にシート名またはインデックスを指定します。
Sheet1 を指定するにはWorksheets("Sheet1")またはWorksheets(1)を入力します。

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 = "アクティブ"
スポンサーリンク