Excel VBA スタンダード・セルの検索とオートフィルターの操作について

Excel VBAのセルの検索とオートフィルターの操作は、Findメソッド、AutoFilterメソッドです。

 

Excel VBA Findメソッド

Findメソッド

Findメソッドは、Excel VBAで特定の値を検索するために使用します。その際に検索に関する様々な引数が指定できます。

 

Findメソッドの引数

What
検索したい値やテキストを指定します。

After
検索を開始するセルの位置を指定します。指定しない場合は、検索は開始位置から行われます。

LookIn
検索対象の範囲を指定します。セルの値、数式、コメントなどのいずれかを選択します。

LookAt
検索時の一致条件を指定します。完全一致、部分一致などを選択できます。

SearchOrder
検索順序を指定します。行方向、列方向などの検索方法を指定できます。

SearchDirection
検索の方向を指定します。上から下、左から右などの方向を選択できます。

MatchCase
大文字と小文字を区別するかどうかを指定します。

MatchByte
ダブルバイト文字の区別を行うかどうかを指定します。

SearchFormat
検索対象とするセルの書式を指定します。

 

Sub FindExample()
    Dim ws As Worksheet
    Dim searchValue As String
    Dim foundCell As Range
    
    ' 検索する値と対象のワークシートを指定
    Set ws = ThisWorkbook.Sheets("Sheet1")
    searchValue = "Apple" ' 検索する値
    
    ' Findメソッドを使用して値を検索
    Set foundCell = ws.Cells.Find(What:=searchValue, LookIn:=xlValues, LookAt:=xlWhole)
    
    If Not foundCell Is Nothing Then
        MsgBox "値が見つかりました。セルの位置は: " & foundCell.Address
    Else
        MsgBox "値が見つかりませんでした。"
    End If
End Sub

指定した値("Apple")をワークシート内で検索しています。Findメソッドの検索条件としては、検索値(What)と検索対象(LookIn)を設定しています。見つかった場合はセルの位置が、見つからなかった場合はメッセージが表示されます。

What

' 文字列"Apple"を検索する例
Set foundCell = ws.Cells.Find(What:="Apple")

 

After

' A1セルの後から検索を開始する例
Set foundCell = ws.Cells.Find(What:="Apple", After:=ws.Range("A1"))

 

LookIn

' 数式を検索する例
Set foundCell = ws.Cells.Find(What:="Apple", LookIn:=xlFormulas)

 

LookAt

' 完全一致で検索する例
Set foundCell = ws.Cells.Find(What:="Apple", LookAt:=xlWhole)

 

SearchOrder

' 行方向で検索する例
Set foundCell = ws.Cells.Find(What:="Apple", SearchOrder:=xlByRows)

 

SearchDirection

' 一致する前の値を検索する例
Set foundCell = ws.Cells.Find(What:="Apple", SearchDirection:=xlPrevious)

 

MatchCase

' 大文字小文字を区別して検索する例
Set foundCell = ws.Cells.Find(What:="Apple", MatchCase:=True)

 

MatchByte

' 2バイト文字が2バイト文字とだけ一致する例
Set foundCell = ws.Cells.Find(What:="りんご", MatchByte:=True)

 

SearchFormat

’ 書式を検索する例
Application.FindFormat.Clear
Application.FindFormat.Interior.Color = vbRed
Set foundCell = ws.Cells.Find(What:="*", SearchFormat:=True)

 

FindメソッドでA列全体の指定で検索する

Sub FindInColumnA()
    Dim ws As Worksheet
    Dim foundCell As Range
    Dim searchValue As String
    
    ' 対象のワークシートを指定
    Set ws = ThisWorkbook.Sheets("Sheet1")
    
    ' 検索する値を指定
    searchValue = "Apple"
    
    ' A列全体を対象にして検索する
    Set foundCell = ws.Columns("A:A").Find(What:=searchValue)
    
    ' 検索結果をチェック
    If Not foundCell Is Nothing Then
        MsgBox "値が見つかりました。セルの位置は: " & foundCell.Address
    Else
        MsgBox "値が見つかりませんでした。"
    End If
