Sub TEST()
'シートをクリア
Sheets("検索").Range("A4:H1000").Clear
'フィルタする
Sheets("DB").Range("A1").AutoFilter 2, "*" & Sheets("検索").Range("B2") & "*"
'フィルタ結果をコピー
Sheets("DB").Range("A1").CurrentRegion.Copy Sheets("検索").Range("A4")
'フィルタを解除
Sheets("DB").Range("A1").AutoFilter
End Sub
「氏名」を入力します。
「氏名」を入力
実行すると、「氏名」でデータを抽出できます。
「氏名」でデータを抽出できた
「氏名」でデータを抽出できました。
データ部分のみを抽出
次は、データ部分のみを抽出してみます。
フィルタ結果のデータ部分のみを取得するVBAコードは、次のようになります。
Sub TEST()
'シートをクリア
Sheets("検索").Range("A5:H1000").Clear
'フィルタする
Sheets("DB").Range("A1").AutoFilter 2, "*" & Sheets("検索").Range("B2") & "*"
'フィルタ結果のデータ部分のみをコピー
With Sheets("DB").Range("A1").CurrentRegion
.Resize(.Rows.Count - 1).Offset(1, 0).Copy Sheets("検索").Range("A5")
End With
'フィルタを解除
Sheets("DB").Range("A1").AutoFilter
End Sub
では、実行してみます。
データ部分のみを抽出する
「氏名」を入力します。
データ部分のみを抽出できます。
データ部分のみを抽出できました。
確認のために、見出しを変更して、実行してみます。
見出しはそのままで、データ部分のみを抽出できる
確認のために、見出しを変更してデータを抽出してみます。
見出しはそのままで、データを抽出できます。
見出しはそのままで、データを抽出できました。
フィルタ結果がある場合に抽出
フィルタ結果がない場合に、データ部分のみを取得すると、データ全体を取得しちゃいます。
なので、フィルタ結果がある場合にのみデータをコピーするといいです。
フィルタ結果がない場合でやってみます。
データベースにない値で検索してみる
データベースにない値で、検索してみます。
すべてのデータを抽出してしまいます。
すべてのデータを抽出してしまいました。
フィルタ結果がある場合にのみ。データを抽出するようにします。
フィルタ結果がある場合に抽出する
フィルタ結果がある場合に抽出するVBAコードです。
Sub TEST()
'シートをクリア
Sheets("検索").Range("A5:H1000").Clear
'フィルタする
Sheets("DB").Range("A1").AutoFilter 2, "*" & Sheets("検索").Range("B2") & "*"
'フィルタ結果がある場合
If WorksheetFunction.Subtotal(3, Sheets("DB").Range("A:A")) > 1 Then
'フィルタ結果のデータ部分のみをコピー
With Sheets("DB").Range("A1").CurrentRegion
.Resize(.Rows.Count - 1).Offset(1, 0).Copy Sheets("検索").Range("A5")
End With
End If
'フィルタを解除
Sheets("DB").Range("A1").AutoFilter
End Sub
フィルタ結果がない場合は、データをそのままにできます。
フィルタ結果がない場合は、データをそのままにできました。
空白時は処理を終了
検索するデータが空欄の場合も、すべてのデータを抽出してしまいます。
なので、検索値が空欄の場合は、処理を終了するといいです。
空白の場合で、やってみます。
空白で検索してみる
空白で検索してみます。
すべてのデータを抽出してしまいます。
すべてのデータを抽出してしまいました。
検索値が空白の場合は、処理を終了するVBAコードを追加します。
空白の場合は処理を終了する
空白の場合は、処理を終了するVBAコードです。
Sub TEST()
'シートをクリア
Sheets("検索").Range("A5:H1000").Clear
'空欄の場合は、処理を終了
If Sheets("検索").Range("B2") = "" Then Exit Sub
'フィルタする
Sheets("DB").Range("A1").AutoFilter 2, "*" & Sheets("検索").Range("B2") & "*"
'フィルタ結果がある場合
If WorksheetFunction.Subtotal(3, Sheets("DB").Range("A:A")) > 1 Then
'フィルタ結果のデータ部分をコピー
With Sheets("DB").Range("A1").CurrentRegion
.Resize(.Rows.Count - 1).Offset(1, 0).Copy Sheets("検索").Range("A5")
End With
End If
'フィルタを解除
Sheets("DB").Range("A1").AutoFilter
End Sub
空白の場合は、処理を終了できます。
空白の場合は、処理を終了できました。
Changeイベントを使う
検索値を入力したタイミングで、データを抽出できると便利です。
Changeイベントを使えば、データを入力したタイミングで、データを抽出することができます。
Private Sub Worksheet_Change(ByVal Target As Range)
'B2セル以外が変更された場合は、終了
If Intersect(Target, Range("B2")) Is Nothing Then Exit Sub
'データを抽出する
Call TEST
End Sub