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

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」 省略できます。検索対象を指定します。
  • 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)
Debug.Print (c.Address) ' $B$1

Set c = Range("A1:B2").Find("検索", SearchOrder:=xlByColumns)
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)

次のセルを検索

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
4

最後のセルまで検索すると、次は最初のセルが検索されます。これが繰り返されます。

すべてのセルを検索したら終了するには、最初に検索したセルが再び検索されたかを判定します。


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)を入力します。

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 = "アクティブ"
  • 目次
    • Find メソッド
    • セルを検索する
    • FindNext メソッド
    • すべてのセルを検索する
    • 指定したシートのセルを検索する