End Sub

Sheet1のA列全体を対象にして、"Apple"という値を検索しています。Columns("A:A")はA列全体を表し、その範囲でFindメソッドが実行されます。見つかった場合はそのセルの位置が、見つからなかった場合はメッセージが表示されます。

 

Findメソッドで見つからなかったときのNothing

Findメソッドは、指定した条件に合うセルを検索する際に使用します。Nothing は、条件に一致する値が見つからなかった場合に使います。

Sub FindNothingExample()
    Dim ws As Worksheet
    Dim foundCell As Range
    Dim searchValue As String
    
    ' 対象のワークシートを指定
    Set ws = ThisWorkbook.Sheets("Sheet1")
    
    ' 検索する値を指定
    searchValue = "Banana"
    
    ' A列全体を対象にして検索する
    Set foundCell = ws.Columns("A:A").Find(What:=searchValue)
    
    ' 検索結果をチェックし、見つからなかった場合の処理を行う
    If foundCell Is Nothing Then
        MsgBox "値が見つかりませんでした。"
    Else
        MsgBox "値が見つかりました。セルの位置は: " & foundCell.Address
    End If
End Sub

Sheet1 のA列全体を対象にして、"Banana"という値を検索しています。見つからなかった場合には、「値が見つかりませんでした。」というメッセージが表示されます。

 

Findメソッドでセルを含む行をEntireRowで削除する

Sub DeleteRowWithFind()
    Dim ws As Worksheet
    Dim foundCell As Range
    Dim searchValue As String
    
    ' 対象のワークシートを指定
    Set ws = ThisWorkbook.Sheets("Sheet1")
    
    ' 検索する値を指定
    searchValue = "Banana"
    
    ' A列全体を対象にして検索する
    Set foundCell = ws.Columns("A:A").Find(What:=searchValue)
    
    ' 検索結果をチェックし、見つかった場合はその行を削除する
    If Not foundCell Is Nothing Then
        foundCell.EntireRow.Delete
        MsgBox "値が見つかり、その行を削除しました。"
    Else
        MsgBox "値が見つかりませんでした。"
    End If
End Sub

Sheet1 のA列全体を対象にして、"Banana"という値を検索し、見つかった場合にその行全体を削除します。

foundCell.EntireRow.Deleteの部分が、見つかったセルを含む行を削除するためのコードです。その後、削除が行われたかどうかのメッセージが表示されます。

 

Findメソッドの検索結果をOffsetで操作する

Offset は、指定したセルから指定された行数と列数だけ移動した位置にあるセルを表すプロパティです。Offset を使うことで、指定したセルから相対的に移動した位置にあるセルを操作できます。

Sub OffsetExample()
    Dim ws As Worksheet
    Dim foundCell As Range
    Dim searchValue As String
    Dim cellBelow As Range
    
    ' 対象のワークシートを指定
    Set ws = ThisWorkbook.Sheets("Sheet1")
    
    ' 検索する値を指定
    searchValue = "Banana"
    
    ' A列全体を対象にして検索する
    Set foundCell = ws.Columns("A:A").Find(What:=searchValue)
    
    ' 検索結果をチェックし、見つかった場合はそのセルから1行下のセルを取得する
    If Not foundCell Is Nothing Then
        Set cellBelow = foundCell.Offset(1, 0)
        MsgBox "値が見つかりました。1行下のセルの値は: " & cellBelow.Value
    Else
        MsgBox "値が見つかりませんでした。"
    End If
End Sub

Sheet1 のA列全体を対象にして、"Banana"という値を検索し、見つかった場合にそのセルから1行下のセルを取得しています。Offset(1, 0) の部分が、見つかったセルから1行下のセルを取得するためのコードです。そして、そのセルの値がメッセージボックスで表示されます。

 

