更新日:、 作成日:
VBA セルを検索する (Range.Find)
はじめに
Excel VBA マクロでセルを検索する方法を紹介します。
Range.Find または Cells.Find メソッドから、セルを検索できます。
FindNext や FindPrevious メソッドから、続けて次のセルを検索できます。
数式や表示されている文字列、空のセルや空白が入ったセルなどを検索してセルを取得できます。
検索したセルの位置も取得できます。
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 の検索ダイアログと連動しています。引数を指定すると検索ダイアログのオプションが変更されます。逆に検索ダイアログでオプションを変更すると、引数の既定値がその値になります。引数を省略すると前回の値が引き継がれるため、すべての引数を指定するのをオススメします。
スポンサーリンク
セルを検索する
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
これは引数「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)
数式を検索
引数「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.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
最後のセルまで検索すると、次は最初のセルが検索されます。これが繰り返されます。
すべてのセルを検索したら終了するには、最初に検索したセルが再び検索されたかを判定します。
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)
別シートのセルを検索する
シートを指定するには 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 = "アクティブ"
スポンサーリンク