find関数

にメンテナンス済み

Excel 関数だけでは解決することの難しいデータ処理を行う際に、VBA(Visual Basic for Applications)を使用することが有用です。 その中でもFindメソッドは、特定の値をシート内で検索するための非常に便利な機能です。 本記事では、VBA のFindメソッドの基本的な使い方から、実際の業務で役立つ応用例までを詳しく解説します。

Find メソッドの基本

Findメソッドは、Rangeオブジェクトに対して特定の値を検索するためのメソッドです。

Find メソッドの基本的な構文

まずは、Findメソッドの基本的な構文を見ていきましょう。

Find関数の構文
RangeObject.Find(What, After, LookIn, LookAt, SearchOrder, SearchDirection, MatchCase, MatchByte, SearchFormat)
  • What: 検索する値を指定します。
  • After: 検索を開始するセルを指定します。省略可能です。
  • LookIn: 検索対象(値、数式、コメントなど)を指定します。
  • LookAt: 完全一致か部分一致かを指定します。
  • SearchOrder: 行単位か列単位かを指定します。
  • SearchDirection: 検索方向(次を検索か前を検索か)を指定します。
  • MatchCase: 大文字小文字を区別するかどうかを指定します。
  • MatchByte: 全角と半角を区別するかどうかを指定します。
  • SearchFormat: 検索するセルの書式を指定します(Excel 2007 以降)。

基本的な検索の例

次に、基本的な検索の例を見てみましょう。

Sub BasicFindExample()
    Dim ws As Worksheet
    Dim result As Range

    Set ws = ThisWorkbook.Sheets("Sheet1")
    Set result = ws.Cells.Find(What:="検索する値")

    If Not result Is Nothing Then
        MsgBox "値が見つかりました: " & result.Address
    Else
        MsgBox "値が見つかりませんでした"
    End If
End Sub

前述した通り、FindメソッドはRangeオブジェクトに対して検索を行うため、Cellsプロパティを使ってシート内のセル全てを対象に検索を行います。

Findメソッドは、検索結果が見つかった場合はそのセルを返し、見つからなかった場合はNothingを返します。

応用的な使い方

複数条件での検索

Findメソッドを使って複数条件で検索する方法について説明します。

Sub FindWithMultipleConditions()
    Dim ws As Worksheet
    Dim firstResult As Range
    Dim result As Range
    Dim searchVal1 As String, searchVal2 As String

    Set ws = ThisWorkbook.Sheets("Sheet1")
    searchVal1 = "条件1"
    searchVal2 = "条件2"

    Set firstResult = ws.Cells.Find(What:=searchVal1)

    If Not firstResult Is Nothing Then
        Set result = firstResult

        Do
            If ws.Cells(result.Row, result.Column + 1).Value = searchVal2 Then
                MsgBox "条件に一致しました: " & result.Address
                Exit Sub
            End If
            Set result = ws.Cells.FindNext(result)
        Loop While Not result Is Nothing And result.Address <> firstResult.Address
    End If

    MsgBox "条件に一致する値は見つかりませんでした"
End Sub

検索結果をリスト形式で取得

検索結果をリスト形式で取得し、別のシートに出力する方法をご紹介します。

Sub FindResultsToList()
    Dim ws As Worksheet
    Dim result As Range
    Dim searchValue As String
    Dim outputWs As Worksheet
    Dim outputRow As Long

    Set ws = ThisWorkbook.Sheets("Sheet1")
    Set outputWs = ThisWorkbook.Sheets.Add(After:=ws)
    searchValue = "検索する値"
    outputRow = 1

    Set result = ws.Cells.Find(What:=searchValue)

    If Not result Is Nothing Then
        Do
            outputWs.Cells(outputRow, 1).Value = result.Address
            outputRow = outputRow + 1
            Set result = ws.Cells.FindNext(result)
        Loop While Not result Is Nothing And result.Address <> outputWs.Cells(1, 1).Value
    Else
        MsgBox "値が見つかりませんでした"
    End If
End Sub

エラーハンドリング

検索が失敗した場合の対処

検索が失敗した場合、つまり値が見つからなかった場合のエラーハンドリングについて説明します。

Sub FindWithErrorHandling()
    Dim ws As Worksheet
    Dim result As Range

    Set ws = ThisWorkbook.Sheets("Sheet1")

    On Error Resume Next ' エラーが発生してもプログラムを続行する
    Set result = ws.Cells.Find(What:="検索する値")
    On Error GoTo 0 ' エラーの無視を終了

    If Not result Is Nothing Then
        MsgBox "値が見つかりました: " & result.Address
    Else
        MsgBox "値が見つかりませんでした"
    End If
End Sub

複数のエラーチェックポイント

複数のエラーチェックポイントを設定する方法について説明します。

Sub AdvancedErrorHandling()
    Dim ws As Worksheet
    Dim result As Range

    Set ws = ThisWorkbook.Sheets("Sheet1")

    On Error GoTo ErrHandler ' エラーが発生した場合にErrHandlerにジャンプ

    Set result = ws.Cells.Find(What:="検索する値")

    If result Is Nothing Then
        Err.Raise vbObjectError + 513, , "値が見つかりませんでした"
    End If

    MsgBox "値が見つかりました: " & result.Address
    Exit Sub

ErrHandler:
    MsgBox "エラーが発生しました: " & Err.Description
End Sub

おわりに

VBA のFindメソッドは、Excel シート内で特定のデータを検索する際に非常に便利です。 本記事で紹介した基本的な使い方から応用例を活用して、業務の効率を大幅に向上させることができます。 これらのテクニックを駆使して、より高度な Excel 操作を可能にしてください。

#vba #find #検索 #メソッド