Findメソッドの検索結果をCopyとEnd(xlToRight)で操作する

Copyメソッドは、指定した範囲やセルをコピーするメソッドです。xlToRight は、範囲を指定したセルから右端まで拡張する定数です。

Sub CopyToRangeE2()
    Dim A As Range
    
    ' 対象のワークシートを指定
    Set A = Range("A:A").Find(What:="Banana")
    
    ' 検索結果をチェックし、見つかった場合は指定された範囲をコピーする
    If A Is Nothing Then
        MsgBox "値が見つかりませんでした。"
    Else
        ' 検索されたセルから右端までの範囲を指定
        Range(A, A.End(xlToRight)).Copy Range("E2")
        MsgBox "値が見つかりました。コピーが完了しました。"
      
    End If
End Sub

Sheet1のA列全体を対象にして、"Banana"という値を検索し、見つかった場合にそのセルを基準にして右端までの範囲を取得します。そして、その範囲をE2にコピーします。`xlToRight`は、右端までの範囲を指定する定数として使用します。

 

Findメソッドの検索結果をResizeで操作する

Resize は、指定された範囲のサイズを変更します。指定された行数と列数にサイズを変更した範囲を操作できます。

Sub ResizeExample()
    Dim ws As Worksheet
    Dim ws2 As Worksheet
    Dim foundCell As Range
    Dim searchValue As String
    Dim copyRange As Range
    
    ' 対象のワークシートを指定
    Set ws = ThisWorkbook.Sheets("Sheet1")
    Set ws2 = ThisWorkbook.Sheets("Sheet2")
    
    ' 検索する値を指定
    searchValue = "Banana"
    
    ' A列全体を対象にして検索する
    Set foundCell = ws.Columns("A:A").Find(What:=searchValue)
    
    ' 検索結果をチェックし、見つかった場合は指定された範囲をコピーする
    If Not foundCell Is Nothing Then
        ' 検索されたセルから右に3つのセル分の範囲を取得する
        Set copyRange = foundCell.Resize(1, 3)
        
        ' シート2のA1にコピー
        copyRange.Copy ws2.Range("A1")
        
        MsgBox "値が見つかりました。コピーが完了しました。"
    Else
        MsgBox "値が見つかりませんでした。"
    End If
End Sub

Sheet1 のA列全体を対象にして、"Banana"という値を検索し、見つかった場合にそのセルを基準にして右に3つのセル分の範囲を取得します。そして、その範囲をシート2のA1にコピーします。Resize(1, 3) は、1行3列の範囲を指定しています。

 

Excel VBA AutoFilterメソッド

AutoFilterメソッド

AutoFilterメソッドは、データ範囲をフィルタリングして表示するメソッドです。

 

AutoFilterメソッドの引数

Field
フィルタリングする列の番号やフィールド名を指定します。

Criteria1
フィルタリングの条件を指定します。

Operator
条件の比較演算子を指定します。

Criteria2
二つ目の条件を指定します。

Sub FilterExample()
    Dim ws As Worksheet
    Dim rng As Range
    
    ' 対象のワークシートを指定
    Set ws = ThisWorkbook.Sheets("Sheet1")
    
    ' フィルタリングするデータ範囲を指定
    Set rng = ws.Range("A1:D10") ' 例えばA1からD10までのデータ範囲
    
    ' AutoFilterを適用する(Field=1の列でCriteria1="Apple"の行を表示)
    rng.AutoFilter Field:=1, Criteria1:="Apple"
End Sub

Sheet1 のA1からD10までのデータ範囲に対して、1番目の列(Field=1)で"Apple"という条件(Criteria1="Apple")を使ってフィルタリングをかけます。

条件を指定した列に基づいて、特定のデータを表示したり非表示にしたりすることができます。条件や操作子を変えることで、様々なフィルタリングを行えます。

 

