何年何月まで、何年何月以降のように日付の前後を判定することがあります。日付が大量に入力されている場合、日付の前後関係を判定するのを目視で行うのは大変危険です。Excelの演算によって判定を行うべきです。
日付の前後を判定するにはまず、日付のシリアル値について理解する必要があります。Excelで「1」と入力すれば1日=24時間を表し、1900年以降の日付は全て整数で管理されています。そのため、日付の前後関係はシリアル値の大小関係に置き換えることが可能です。
そこで今回は、改めて日付のシリアル値について簡単に復習したうえで、何日以降、何日以前の判定や比較演算、最近の日付、最古の日付の求め方について出題します。
目次
- 1.シリアル値の復習をしよう
- 2.以降は以上と同じ、以前は以下と同じ
- 3.年月だけの場合
- 4.時刻が含まれることがあることに注意せよ
- 5.日付の比較演算のまとめ
- 6.最新の日付はMAX、最古の日付はMIN
- 7.期間で制限する
- 8.特定の種類に限定した最近の日付
1.シリアル値の復習をしよう
日付のシリアル値については別の記事で詳しく解説しています(参考:【Excel】日付の「シリアル値」を本気で理解するには何を練習するべきか?)。Excelでは1900年1月1日から順に連番で管理され、1900年1月1日からの経過日数(シリアル値)で日付を計算します。日付を年月日で入力したら、自動的に右揃えになるのは数値扱いだからです。
表示形式を標準にすると、シリアル値が表示されます。
表示形式を日付にすると日付の表示になりますが、内部的には整数のシリアル値が保存されています。
1を足せば翌日の日付になり、1を引けば前日の日付になるのも、内部的にシリアル値を足し引きしているからです。
2.以降は以上と同じ、以前は以下と同じ
(1)以降の判定
問題
A列に入力した日付について、2019年5月1日以降の日付であればTRUE、それ以外をFALSEと表示しなさい。ちなみに、2019年5月1日以降の日付とは「令和」のことです。
解説
前述のようにシリアル値は1900年1月1日からの経過日数なので、日数が経過するとシリアル値が大きくなります。したがって、2019年5月1日より後の日付は、2019年5月1日のシリアル値(43586)より大きいです。
Excelでは、日付が入力されているセルはシリアル値=数値が入力されているのと同じなので、等号や不等号で直接比較することが可能です(参考:【Excel】IF関数が使えない原因は「比較演算」の練習不足である)。DATE関数で2019年5月1日以上とすればよいです。なお、「以降」なのでイコールが必要です。
- =A2>=DATE(2019,5,1)
*補足*
「以降」のように「以」という漢字が使われる場合はその日を「含む」ことを表しますのでイコールが必要です。5月1日以降は5月1日も当然含みます。ただし、残念ながら「以=含む」を知らない日本人も多いので、実際には念のため確認しておくか「5月1日から~」のように起算日であることが分かるようにしたほうが良いです。
別解その1
DATE関数を使わずに「2019/5/1」としてもかまいませんが、スラッシュが割り算と解釈されるのを防ぐため、日付の前後にはダブルクォーテーションが必要です。さらにシリアル値にするため数値化が必要です(参考:【Excel】日付を表す文字列に「1」を掛けるだけでシリアル値に変換できる)。
- =A2>="2019/5/1"*1
別解その2
日付の数値化は前後に四則演算があればいいので、移項して引き算にすれば数値化の演算は不要です。
- =A2-"2019/5/1">=0
別解その3
2019/5/1のシリアル値43586と比較しても構いません。
- =A2>=43586
*補足*
TRUE/FALSEが返ってくるということは、IF関数、COUNTIF・SUMIFなどの条件付き関数、条件付き書式、フラグ、ユーザー定義表示形式などが使えるということです。全部説明するとキリがないのですが、TRUE/FALSEが表示できることがすべての基本なのです。
(2)以前の判定
問題
A列に入力した日付について、2019年9月30日以前の日付であれば〇と表示しなさい。ちなみに、2019年9月30日以前とは消費税が10%になる前のことです。
解説
前述のようにシリアル値は1900年1月1日からの経過日数なので、過去にさかのぼるとシリアル値が小さくなります。したがって、2019年9月30日より前の日付は、2019年9月30日のシリアル値(43738)より小さいです。
DATE関数で2019年9月30日以下とすればよいです。なお、「以前」なのでイコールが必要です。なお、「以前」の判定について、正確には時刻のシリアル値に注意する必要があります(詳しくは後述)。
- =A2<=DATE(2019,9,30)
このTRUE/FALSEの表示を、別の表示にするにはIF関数を使います。
- =IF(A2<=DATE(2019,9,30),"〇","")
別解
DATE関数を使わずに「2019/5/1」としてもかまいません。
- =IF(A2<="2019/9/30"*1,"〇","")
また、移項して引き算にすれば数値化の演算は不要です。
- =IF(A2-"2019/9/30"<=0,"〇","")
(3)イコールを使わない場合
問題
A列に入力した日付について、2020年3月1日より前の日付をTRUE、それ以外をFALSEと表示しなさい。
解説
3月1日より前といえば、日本語では3月1日を含みません。「より前」の場合、イコールは不要です。
- =A2<DATE(2020,3,1)
*補足*
「より前」「より後」のように「以」という漢字がない場合はその日を「含まない」ことを表しますのでイコールは不要です。ただし、最近は、あいまいに使われていることが多いので、実際には念のため確認しておくか、「3月1日の前日まで」のように明確に含まないことを表したほうが良いです。
3.年月だけの場合
(1)月末または月初と比較する
問題
A列に入力した日付について、2020年3月までの日付をTRUE、それ以外をFALSEと表示しなさい。
解説
「2020年3月まで」は2020年3月も含まれ、その月末である3月31日までのことです。このように年月だけの判定の場合、日にちまで考えて比較をします。それは年・月・日の3つがないとシリアル値(1900年1月1日からの経過日数)が分からないからです。
- =A2<=DATE(2020,3,31)
これは2020年4月1日と比較して、それより前のことです。
- =A2<DATE(2020,4,1)
これら2つの式は同じ意味のように見えますが、実際には異なります。正確には後者の式のほうが正しいです(詳しくは後述)。
(2)年始と比較する
問題
A列に入力した日付について、2000年以降の日付を〇と表示しなさい。
解説
2000年以降ということは2000年1月1日以降ということです。「1月1日」を補って考えます。
- =IF(A2>=DATE(2000,1,1),"〇","")
4.時刻が含まれることがあることに注意せよ
(1)小数のシリアル値
問題
A列に入力した日付について、2020年3月までの日付がTRUEとなるように数式を入力したところ、2020年3月31日がFALSEになってしまった。このようになる原因を述べたうえで、正しい数式に修正しなさい。
解説
2020年3月31日までを表すには通常、3月31日以下という数式を入力します。
- =A2<=DATE(2020,3,31)
ここで、表示形式を日付と時刻にすると、時刻が含まれていることが分かります。
表示形式を標準にすると小数になります。
整数部分の43921は2020年3月31日のシリアル値であり、小数部分の0.75は18時を表します。
Excelで「1」と入力すると1日=24時間を表し、24時間より少ない時間は1未満の小数で表します(参考:【Excel】時刻のシリアル値と時間計算の基本を理解するための練習問題)。
日付だけ入力すると小数部分が無いため、午前0時を表します。
2020年3月31日午前0時と18時では、小数部分の分だけ18時のほうが大きいです。
いっぱんに日付のシリアル値は、それぞれの日付の午前0時を表すため、入力された日付に時刻が含まれている場合、その日の24時間分の判定が狂うことがあるのです。
3月31日以下ではなく、4月1日未満とするのが正しいです。
したがって、「2020年3月まで」とは「2020年4月1日午前0時時点より前」という意味なので、正確には4月1日未満としなければなりません。
- =A2<DATE(2020,4,1)
(2)午前0時を考えて正確に判定しよう
問題
さきほどの問題をふまえて、A列に入力した日付について「2020年1月1日から」の判定をしなさい。また、「2020年12月31日まで」の判定をしなさい。
解説
「2020年から」とは、正確には2020年1月1日の午前0時を含み、それ以降という意味です。
したがって、当日のシリアル値で比較してイコールをつけるのが正しいです。
- =A2>=DATE(2020,1,1)
これを前日の12月31日午前0時と比較してしまうと、同日0時1分~23時59分が判定できないので誤りです。
逆に、「2020年まで」とは、正確には2021年1月1日午前0時を含まず、午前0時になる前という意味です。
「1月1日未満」が正しいです。
- =A2<DATE(2021,1,1)
これを12月31日午前0時と比較してしまうと、同日0時1分~23時59分が判定できないので誤りです。
5.日付の比較演算のまとめ
「~以降」「~から」の場合は、基準日の午前0時を含んでそれ以降という意味なので、基準日以上という式で良いです。
- くらべる日付>=基準となる日付
「~以前」「~まで」という場合、基準日の翌日午前0時になる前という意味なので、基準日の翌日未満という式にしなければなりませんので、注意が必要です。
- くらべる日付<基準となる日付+1
6.最新の日付はMAX、最古の日付はMIN
問題
A列に入力した日付の中で最も新しい日付(最近の日付)を求めなさい。また、最も古い日付(過去の日付)を求めなさい。
解説
シリアル値は1900年1月1日以降の経過日数であり、最も新しい日付のシリアル値は最も大きくなります。最大値を求めるのはMAX関数ですが、この関数を日付で使用することも可能です(参考:【Excel関数】最大値MAXと最小値MINの差、最高最低を除いた合計の求め方)。
- =MAX(A:A)
また、最小値を求めるのはMIN関数ですが、日付で用いるともっともシリアル値の小さい日付、つまり最も古い日付を求めることができます。
- =MIN(A:A)
*補足*
2番目に最近、3番目に古いといった場合はそれぞれ、LARGE関数、SMALL関数が使えます。
7.期間で制限する
(1)下限はMAX、上限はMIN
問題
A列に入力した日付の中で、2020年より前の日付をすべて「2020/1/1」としなさい。また、2021年以降の日付をすべて「2020/12/31」としなさい。
解説
数値の場合、下限を設定するときはMAX関数、上限を設定するときはMIN関数を使うのが基本です(参考:【Excel関数】最大なのに下限のMAX、最小なのに上限のMIN)。このことは日付のシリアル値でも使えます。例えば、2020年より前の日付をすべて2020年1月1日と繰り上げる場合、MAXを用いて2020/1/1との最大値を求めればよいです。
- =MAX(A1,"2020/1/1")
なお、MAX関数の引数として入力した日付文字列は自動的に数値化され、シリアル値が入力されたものと解釈されるため、ダブルクォーテーションは必要ですが、数値化する必要はありません。
2021年以降の日付をすべて2020/12/31と繰り下げる場合、MIN関数で最小値を求めます。
- =MIN(A1,"2020/12/31")
(2)期間内に収まるようにする
問題
A列に入力した日付の中で、2020年より前の日付を「2020/1/1」に、2021年以降の日付をすべて「2020/12/31」とすることによって、すべて2020年の日付にしなさい。
解説
上限と下限を同時に適用する場合は、MINとMAXを両方使います(参考:【Excel関数】最大なのに下限のMAX、最小なのに上限のMIN)。
- =MIN(MAX(A1,"2020/1/1"),"2020/12/31")
8.特定の種類に限定した最近の日付
問題
商品名が「カレー」になっている行のなかで、最近の日付(最も新しい日付)を求めなさい。
解説
日付も数値の一種なので比較演算をすることが可能です(参考:【Excel】IF関数が使えない原因は「比較演算」の練習不足である)。「A列=カレー」を掛けることによって、カレー以外の日付が0になります(日付の表示形式なので1900/1/0になる)。
- =B2*(A2="カレー")
これを利用して、MAX関数を用いて最近の日付を求めることができます。
- =MAX(INDEX(B2:B10*(A2:A10="カレー"),))
*補足*なお、MAXIF関数を用いる方法等もありますが、使用できるExcelのバージョンが限られるため解説を省略します。
別解
種類別の最大値はピボットテーブルで求めることも可能です(参考:【Excel】ピボットテーブル集計の練習問題サンプルデータ動画解説付き)。
解説は以上です。