Sub TEST()
'シートをクリア
Sheets("検索").Range("A5:D1000").Clear
Dim A, B
A = Sheets("検索").Range("B2") '開始日付
B = Sheets("検索").Range("B3") '終了日付'日付でフィルタ
Sheets("DB").Range("A1").AutoFilter 1, ">=" & A, xlAnd, "<=" & B
'フィルタ結果をコピー
Sheets("DB").Range("A1").CurrentRegion.Copy Sheets("検索").Range("A5")
Sheets("DB").Range("A1").AutoFilter 'フィルタを解除
End Sub
フォームを作成して日付を入力しておきます。
フォームを作成して日付を入力
フォームを作成しておきます。
日付を入力します。
実行すると、日付で、データを抽出できます。
日付でデータを抽出できた
日付で、データを抽出できました。
データ部分のみを抽出
フィルタ結果のデータ部分のみを抽出してみます。
見出しはそのままで、日付でデータを抽出することができます。
Sub TEST()
'シートをクリア
Sheets("検索").Range("A6:D1000").Clear
Dim A, B
A = Sheets("検索").Range("B2") '開始日付
B = Sheets("検索").Range("B3") '終了日付'日付でフィルタ
Sheets("DB").Range("A1").AutoFilter 1, ">=" & A, xlAnd, "<=" & B
'フィルタ結果のデータ部分のみをコピー
With Sheets("DB").Range("A1").CurrentRegion
.Resize(.Rows.Count - 1).Offset(1, 0).Copy Sheets("検索").Range("A6")
End With
'フィルタを解除
Sheets("DB").Range("A1").AutoFilter
End Sub
では、実行してみます。
データ部分のみを抽出
あらかじめ、見出しは入力しておきます。
実行すると、データ部分のみを抽出できます。
データ部分のみを抽出できました。
見出しを変更して確認してみます。
見出しを変更して確認してみる
見出しを変更してみます。
実行してみます。
見出しはそのままで、データ部分のみを抽出できました。
フィルタ結果がある場合に抽出
データ部分のみを取得する際は、フィルタ結果がある場合にのみコピーするといいです。
フィルタ結果がない場合、すべてのデータを抽出しちゃいます。
ちょっとやってみます。
フィルタ結果がない場合、すべてのデータを抽出しちゃう
フィルタ結果がない場合で、実行してみます。
すべてのデータを抽出してしまいます。
すべてのデータを抽出してしまいました。
対策としては、フィルタ結果がある場合に、抽出するといいです。
フィルタ結果がある場合に、抽出する
フィルタ結果がある場合に、抽出するVBAコードです。
Sub TEST()
'シートをクリア
Sheets("検索").Range("A6:D1000").Clear
Dim A, B
A = Sheets("検索").Range("B2") '開始日付
B = Sheets("検索").Range("B3") '終了日付'日付でフィルタ
Sheets("DB").Range("A1").AutoFilter 1, ">=" & A, xlAnd, "<=" & B
'フィルタ結果がある場合
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("A6")
End With
End If
'フィルタを解除
Sheets("DB").Range("A1").AutoFilter
End Sub
フィルタ結果がない場合で、実行してみます。
フィルタ結果がないので、そのままとなります。
フィルタ結果がないので、そのままとなりました。
Changeイベントを使う
Changeイベントを使えば、日付を入力したタイミングで、データを抽出することができます。
Private Sub Worksheet_Change(ByVal Target As Range)
'B2もしくはB3以外が変更された場合は、終了
If Intersect(Target, Range("B2:B3")) Is Nothing Then Exit Sub
Call TEST '日付でデータを抽出
End Sub
日付を変更してデータを抽出してみます。
日付を変更してデータを抽出
日付を変更してみます。
日付を変更したタイミングで、データを抽出できます。
日付を変更したタイミングで、データを抽出できました。
一部のデータを抽出する
一部のデータを抽出してみます。
離れたデータを抽出
実務では、すべての列だけではなく、一部の列のデータを抽出したいという場合があるかと思います。
離れたデータを抽出してみます。
Sub TEST()
'シートをクリア
Sheets("検索").Range("A6:D1000").Clear
Dim A, B
A = Sheets("検索").Range("B2") '開始日付
B = Sheets("検索").Range("B3") '終了日付'日付でフィルタ
Sheets("DB").Range("A1").AutoFilter 1, ">=" & A, xlAnd, "<=" & B
'フィルタ結果がある場合
If WorksheetFunction.Subtotal(3, Sheets("DB").Range("A:A")) > 1 Then
With Sheets("DB").Range("A1").CurrentRegion
'日付をコピー
.Resize(.Rows.Count - 1, 1).Offset(1, 0).Copy Sheets("検索").Range("A6")
'売上をコピー
.Resize(.Rows.Count - 1, 1).Offset(1, 3).Copy Sheets("検索").Range("B6")
End With
End If
'フィルタを解除
Sheets("DB").Range("A1").AutoFilter
End Sub