AutoFilterメソッドでCriteria1に複数条件を配列形式で指定

Sub MultiCriteriaFilter()
    Dim ws As Worksheet
    Dim rng As Range
    Dim criteriaArray As Variant
    
    ' 対象のワークシートを指定
    Set ws = ThisWorkbook.Sheets("Sheet1")
    
    ' フィルタリングするデータ範囲を指定
    Set rng = ws.Range("A1:D10") ' 例えばA1からD10までのデータ範囲
    
    ' 複数の条件を配列で指定
    criteriaArray = Array("Apple", "Orange", "Banana")
    
    ' Field=1の列でCriteria1に複数条件を指定してフィルタリング
    rng.AutoFilter Field:=1, Criteria1:=criteriaArray, Operator:=xlFilterValues
End Sub

Sheet1のA1からD10までのデータ範囲に対して、1番目の列(Field=1)で複数の条件を指定してフィルタリングをかけます。Criteria1 に複数の条件を配列として指定し、Operator に xlFilterValues を指定で、配列内のいずれかの条件に合致する行を表示します。

 

AutoFilterメソッドで絞り込んだ結果をCurrentRegionで操作

CurrentRegion は、指定したセルを含む連続するデータを操作できます。

Sub CopyCurrentRegion()
    Dim A As Range
    
    ' A列 Bananaで絞り込み
    Range("A1").AutoFilter 1, "Banana"
    
    ' 検索結果セルA1を含むひとかたまりの範囲をシート2のA1にコピー
    Range("A1").CurrentRegion.Copy Sheets("Sheet2").Range("A1")
End Sub

指定した条件 "Banana"でデータをフィルタリングし、その結果得られたデータ範囲を CurrentRegion を使って、シート2のA1にコピーしています。

 

AutoFilterメソッドで絞り込んだ結果をSubtotalで操作

Subtotal 関数は、データの集計を行う機能です。データを絞り込んだ後に、Subtotal関数を使って集計できます。

Sub FilterAndCountWithSubtotal()
    Dim N As Long
   
    ' AutoFilterで条件を適用
    Range("A1").AutoFilter Field:=1, Criteria1:="Banana"
    
    ' サブトータルを使って絞り込んだデータのカウントを行う
    N = WorksheetFunction.Subtotal(3, Range("A:A"))
    
    ' カウント結果を表示(例えば即時ウィンドウに出力)
    Debug.Print "Count of filtered data: " & N
    
    ' フィルタを解除
    Range("A1").AutoFilter 1
    
End Sub

Subtotal関数の第1引数に 3 を指定で「カウント」を示す定数です。A列をBananaで絞り込んで、Subtotalで件数を取得して、ウィンドウに出力しています。

 

AutoFilterメソッドで絞り込んだ結果をEnd(xlUp)で操作

End(xlUp) は指定セルから最終行までの範囲を指定します。

Sub FilterAndEndxlUpl()
    Dim N As Long
   
    ' AutoFilterで条件を適用
    Range("A1").AutoFilter Field:=1, Criteria1:="Banana"
    
    ' AutoFilterで絞り込んだ結果を、A1から最終行範囲に100を代入します。
    Range(Range("D2"), Cells(Rows.Count, 4).End(xlUp)) = 100
    
    ' フィルタを解除
    Range("A1").AutoFilter 1
    
End Sub

A列をBananaで絞り込んで、D2から下方向に最終行まで100を代入します。

Excel VBAのスキルを活かして、開発者としてのキャリアを築いてみませんか?

当サイトでは、Excel VBAエキスパート認定資格取得に向けた情報を提供しています。興味がある方は、ぜひ以下の問題集からチャレンジしてみてください。

 

ExcelVBAエキスパートベーシック
仕事の効率をあげるためにExcelVBAを利用する人が対象の問題集です。


ExcelVBAエキスパートスタンダード

ExcelVBAの開発を仕事にする人が対象の問題集です。