VBAで「過去◯日以内のデータだけ表示する」には、今日の日付から日数を引いた基準日を作り、それより古い行を非表示にするだけで実現できます。行を削除せず非表示にするため、元データを保持したまま必要な期間のデータだけを素早く確認できます。
この記事では、次の内容を順番に解説します。
- 日付条件で行を非表示にする基本コード
- 日数を入力ボックスで指定できる応用パターン
- 特定の期間(開始日〜終了日)でフィルタリングする方法
- 非表示ではなく別シートに抽出する方法
過去◯日以内のデータだけを表示するには?
Date 関数で今日の日付を取得し、そこから日数を引いて「基準日」を計算します。A列の日付が基準日より古い行は Hidden = True で非表示に、基準日以降の行は Hidden = False で表示にします。
Sub ShowRecentData()
Dim ws As Worksheet
Dim i As Long
Dim limitDate As Date
Set ws = ActiveSheet
'基準日を計算(今日から7日前)
limitDate = Date - 7
'2行目からデータ最終行まで処理
For i = 2 To ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
If ws.Cells(i, 1).Value < limitDate Then
ws.Rows(i).Hidden = True '基準日より古い行は非表示
Else
ws.Rows(i).Hidden = False '基準日以降の行は表示
End If
Next i
MsgBox "過去7日以内のデータだけを表示しました。"
End Sub
日数を変えたい場合は Date - 7 の数値を変えるだけです。
| 表示したい期間 | limitDateの計算式 |
|---|---|
| 今日のデータだけ | limitDate = Date |
| 過去7日以内 | limitDate = Date - 7 |
| 過去30日以内 | limitDate = Date - 30 |
| 今月1日以降 | limitDate = DateSerial(Year(Date), Month(Date), 1) |
| 今年1月1日以降 | limitDate = DateSerial(Year(Date), 1, 1) |
日数を実行時に入力して指定するには?
「7日」「30日」と固定するのではなく、実行のたびにユーザーが日数を入力できるようにする方法です。InputBox で日数を受け取り、数値として使います。
Sub ShowRecentByInput()
Dim ws As Worksheet
Dim i As Long
Dim limitDate As Date
Dim days As Variant
'日数をユーザーに入力してもらう
days = InputBox("何日以内のデータを表示しますか?(例:7、30)", "表示日数の入力")
'入力キャンセルまたは数値以外の場合は中止
If days = "" Or Not IsNumeric(days) Then
MsgBox "数値を入力してください。", vbExclamation
Exit Sub
End If
Set ws = ActiveSheet
limitDate = Date - CLng(days)
For i = 2 To ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
If ws.Cells(i, 1).Value < limitDate Then
ws.Rows(i).Hidden = True
Else
ws.Rows(i).Hidden = False
End If
Next i
MsgBox "過去" & days & "日以内のデータだけを表示しました。"
End Sub
開始日〜終了日の期間でフィルタリングするには?
「◯日以内」ではなく「2026/04/01〜2026/04/15」のように期間を指定したい場合は、開始日・終了日の両方を条件にします。
Sub ShowDataByPeriod()
Dim ws As Worksheet
Dim i As Long
Dim startDate As Date
Dim endDate As Date
Dim cellDate As Variant
Set ws = ActiveSheet
'開始日と終了日を入力
Dim startStr As String
Dim endStr As String
startStr = InputBox("開始日を入力してください(例:2026/04/01)")
endStr = InputBox("終了日を入力してください(例:2026/04/30)")
If Not IsDate(startStr) Or Not IsDate(endStr) Then
MsgBox "正しい日付形式で入力してください。", vbExclamation
Exit Sub
End If
startDate = CDate(startStr)
endDate = CDate(endStr)
For i = 2 To ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
cellDate = ws.Cells(i, 1).Value
If IsDate(cellDate) Then
If CDate(cellDate) >= startDate And CDate(cellDate) <= endDate Then
ws.Rows(i).Hidden = False
Else
ws.Rows(i).Hidden = True
End If
End If
Next i
MsgBox startStr & " 〜 " & endStr & " のデータを表示しました。"
End Sub
非表示ではなく別シートに抽出するには?
元データを非表示にするのではなく、条件に合う行だけを別のシートに抽出してコピーする方法です。元データを一切変更しないため、より安全な運用ができます。
Sub ExtractRecentToSheet()
Dim wsSrc As Worksheet '元データのシート
Dim wsDst As Worksheet '抽出先のシート
Dim i As Long
Dim dstRow As Long
Dim limitDate As Date
Set wsSrc = Worksheets("データ")
'抽出先シートを準備(なければ作成)
On Error Resume Next
Set wsDst = Worksheets("抽出結果")
On Error GoTo 0
If wsDst Is Nothing Then
Set wsDst = Worksheets.Add(After:=Worksheets(Worksheets.Count))
wsDst.Name = "抽出結果"
End If
'抽出先をクリア
wsDst.Cells.ClearContents
'見出し行をコピー
wsSrc.Rows(1).Copy wsDst.Rows(1)
limitDate = Date - 30
dstRow = 2
For i = 2 To wsSrc.Cells(wsSrc.Rows.Count, 1).End(xlUp).Row
If IsDate(wsSrc.Cells(i, 1).Value) Then
If CDate(wsSrc.Cells(i, 1).Value) >= limitDate Then
wsSrc.Rows(i).Copy wsDst.Rows(dstRow)
dstRow = dstRow + 1
End If
End If
Next i
MsgBox dstRow - 2 & " 件を「抽出結果」シートに書き出しました。"
End Sub
まとめ
Date - 日数で基準日を計算し、それより古い行をHidden = Trueにするのが基本パターンHidden = True/Falseを使うと元データを残したまま表示を切り替えられるInputBoxで日数を入力させると、毎回コードを変更せず柔軟に使えるマクロになる- 開始日・終了日の両方を指定したい場合は
And条件で範囲を絞る - 元データを変更したくない場合は、条件に合う行を 別シートにコピーして抽出する方法が安全
よくある質問
非表示にした行を元に戻すにはどうすればいいですか?
全行を再表示するマクロを別途用意しておくと便利です。ws.Rows.Hidden = False で全行を一括表示に戻せます。または、この記事のマクロをもう一度実行するだけでも、Hidden = False の処理が走るため表示されます。
日付の形式が「2026年4月16日」の場合でも動きますか?
セルの値が日付型(シリアル値)として保存されていれば、表示形式に関わらず動作します。ただしセルの値が文字列として入力されている場合(例:テキストとして「2026/04/16」と入力)は IsDate による判定が必要です。日付型かどうかは TypeName(ws.Cells(i,1).Value) で確認できます。
A列以外の列に日付がある場合はどうすればいいですか?
ws.Cells(i, 1).Value の 1 を対象の列番号に変えてください。例えばC列なら ws.Cells(i, 3).Value です。列番号をConstで定数にしておくと、後から変更しやすくなります。
空白行がある場合に処理が止まってしまいます
空白セルは IsDate でFalseになるため、日付チェックの前に If ws.Cells(i, 1).Value = "" Then GoTo NextRow のように空欄をスキップする処理を加えると安定します。
オートフィルターと組み合わせることはできますか?
できます。行を非表示にする方法の代わりに、AutoFilter で日付列に条件を設定する方法も有効です。ws.Range("A1").AutoFilter Field:=1, Criteria1:=">=" & CLng(limitDate), Operator:=xlAnd のように書くと、オートフィルターで期間絞り込みができます。
動画で学びたい方へ
「記事を読んでも、実際に自分で書けるか不安…」という方には、動画で基礎からじっくり学べる講座がおすすめです。
VBAが初めての方を前提に、つまずきやすいポイントを先回りして解説しています。サンプル動画は無料でご覧いただけます。



