VBAで過去◯日以内のデータだけ表示する方法|Date関数・Hidden・InputBoxで日数指定

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).Value1 を対象の列番号に変えてください。例えば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が初めての方を前提に、つまずきやすいポイントを先回りして解説しています。サンプル動画は無料でご覧いただけます。

動画で学ぶExcelマクロ|JIMOVEオンラインスクール

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

上部へスクロール