Excel 日々増えるデータから「直近1週間分」だけを抜き出す方法

Excel 日々増えるデータから「直近1週間分」だけを抜き出す方法 Excel

はじめに:ブログのPV、最新の1週間分だけ見たい!

毎日記録しているブログのPV数や、売上データ。

「全体の推移も大事だけど、とりあえず直近1週間の動きだけパッと見たいんだよね」ということ、ありませんか?

Excelの説明画像

データは毎日増えていきます。
いちいち範囲選択し直すのは面倒です。

自動的に「一番下のデータから7つ分」を抜き出して表示してくれたら便利ですよね。

今回のテーマは、「直近7日間のデータを動的に表示する方法」です!

しかし、ただ抜き出すだけではありません。

今回はあえて「データ途中にエラー値(#N/Aなど)が含まれている場合」も想定します。

Excelの説明画像

外部データの取り込みミスなどで、予期せぬエラーが混ざることはよくあります。

そんな時、数式全体がエラーになって止まってしまうのか、それともエラーはエラーとして「ありのまま」表示してくれるのか。

この違いを理解することで、あなたのExcel力は格段にレベルアップしますよ!

※エラー値については、Excelエラー9選!わざとエラーを出して原因と意味を学ぼうにて、詳しく解説しています!

本記事では、無料のWeb版Excelを使用して検証および画像の作成を行っています。Windowsはもちろん、MacやLinuxの方もブラウザさえあれば挑戦できます!

準備:データと状況設定

まずは準備です。

A1セルを起点に、以下のようなPV数管理表を作成してください。

また、A2:A21の範囲は、表示形式で日付形式に変更します。

={"日付","PV数";45962,263;45963,205;45964,141;45965,165;45966,248;45967,259;45968,273;45969,243;45970,175;45971,158;45972,173;45973,137;45974,197;45975,249;45976,139;45977,;45978,;45979,;45980,;45981,}

Excelの説明画像

【データの状態】
・A列の日付はシリアル値(45962=2025/11/1)です。
・データは毎日追記されますが、現在は15日(B16セル)まで入力されています。
・16日以降(B17~)はまだ空白です。

【今回のゴール】
任意のセルに数式を一つ入れるだけで、B列のデータがある最後の行から遡って、7日分のデータをスピル表示させること!

もし16日にデータを入力したら、表示範囲が1日ずれて、常に最新7日間が表示されるようにします。

【※重要:本記事の前提】
今回のミッションは「直近7日分のデータを返す」ことですが、「最も新しいデータ(最終行)がエラー値の場合」は考慮していません。
もし最終行がエラーだと、数式によってはそれを無視して「一つ前の数値」を最新として拾ってしまう可能性があります。
今回はロジックの理解を最優先としており、そこまで厳密なエラー処理を入れると数式が非常に長くなってしまうため、あえて省略しています。「もし最終行がエラーだったら?」という応用問題には、ぜひ記事を読んだ後に挑戦してみてください!


アプローチ1:FILTERで絞り、TAKEで取り出す(最新・最速)

まずは、最新の関数を使った最もスマートな方法から。

数式と解説

=TAKE(FILTER(B:B,B:B<>"",""),-7)

1. FILTER(B:B, B:B<>"", ""): B列の中から「空白ではない」データだけを抽出します。

2. TAKE(..., -7): 抽出したデータの下から(マイナス指定)、7個分だけを取り出します。

Excelの説明画像

非常にシンプルで分かりやすいですね!正常なデータならこれで完璧です。

【検証】エラーを入れてみよう

では、B14セル(13日目)にわざとエラー =NA() を入力してみましょう。
どうなりましたか?

Excelの説明画像

なんと、全滅してしまいました!

理由は FILTER 関数にあります。

条件式の B:B<>"" を判定する際、範囲内に一つでもエラー値があると、比較演算自体がエラーを返し、それがFILTER全体に波及してしまうのです。

Excelの説明画像

綺麗なデータなら最強ですが、エラーには少し弱い。

それがこの数式の弱点です。


アプローチ2:INDIRECT(文字で範囲を作る)

次は、「B10」や「B16」といったセル番地を文字で作って参照する方法です。

数式と解説

=INDIRECT("b"&MAX((B:B<>"")*ROW(B:B)-6)) : INDIRECT("b"&MAX((B:B<>"")*ROW(B:B)))

1. MAX((B:B<>"")*ROW(B:B)): 空白じゃない行の行番号の最大値(=最終行)を求めます。

Excelの説明画像

2.INDIRECT("b" & 最終行から6行上):文字列 “b10” を、実際のセル参照 B10 に変換します。

3. INDIRECT("b" & 最終行): 文字列 “b16” を、実際のセル参照 B16 に変換します。

Excelの説明画像

4.セル参照 B10B16をコロンで繋ぎ合わせます。

Excelの説明画像

ポイント:参照演算子「:」

この数式の面白いところは、INDIRECT(...):INDIRECT(...) とコロンで繋いでいる点です。

通常、コロンは A1:B2 のようにセル番地の間に入れて範囲を作りますが、このように「参照を返す関数」同士を繋ぐことでも、範囲を作ることができるのです!

もちろん、INDIRECT関数1つでもできます。

"b10:b16"という文字列を作って、INDIRECT関数に渡せばOKです。

=INDIRECT("b"&MAX((B:B<>"")*ROW(B:B)-6)&":"&"b"&MAX((B:B<>"")*ROW(B:B)))

残念ながら、これもエラーには弱いです。

理由はアプローチ1と同じ。

(B:B<>"") の判定部分でエラーが起きると、MAX関数が計算できなくなってしまうからです。

Excelの説明画像

アプローチ3:基本に忠実 OFFSET & COUNTA

「あるセルを基準に、○個下、○個右の範囲を取得する」という、範囲操作のスペシャリスト、OFFSET関数の出番です。

数式と解説

=OFFSET(B1,COUNTA(B:B)-1,0,-7)

1. COUNTA(B:B): データの個数を数えます。(エラー値も「1個」として数えてくれます!ここが重要!)

Excelの説明画像

2. OFFSET(B1, 個数-1, 0, -7):
 ・B1からスタートし、
 ・個数-1 だけ下に移動し(これで最終行にたどり着く)、
 ・0 列右に移動し(そのまま)、
 ・高さ -7 (つまり、そこから上に7個分)の範囲を取得します。

Excelの説明画像

COUNT関数だとエラー値を数えてくれないので位置がズレますが、COUNTAならエラーがあっても個数としてカウントするため、正しく位置を特定できます。

Excelの説明画像

結果、エラー値が含まれていても、「ありのまま」表示してくれます!


アプローチ4, 5:OFFSET + MATCH (最強の検索)

データの個数を数えるのではなく、「一番下にある数値の位置」を検索して起点にする方法です。

数式と解説

パターンA:INDEX版
=OFFSET(INDEX(B:B,MATCH(10^10,B:B)),,,-7)

パターンB:INDIRECT版
=OFFSET(INDIRECT("B"&MATCH(10^10,B:B)),,,-7)

1. MATCH(10^10, B:B): 10^10(100億)という巨大な数値を検索値にして、近似一致で検索します。

MATCH関数の近似一致は、途中にエラーがあっても無視して、一番最後の数値を特定できるという非常にタフな性質を持っています。

これにより、最終行の位置(16行目)が確実に取得できます。

Excelの説明画像

【注意点:最後がエラーだったら?】
MATCH関数の「エラーを無視する」という性質は、裏を返せば「一番最後のデータがエラーだった場合、それも無視してしまう」ということです。
もし今日のデータがエラーだった場合、MATCH関数はそれをスルーして「昨日(一つ前)の数値」を最新として拾ってしまいます。今回は数式をシンプルにするため、この「最終行エラー問題」の処理は省略していますが、実務で使う際は注意が必要です。

2. INDEX(B:B, 16) または INDIRECT("B16"): その位置のセルを参照します。

3. OFFSET(..., , , -7): そのセルを基準に、高さ-7(上方向へ7つ)の範囲を取得します。

Excelの説明画像

これなら、途中にエラーがあっても止まることなく、確実に「最後の数値から7つ分」を取得できます。


アプローチ6:INDIRECT + MATCH

OFFSETを使わず、INDIRECTだけで範囲を作ることもできます。

数式と解説

=INDIRECT("b"&MATCH(10^10,B:B)-6):INDIRECT("b"&MATCH(10^10,B:B))

MATCHで特定した「16」という数字を使って、「B10」から「B16」までの範囲を文字で作る方法です。

INDIRECT("B10"):INDIRECT("B16") という形になり、これもエラーに強く、正しく動作します。

Excelの説明画像

重要:「揮発性関数」に注意!

ここまで紹介した OFFSETINDIRECT には、一つ注意点があります。
これらは「揮発性関数」と呼ばれています。

普通の関数は、関係するセルの値が変わった時だけ再計算されます。

しかし、揮発性関数は、シート上のどこかのセルが変更されるたびに、自分とは無関係でも毎回再計算を行います。

NOW()RAND()も仲間です。

そのため、これらの関数を何千個も使うと、Excelの動作が重くなる原因になります。

ここぞという時に使いましょう。


アプローチ7:INDEX & MATCH のみ (非揮発性の最適解)

最後に紹介するのは、揮発性関数を使わず、かつエラーにも強い、プロ好みの方法です。

数式と解説

=INDEX(B:B,MATCH(10^10,B:B)-6):INDEX(B:B,MATCH(10^10,B:B))

「えっ、INDEX関数って『値』を返すんじゃないの?」

そう思ったあなた、鋭いです!

普通、INDEX(B:B, 16) は B16セルの値「139」を返します。

Excelの説明画像

しかし、INDEX関数をコロン「:」で繋ぐと、Excelはそれを「セル参照(場所)」として扱ってくれるのです!

つまり、この数式は内部で
B10 : B16
という「範囲参照」に変身しています。

Excelの説明画像

Excel初心者が最初に覚える「INDEX & MATCH」のコンビですが、こんなトリッキーな使い方もできるなんて、奥が深いですよね!

実務で「直近○日」を出すなら、この方法が最も堅牢でオススメです。

INDEX & MATCHの基本的な使い方は、XLOOKUPが苦手なコト、INDEX & MATCHなら余裕!にて紹介しています!

まとめ:エラーと付き合うテクニック

綺麗なデータならFILTERTAKEが簡単ですが、エラーが混ざる現場のデータでは、MATCH関数の近似一致や、INDEX:INDEXの参照テクニックが火を吹きます。

「関数がエラーで止まった!」と慌てず、「お、エラーを含んで表示してやるぞ」くらいの気持ちで、これらの数式を使いこなしてみてくださいね!

タイトルとURLをコピーしました